All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gravity9.mongocse.ChangeStreamIterableFactory Maven / Gradle / Ivy

package com.gravity9.mongocse;

import com.mongodb.client.ChangeStreamIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Aggregates;
import org.bson.BsonValue;
import org.bson.Document;
import org.bson.conversions.Bson;

import java.util.List;

import static com.gravity9.mongocse.MongoExpressions.abs;
import static com.gravity9.mongocse.MongoExpressions.and;
import static com.gravity9.mongocse.MongoExpressions.cond;
import static com.gravity9.mongocse.MongoExpressions.documentKey;
import static com.gravity9.mongocse.MongoExpressions.eq;
import static com.gravity9.mongocse.MongoExpressions.expr;
import static com.gravity9.mongocse.MongoExpressions.fullDocumentKey;
import static com.gravity9.mongocse.MongoExpressions.mod;
import static com.gravity9.mongocse.MongoExpressions.or;
import static com.gravity9.mongocse.MongoExpressions.toHashedIndexKey;
import static java.util.concurrent.TimeUnit.MILLISECONDS;

class ChangeStreamIterableFactory {

    private static final String NULL_STRING = "null";

    static ChangeStreamIterable createWatch(MongoConfig mongoConfig, MongoCollection collection, int partition) {
        return collection.watch(List.of(
                        Aggregates.match(
                          and(List.of(
                            mongoConfig.getMatch(),
                            or(List.of(
                              partitionMatchExpression(fullDocumentKey(mongoConfig.getKeyName()), mongoConfig.getNumberOfPartitions(), partition),
                              partitionMatchExpression(documentKey(mongoConfig.getKeyName()), mongoConfig.getNumberOfPartitions(), partition)
                            ))
                          ))
                        )
                ))
                .fullDocument(mongoConfig.getFullDocument())
                .fullDocumentBeforeChange(mongoConfig.getFullDocumentBeforeChange())
                .maxAwaitTime(mongoConfig.getMaxAwaitTimeInMs(), MILLISECONDS);
    }

    private static Bson partitionMatchExpression(BsonValue documentKey, int partitionNumbers, int partitionNo) {
        return expr(eq(cond(documentKey, mod(abs(toHashedIndexKey(documentKey)), partitionNumbers), NULL_STRING), partitionNo));
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy