MixedBulkWriteOperation replaceOne(final Bson filter, final TDocument replacement, final ReplaceOptions options) { return bulkWrite(singletonList(new ReplaceOneModel<TDocument>(filter, replacement, options)), new BulkWriteOptions().bypassDocumentValidation(options.getBypassDocumentValidation())); }
} else if (writeModel instanceof ReplaceOneModel) { ReplaceOneModel<TDocument> replaceOneModel = (ReplaceOneModel<TDocument>) writeModel; writeRequest = new UpdateRequest(toBsonDocument(replaceOneModel.getFilter()), documentToBsonDocument(replaceOneModel .getReplacement()), WriteRequest.Type.REPLACE) .upsert(replaceOneModel.getReplaceOptions().isUpsert()) .collation(replaceOneModel.getReplaceOptions().getCollation()); } else if (writeModel instanceof UpdateOneModel) { UpdateOneModel<TDocument> updateOneModel = (UpdateOneModel<TDocument>) writeModel;
(ReplaceOneModel<BsonDocument>) result; assertTrue(writeModel.getReplacement().isObjectId(DBCollection.ID_FIELD_NAME), () -> "replacement doc must contain _id field of type ObjectID"); writeModel.getReplacement().get(DBCollection.ID_FIELD_NAME,new BsonObjectId())); assertEquals(replacementDoc,writeModel.getReplacement(), ()-> "replacement doc not matching what is expected"); assertTrue(writeModel.getFilter() instanceof BsonDocument, () -> "filter expected to be of type BsonDocument"); assertTrue(((BsonDocument)writeModel.getFilter()).isObjectId(DBCollection.ID_FIELD_NAME), () -> "filter doc must contain _id field of type ObjectID"); ((BsonDocument)writeModel.getFilter()).get(DBCollection.ID_FIELD_NAME,new BsonObjectId())); assertEquals(filterDoc,writeModel.getFilter()); assertTrue(writeModel.getOptions().isUpsert(), () -> "replacement expected to be done in upsert mode");
@Test @DisplayName("when valid doc replace cdc event then correct ReplaceOneModel") public void testValidSinkDocumentForReplacement() { BsonDocument keyDoc = new BsonDocument("id",new BsonString("1004")); BsonDocument valueDoc = new BsonDocument("op",new BsonString("u")) .append("patch",new BsonString(REPLACEMENT_DOC.toJson())); WriteModel<BsonDocument> result = MONGODB_UPDATE.perform(new SinkDocument(keyDoc,valueDoc)); assertTrue(result instanceof ReplaceOneModel, () -> "result expected to be of type ReplaceOneModel"); ReplaceOneModel<BsonDocument> writeModel = (ReplaceOneModel<BsonDocument>) result; assertEquals(REPLACEMENT_DOC,writeModel.getReplacement(), ()-> "replacement doc not matching what is expected"); assertTrue(writeModel.getFilter() instanceof BsonDocument, () -> "filter expected to be of type BsonDocument"); assertEquals(FILTER_DOC,writeModel.getFilter()); assertTrue(writeModel.getOptions().isUpsert(), () -> "replacement expected to be done in upsert mode"); }
public void saveTags(@Nonnull Iterable<Tag> tags) { writeLock.lock(); try { checkNotNull(tags); Spliterator<Tag> spliterator = tags.spliterator(); List<WriteModel<Document>> updates = stream(spliterator, false) .map(tag -> new ReplaceOneModel<>( toFilter(tag), toDocument(tag), upsert() )) .collect(toList()); BulkWriteResult bulkWriteResult = getCollection().bulkWrite(updates); } finally { writeLock.unlock(); } }
@Test @DisplayName("when valid cdc event then correct ReplaceOneModel") public void testValidSinkDocument() { BsonDocument keyDoc = new BsonDocument("id",new BsonString("1004")); BsonDocument valueDoc = new BsonDocument("op",new BsonString("c")) .append("after",new BsonString(REPLACEMENT_DOC.toJson())); WriteModel<BsonDocument> result = MONGODB_INSERT.perform(new SinkDocument(keyDoc,valueDoc)); assertTrue(result instanceof ReplaceOneModel, () -> "result expected to be of type ReplaceOneModel"); ReplaceOneModel<BsonDocument> writeModel = (ReplaceOneModel<BsonDocument>) result; assertEquals(REPLACEMENT_DOC,writeModel.getReplacement(), ()-> "replacement doc not matching what is expected"); assertTrue(writeModel.getFilter() instanceof BsonDocument, () -> "filter expected to be of type BsonDocument"); assertEquals(FILTER_DOC,writeModel.getFilter()); assertTrue(writeModel.getOptions().isUpsert(), () -> "replacement expected to be done in upsert mode"); }
} else if (writeModel instanceof ReplaceOneModel) { ReplaceOneModel<TDocument> replaceOneModel = (ReplaceOneModel<TDocument>) writeModel; writeRequest = new UpdateRequest(toBsonDocument(replaceOneModel.getFilter()), documentToBsonDocument(replaceOneModel .getReplacement()), WriteRequest.Type.REPLACE) .upsert(replaceOneModel.getReplaceOptions().isUpsert()) .collation(replaceOneModel.getReplaceOptions().getCollation()); } else if (writeModel instanceof UpdateOneModel) { UpdateOneModel<TDocument> updateOneModel = (UpdateOneModel<TDocument>) writeModel;
public BulkWriteResult replace(List<? extends Bson> queries, List<? extends Bson> updates, boolean upsert) { if (queries.size() != updates.size()) { throw wrongQueryUpdateSize(queries, updates); } Iterator<? extends Bson> queryIterator = queries.iterator(); Iterator<? extends Bson> updateIterator = updates.iterator(); List<WriteModel<Document>> actions = new ArrayList<>(queries.size()); UpdateOptions updateOptions = new UpdateOptions().upsert(upsert); while (queryIterator.hasNext()) { Bson query = queryIterator.next(); Bson update = updateIterator.next(); actions.add(new ReplaceOneModel<>(query, (Document) update, updateOptions)); } return dbCollection.bulkWrite(actions, new BulkWriteOptions().ordered(false)); }
@Test @DisplayName("when sink document is valid for ReplaceOneDefaultStrategy then correct ReplaceOneModel") public void testReplaceOneDefaultStrategyWithValidSinkDocument() { BsonDocument valueDoc = new BsonDocument(DBCollection.ID_FIELD_NAME,new BsonInt32(1004)) .append("first_name",new BsonString("Anne")) .append("last_name",new BsonString("Kretchmar")) .append("email",new BsonString("annek@noanswer.org")); WriteModel<BsonDocument> result = REPLACE_ONE_DEFAULT_STRATEGY.createWriteModel(new SinkDocument(null,valueDoc)); assertTrue(result instanceof ReplaceOneModel, () -> "result expected to be of type ReplaceOneModel"); ReplaceOneModel<BsonDocument> writeModel = (ReplaceOneModel<BsonDocument>) result; assertEquals(REPLACEMENT_DOC_DEFAULT,writeModel.getReplacement(), ()-> "replacement doc not matching what is expected"); assertTrue(writeModel.getFilter() instanceof BsonDocument, () -> "filter expected to be of type BsonDocument"); assertEquals(FILTER_DOC_REPLACE_DEFAULT,writeModel.getFilter()); assertTrue(writeModel.getOptions().isUpsert(), () -> "replacement expected to be done in upsert mode"); }
public void createOrUpdateBulk(final Collection<V> values, final long maxTime, final TimeUnit timeUnit) { if (values.isEmpty()) { return; } final List<ReplaceOneModel<Document>> bulkOperations = values.stream() .map(value -> new ReplaceOneModel<>( eq(ID, keyOf(value)), encode(value), BULK_UPSERT_OPERATION)) .collect(toList()); collectionWithWriteTimeout(maxTime, timeUnit) .bulkWrite(bulkOperations, BULK_WRITE_OPTIONS); }
() -> { ReplaceOneModel<BsonDocument> rom = (ReplaceOneModel<BsonDocument>)wm; assertTrue(rom.getOptions().isUpsert(), "replacement expected to be done in upsert mode"); BsonDocument filter = rom.getFilter().toBsonDocument(BsonDocument.class,null); assertEquals(1,filter.size(),"filter document should only contain "+DBCollection.ID_FIELD_NAME); assertTrue(filter.get(DBCollection.ID_FIELD_NAME).isObjectId(),"filter document _id was not of type ObjectId"); assertTrue(rom.getReplacement().get(DBCollection.ID_FIELD_NAME).isObjectId(),"replacement document _id was not of type ObjectId"); assertEquals(42,rom.getReplacement().getInt32("myValueField").getValue(),"myValueField's value mismatch");
public void createOrUpdateBulk(final Collection<V> values, final long maxTime, final TimeUnit timeUnit) { if (values.isEmpty()) { return; } final List<ReplaceOneModel<Document>> bulkOperations = values.stream() .map(value -> new ReplaceOneModel<>( eq(ID, keyOf(value)), encode(value), BULK_UPSERT_OPERATION)) .collect(toList()); collectionWithWriteTimeout(maxTime, timeUnit) .bulkWrite(bulkOperations, BULK_WRITE_OPTIONS); }
@Test @DisplayName("when sink document is valid for ReplaceOneBusinessKeyStrategy then correct ReplaceOneModel") public void testReplaceOneBusinessKeyStrategyWithValidSinkDocument() { BsonDocument valueDoc = new BsonDocument(DBCollection.ID_FIELD_NAME, new BsonDocument("first_name",new BsonString("Anne")) .append("last_name",new BsonString("Kretchmar"))) .append("first_name",new BsonString("Anne")) .append("last_name",new BsonString("Kretchmar")) .append("email",new BsonString("annek@noanswer.org")) .append("age", new BsonInt32(23)) .append("active", new BsonBoolean(true)); WriteModel<BsonDocument> result = REPLACE_ONE_BUSINESS_KEY_STRATEGY.createWriteModel(new SinkDocument(null,valueDoc)); assertTrue(result instanceof ReplaceOneModel, () -> "result expected to be of type ReplaceOneModel"); ReplaceOneModel<BsonDocument> writeModel = (ReplaceOneModel<BsonDocument>) result; assertEquals(REPLACEMENT_DOC_BUSINESS_KEY,writeModel.getReplacement(), ()-> "replacement doc not matching what is expected"); assertTrue(writeModel.getFilter() instanceof BsonDocument, () -> "filter expected to be of type BsonDocument"); assertEquals(FILTER_DOC_REPLACE_BUSINESS_KEY,writeModel.getFilter()); assertTrue(writeModel.getOptions().isUpsert(), () -> "replacement expected to be done in upsert mode"); }
MixedBulkWriteOperation replaceOne(final Bson filter, final TDocument replacement, final ReplaceOptions options) { return bulkWrite(singletonList(new ReplaceOneModel<TDocument>(filter, replacement, options)), new BulkWriteOptions().bypassDocumentValidation(options.getBypassDocumentValidation())); }
() -> { ReplaceOneModel<BsonDocument> rom = (ReplaceOneModel<BsonDocument>)wm; assertTrue(rom.getOptions().isUpsert(), "replacement expected to be done in upsert mode"); BsonDocument filter = rom.getFilter().toBsonDocument(BsonDocument.class,null); assertEquals(new BsonDocument("_id", new BsonDocument("myKeyField",new BsonString("ABCD-1234"))), new BsonDocument("myKeyField",new BsonString("ABCD-1234"))) .append("myValueField",new BsonInt32(23)), rom.getReplacement());
public void Save(Document doc) { if (!doc.containsKey("_id")) { Create(doc); return; } Document find = new Document("_id", doc.get("_id")); UpdateOptions uo = new UpdateOptions(); uo.upsert(true); ops.add(new ReplaceOneModel<Document>(find, doc, uo)); FlushOpsIfFull(); }
assertTrue(wm instanceof ReplaceOneModel); ReplaceOneModel<BsonDocument> rom = (ReplaceOneModel<BsonDocument>)wm; assertTrue(rom.getOptions().isUpsert(), "replacement expected to be done in upsert mode"); BsonDocument filter = rom.getFilter().toBsonDocument(BsonDocument.class,null); assertEquals(new BsonDocument("_id", new BsonDocument("id",new BsonInt32(i))), .append("last_name",new BsonString("van Wonderland")) .append("email",new BsonString("alice_"+i+"@wonder.land")), rom.getReplacement());
@Override public WriteModel<BsonDocument> createWriteModel(SinkDocument document) { BsonDocument vd = document.getValueDoc().orElseThrow( () -> new DataException("error: cannot build the WriteModel since" + " the value document was missing unexpectedly") ); return new ReplaceOneModel<>( new BsonDocument(DBCollection.ID_FIELD_NAME, vd.get(DBCollection.ID_FIELD_NAME)), vd, UPDATE_OPTIONS); } }
assertTrue(wm instanceof ReplaceOneModel); ReplaceOneModel<BsonDocument> rom = (ReplaceOneModel<BsonDocument>)wm; assertTrue(rom.getOptions().isUpsert(), "replacement expected to be done in upsert mode"); BsonDocument filter = rom.getFilter().toBsonDocument(BsonDocument.class,null); assertEquals(new BsonDocument("_id", new BsonDocument("id",new BsonInt32(i))), .append("last_name",new BsonString("in Wonderland")) .append("email",new BsonString("alice"+i+"@wonder.land")), rom.getReplacement());
@Override public WriteModel<BsonDocument> createWriteModel(SinkDocument document) { BsonDocument vd = document.getValueDoc().orElseThrow( () -> new DataException("error: cannot build the WriteModel since" + " the value document was missing unexpectedly") ); return new ReplaceOneModel<>( new BsonDocument(DBCollection.ID_FIELD_NAME, vd.get(DBCollection.ID_FIELD_NAME)), vd, UPDATE_OPTIONS); } }