From 100910d2ea5255d71bd3e6c37bae4d27139ff779 Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Wed, 18 Dec 2024 13:17:49 -0500 Subject: [PATCH 1/4] Allow update to supply sort option --- .../client/model/BulkWriteOptions.java | 29 +++++++++++++++++++ .../mongodb/client/model/UpdateOptions.java | 29 +++++++++++++++++++ .../mongodb/internal/bulk/UpdateRequest.java | 11 +++++++ .../connection/SplittablePayload.java | 5 ++++ .../operation/MixedBulkWriteOperation.java | 10 +++++++ .../internal/operation/Operations.java | 10 ++++--- .../client/unified/UnifiedCrudHelper.java | 3 ++ .../unified/UnifiedTestModifications.java | 4 --- 8 files changed, 93 insertions(+), 8 deletions(-) diff --git a/driver-core/src/main/com/mongodb/client/model/BulkWriteOptions.java b/driver-core/src/main/com/mongodb/client/model/BulkWriteOptions.java index 12b6c990d47..33d6c37ab04 100644 --- a/driver-core/src/main/com/mongodb/client/model/BulkWriteOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/BulkWriteOptions.java @@ -17,6 +17,7 @@ package com.mongodb.client.model; import com.mongodb.lang.Nullable; +import org.bson.BsonDocument; import org.bson.BsonString; import org.bson.BsonValue; import org.bson.conversions.Bson; @@ -31,6 +32,7 @@ public final class BulkWriteOptions { private Boolean bypassDocumentValidation; private BsonValue comment; private Bson variables; + private BsonDocument sort; /** * If true, then when a write fails, return without performing the remaining @@ -147,6 +149,32 @@ public BulkWriteOptions let(@Nullable final Bson variables) { return this; } + /** + * Gets the sort criteria to apply to the query. The default is null, which means that the documents will be returned in an undefined + * order. + * + * @return a document describing the sort criteria + * @since 5.3 + * @mongodb.driver.manual reference/method/cursor.sort/ Sort + */ + @Nullable + public BsonDocument getSort() { + return sort; + } + + /** + * Sets the sort criteria to apply to the query. + * + * @param sort the sort criteria, which may be null. + * @return this + * @since 5.3 + * @mongodb.driver.manual reference/method/cursor.sort/ Sort + */ + public BulkWriteOptions sort(@Nullable final BsonDocument sort) { + this.sort = sort; + return this; + } + @Override public String toString() { return "BulkWriteOptions{" @@ -154,6 +182,7 @@ public String toString() { + ", bypassDocumentValidation=" + bypassDocumentValidation + ", comment=" + comment + ", let=" + variables + + ", sort=" + sort + '}'; } } diff --git a/driver-core/src/main/com/mongodb/client/model/UpdateOptions.java b/driver-core/src/main/com/mongodb/client/model/UpdateOptions.java index d290610c816..56423948f1d 100644 --- a/driver-core/src/main/com/mongodb/client/model/UpdateOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/UpdateOptions.java @@ -19,6 +19,7 @@ import com.mongodb.lang.Nullable; import org.bson.BsonString; import org.bson.BsonValue; +import org.bson.BsonDocument; import org.bson.conversions.Bson; import java.util.List; @@ -40,6 +41,7 @@ public class UpdateOptions { private String hintString; private BsonValue comment; private Bson variables; + private BsonDocument sort; /** * Returns true if a new document should be inserted if there are no matches to the query filter. The default is false. @@ -256,6 +258,32 @@ public UpdateOptions let(final Bson variables) { return this; } + /** + * Gets the sort criteria to apply to the query. The default is null, which means that the documents will be returned in an undefined + * order. + * + * @return a document describing the sort criteria + * @since 5.3 + * @mongodb.driver.manual reference/method/cursor.sort/ Sort + */ + @Nullable + public BsonDocument getSort() { + return sort; + } + + /** + * Sets the sort criteria to apply to the query. + * + * @param sort the sort criteria, which may be null. + * @return this + * @since 5.3 + * @mongodb.driver.manual reference/method/cursor.sort/ Sort + */ + public UpdateOptions sort(@Nullable final BsonDocument sort) { + this.sort = sort; + return this; + } + @Override public String toString() { return "UpdateOptions{" @@ -267,6 +295,7 @@ public String toString() { + ", hintString=" + hintString + ", comment=" + comment + ", let=" + variables + + ", sort=" + sort + '}'; } } diff --git a/driver-core/src/main/com/mongodb/internal/bulk/UpdateRequest.java b/driver-core/src/main/com/mongodb/internal/bulk/UpdateRequest.java index 5a7df089641..e9d0b13c3cd 100644 --- a/driver-core/src/main/com/mongodb/internal/bulk/UpdateRequest.java +++ b/driver-core/src/main/com/mongodb/internal/bulk/UpdateRequest.java @@ -40,6 +40,7 @@ public final class UpdateRequest extends WriteRequest { private List arrayFilters; @Nullable private BsonDocument hint; @Nullable private String hintString; + @Nullable private BsonDocument sort; public UpdateRequest(final BsonDocument filter, @Nullable final BsonValue update, final Type updateType) { if (updateType != Type.UPDATE && updateType != Type.REPLACE) { @@ -128,5 +129,15 @@ public UpdateRequest hintString(@Nullable final String hint) { this.hintString = hint; return this; } + + @Nullable + public BsonDocument getSort() { + return sort; + } + + public UpdateRequest sort(@Nullable final BsonDocument sort) { + this.sort = sort; + return this; + } } diff --git a/driver-core/src/main/com/mongodb/internal/connection/SplittablePayload.java b/driver-core/src/main/com/mongodb/internal/connection/SplittablePayload.java index d628a39238d..55bbac03b8b 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/SplittablePayload.java +++ b/driver-core/src/main/com/mongodb/internal/connection/SplittablePayload.java @@ -270,6 +270,11 @@ public void encode(final BsonWriter writer, final WriteRequestWithIndex writeReq } else if (update.getHintString() != null) { writer.writeString("hint", update.getHintString()); } + if (update.getSort() != null) { + writer.writeName("sort"); + getCodec(assertNotNull(update.getSort())).encode(writer, assertNotNull(update.getSort()), + EncoderContext.builder().build()); + } writer.writeEndDocument(); } else { DeleteRequest deleteRequest = (DeleteRequest) writeRequestWithIndex.getWriteRequest(); diff --git a/driver-core/src/main/com/mongodb/internal/operation/MixedBulkWriteOperation.java b/driver-core/src/main/com/mongodb/internal/operation/MixedBulkWriteOperation.java index a32ce6d5153..2ba953b7125 100644 --- a/driver-core/src/main/com/mongodb/internal/operation/MixedBulkWriteOperation.java +++ b/driver-core/src/main/com/mongodb/internal/operation/MixedBulkWriteOperation.java @@ -85,6 +85,7 @@ public class MixedBulkWriteOperation implements AsyncWriteOperation writeRequests, final boolean ordered, final WriteConcern writeConcern, final boolean retryWrites) { @@ -130,6 +131,15 @@ public MixedBulkWriteOperation comment(@Nullable final BsonValue comment) { return this; } + public BsonDocument getSort() { + return sort; + } + + public MixedBulkWriteOperation sort(@Nullable final BsonDocument sort) { + this.sort = sort; + return this; + } + public MixedBulkWriteOperation let(@Nullable final BsonDocument variables) { this.variables = variables; return this; diff --git a/driver-core/src/main/com/mongodb/internal/operation/Operations.java b/driver-core/src/main/com/mongodb/internal/operation/Operations.java index d00c5a446c9..ffcaba3afda 100644 --- a/driver-core/src/main/com/mongodb/internal/operation/Operations.java +++ b/driver-core/src/main/com/mongodb/internal/operation/Operations.java @@ -403,13 +403,13 @@ MixedBulkWriteOperation deleteMany(final Bson filter, final DeleteOptions option MixedBulkWriteOperation updateOne(final Bson filter, final Bson update, final UpdateOptions options) { return bulkWrite(singletonList(new UpdateOneModel<>(filter, update, options)), new BulkWriteOptions().bypassDocumentValidation(options.getBypassDocumentValidation()) - .comment(options.getComment()).let(options.getLet())); + .comment(options.getComment()).let(options.getLet()).sort(options.getSort())); } MixedBulkWriteOperation updateOne(final Bson filter, final List update, final UpdateOptions options) { return bulkWrite(singletonList(new UpdateOneModel<>(filter, update, options)), new BulkWriteOptions().bypassDocumentValidation(options.getBypassDocumentValidation()) - .comment(options.getComment()).let(options.getLet())); + .comment(options.getComment()).let(options.getLet()).sort(options.getSort())); } MixedBulkWriteOperation updateMany(final Bson filter, final Bson update, final UpdateOptions options) { @@ -475,7 +475,8 @@ MixedBulkWriteOperation bulkWrite(final List updateManyModel = (UpdateManyModel) writeModel; BsonValue update = updateManyModel.getUpdate() != null ? toBsonDocument(updateManyModel.getUpdate()) @@ -509,7 +510,8 @@ MixedBulkWriteOperation bulkWrite(final List CommandReadOperation commandRead(final Bson command, final Class resultClass) { diff --git a/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedCrudHelper.java b/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedCrudHelper.java index 64cf204e565..de928ac3d16 100644 --- a/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedCrudHelper.java +++ b/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedCrudHelper.java @@ -1159,6 +1159,9 @@ private UpdateOptions getUpdateOptions(final BsonDocument arguments) { case "collation": options.collation(asCollation(cur.getValue().asDocument())); break; + case "sort": + options.sort(cur.getValue().asDocument()); + break; default: throw new UnsupportedOperationException("Unsupported argument: " + cur.getKey()); } diff --git a/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedTestModifications.java b/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedTestModifications.java index c515b96241b..75a94b48558 100644 --- a/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedTestModifications.java +++ b/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedTestModifications.java @@ -136,12 +136,8 @@ public static void doSkips(final TestDef def) { .test("crud", "findOneAndDelete-hint-unacknowledged", "Unacknowledged findOneAndDelete with hint string on 4.4+ server") .test("crud", "findOneAndDelete-hint-unacknowledged", "Unacknowledged findOneAndDelete with hint document on 4.4+ server"); def.skipJira("https://jira.mongodb.org/browse/JAVA-5622") - .test("crud", "updateOne-sort", "UpdateOne with sort option") - .test("crud", "updateOne-sort", "updateOne with sort option unsupported (server-side error)") .test("crud", "replaceOne-sort", "ReplaceOne with sort option") .test("crud", "replaceOne-sort", "replaceOne with sort option unsupported (server-side error)") - .test("crud", "BulkWrite updateOne-sort", "BulkWrite updateOne with sort option") - .test("crud", "BulkWrite updateOne-sort", "BulkWrite updateOne with sort option unsupported (server-side error)") .test("crud", "BulkWrite replaceOne-sort", "BulkWrite replaceOne with sort option") .test("crud", "BulkWrite replaceOne-sort", "BulkWrite replaceOne with sort option unsupported (server-side error)"); From 19c77f3b1f24de0880e1e8df9a3534aba040af5f Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Thu, 19 Dec 2024 16:56:54 -0500 Subject: [PATCH 2/4] Update PR --- .../client/model/BulkWriteOptions.java | 29 ------------------- .../mongodb/client/model/ReplaceOptions.java | 29 +++++++++++++++++++ .../mongodb/client/model/UpdateOptions.java | 16 +++++----- .../internal/operation/Operations.java | 12 ++++---- .../src/main/com/mongodb/ReplaceRequest.java | 18 ++++++++++-- .../client/unified/UnifiedCrudHelper.java | 3 ++ .../unified/UnifiedTestModifications.java | 5 ---- 7 files changed, 63 insertions(+), 49 deletions(-) diff --git a/driver-core/src/main/com/mongodb/client/model/BulkWriteOptions.java b/driver-core/src/main/com/mongodb/client/model/BulkWriteOptions.java index 33d6c37ab04..12b6c990d47 100644 --- a/driver-core/src/main/com/mongodb/client/model/BulkWriteOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/BulkWriteOptions.java @@ -17,7 +17,6 @@ package com.mongodb.client.model; import com.mongodb.lang.Nullable; -import org.bson.BsonDocument; import org.bson.BsonString; import org.bson.BsonValue; import org.bson.conversions.Bson; @@ -32,7 +31,6 @@ public final class BulkWriteOptions { private Boolean bypassDocumentValidation; private BsonValue comment; private Bson variables; - private BsonDocument sort; /** * If true, then when a write fails, return without performing the remaining @@ -149,32 +147,6 @@ public BulkWriteOptions let(@Nullable final Bson variables) { return this; } - /** - * Gets the sort criteria to apply to the query. The default is null, which means that the documents will be returned in an undefined - * order. - * - * @return a document describing the sort criteria - * @since 5.3 - * @mongodb.driver.manual reference/method/cursor.sort/ Sort - */ - @Nullable - public BsonDocument getSort() { - return sort; - } - - /** - * Sets the sort criteria to apply to the query. - * - * @param sort the sort criteria, which may be null. - * @return this - * @since 5.3 - * @mongodb.driver.manual reference/method/cursor.sort/ Sort - */ - public BulkWriteOptions sort(@Nullable final BsonDocument sort) { - this.sort = sort; - return this; - } - @Override public String toString() { return "BulkWriteOptions{" @@ -182,7 +154,6 @@ public String toString() { + ", bypassDocumentValidation=" + bypassDocumentValidation + ", comment=" + comment + ", let=" + variables - + ", sort=" + sort + '}'; } } diff --git a/driver-core/src/main/com/mongodb/client/model/ReplaceOptions.java b/driver-core/src/main/com/mongodb/client/model/ReplaceOptions.java index 249a828364a..717d0a2e976 100644 --- a/driver-core/src/main/com/mongodb/client/model/ReplaceOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/ReplaceOptions.java @@ -37,6 +37,7 @@ public class ReplaceOptions { private String hintString; private BsonValue comment; private Bson variables; + private Bson sort; /** * Returns true if a new document should be inserted if there are no matches to the query filter. The default is false. @@ -221,6 +222,33 @@ public ReplaceOptions let(final Bson variables) { return this; } + /** + * Gets the sort criteria to apply to the query. The default is null, which means that the documents will be returned in an undefined + * order. + * + * @return a document describing the sort criteria + * @since 5.3 + * @mongodb.driver.manual reference/method/db.collection.replaceOne/ Sort + */ + @Nullable + public Bson getSort() { + return sort; + } + + /** + * Sets the sort criteria to apply to the query. When multiple documents match the query, the sort order specifies the document to be + * updated first. + * + * @param sort the sort criteria, which may be null. + * @return this + * @since 5.3 + * @mongodb.driver.manual reference/method/db.collection.replaceOne/ Sort + */ + public ReplaceOptions sort(@Nullable final Bson sort) { + this.sort = sort; + return this; + } + @Override public String toString() { return "ReplaceOptions{" @@ -231,6 +259,7 @@ public String toString() { + ", hintString=" + hintString + ", comment=" + comment + ", let=" + variables + + ", sort=" + sort + '}'; } } diff --git a/driver-core/src/main/com/mongodb/client/model/UpdateOptions.java b/driver-core/src/main/com/mongodb/client/model/UpdateOptions.java index 56423948f1d..b8d789e3a27 100644 --- a/driver-core/src/main/com/mongodb/client/model/UpdateOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/UpdateOptions.java @@ -19,7 +19,6 @@ import com.mongodb.lang.Nullable; import org.bson.BsonString; import org.bson.BsonValue; -import org.bson.BsonDocument; import org.bson.conversions.Bson; import java.util.List; @@ -41,7 +40,7 @@ public class UpdateOptions { private String hintString; private BsonValue comment; private Bson variables; - private BsonDocument sort; + private Bson sort; /** * Returns true if a new document should be inserted if there are no matches to the query filter. The default is false. @@ -264,22 +263,25 @@ public UpdateOptions let(final Bson variables) { * * @return a document describing the sort criteria * @since 5.3 - * @mongodb.driver.manual reference/method/cursor.sort/ Sort + * @mongodb.driver.manual reference/method/db.collection.updateOne/ Sort */ @Nullable - public BsonDocument getSort() { + public Bson getSort() { return sort; } /** - * Sets the sort criteria to apply to the query. + * Sets the sort criteria to apply to the query. When multiple documents match the query, the sort order specifies the document to be + * updated first. + * + *

Note: The sort is not applicable to updateMany.

* * @param sort the sort criteria, which may be null. * @return this * @since 5.3 - * @mongodb.driver.manual reference/method/cursor.sort/ Sort + * @mongodb.driver.manual reference/method/db.collection.updateOne/ Sort */ - public UpdateOptions sort(@Nullable final BsonDocument sort) { + public UpdateOptions sort(@Nullable final Bson sort) { this.sort = sort; return this; } diff --git a/driver-core/src/main/com/mongodb/internal/operation/Operations.java b/driver-core/src/main/com/mongodb/internal/operation/Operations.java index ffcaba3afda..ecdd215ba91 100644 --- a/driver-core/src/main/com/mongodb/internal/operation/Operations.java +++ b/driver-core/src/main/com/mongodb/internal/operation/Operations.java @@ -403,13 +403,13 @@ MixedBulkWriteOperation deleteMany(final Bson filter, final DeleteOptions option MixedBulkWriteOperation updateOne(final Bson filter, final Bson update, final UpdateOptions options) { return bulkWrite(singletonList(new UpdateOneModel<>(filter, update, options)), new BulkWriteOptions().bypassDocumentValidation(options.getBypassDocumentValidation()) - .comment(options.getComment()).let(options.getLet()).sort(options.getSort())); + .comment(options.getComment()).let(options.getLet())); } MixedBulkWriteOperation updateOne(final Bson filter, final List update, final UpdateOptions options) { return bulkWrite(singletonList(new UpdateOneModel<>(filter, update, options)), new BulkWriteOptions().bypassDocumentValidation(options.getBypassDocumentValidation()) - .comment(options.getComment()).let(options.getLet()).sort(options.getSort())); + .comment(options.getComment()).let(options.getLet())); } MixedBulkWriteOperation updateMany(final Bson filter, final Bson update, final UpdateOptions options) { @@ -464,7 +464,8 @@ MixedBulkWriteOperation bulkWrite(final List updateOneModel = (UpdateOneModel) writeModel; BsonValue update = updateOneModel.getUpdate() != null ? toBsonDocument(updateOneModel.getUpdate()) @@ -476,7 +477,7 @@ MixedBulkWriteOperation bulkWrite(final List updateManyModel = (UpdateManyModel) writeModel; BsonValue update = updateManyModel.getUpdate() != null ? toBsonDocument(updateManyModel.getUpdate()) @@ -510,8 +511,7 @@ MixedBulkWriteOperation bulkWrite(final List CommandReadOperation commandRead(final Bson command, final Class resultClass) { diff --git a/driver-legacy/src/main/com/mongodb/ReplaceRequest.java b/driver-legacy/src/main/com/mongodb/ReplaceRequest.java index 8427471af18..875eef9d2ba 100644 --- a/driver-legacy/src/main/com/mongodb/ReplaceRequest.java +++ b/driver-legacy/src/main/com/mongodb/ReplaceRequest.java @@ -18,6 +18,8 @@ import com.mongodb.client.model.Collation; import com.mongodb.internal.bulk.UpdateRequest; +import com.mongodb.lang.Nullable; +import org.bson.BsonDocument; import org.bson.BsonDocumentWrapper; import org.bson.codecs.Encoder; @@ -28,6 +30,7 @@ class ReplaceRequest extends WriteRequest { private final Encoder codec; private final Encoder replacementCodec; private final Collation collation; + @Nullable private BsonDocument sort; ReplaceRequest(final DBObject query, final DBObject document, final boolean upsert, final Encoder codec, final Encoder replacementCodec, final Collation collation) { @@ -55,12 +58,23 @@ public Collation getCollation() { return collation; } + @Nullable + public BsonDocument getSort() { + return sort; + } + + public ReplaceRequest sort(@Nullable final BsonDocument sort) { + this.sort = sort; + return this; + } + @Override com.mongodb.internal.bulk.WriteRequest toNew(final DBCollection dbCollection) { return new UpdateRequest(new BsonDocumentWrapper<>(query, codec), new BsonDocumentWrapper<>(document, replacementCodec), com.mongodb.internal.bulk.WriteRequest.Type.REPLACE) - .upsert(isUpsert()) - .collation(getCollation()); + .upsert(isUpsert()) + .collation(getCollation()) + .sort(getSort()); } } diff --git a/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedCrudHelper.java b/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedCrudHelper.java index de928ac3d16..192bde29e5e 100644 --- a/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedCrudHelper.java +++ b/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedCrudHelper.java @@ -1196,6 +1196,9 @@ private ReplaceOptions getReplaceOptions(final BsonDocument arguments) { case "collation": options.collation(asCollation(cur.getValue().asDocument())); break; + case "sort": + options.sort(cur.getValue().asDocument()); + break; default: throw new UnsupportedOperationException("Unsupported argument: " + cur.getKey()); } diff --git a/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedTestModifications.java b/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedTestModifications.java index 75a94b48558..a47f89bae94 100644 --- a/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedTestModifications.java +++ b/driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedTestModifications.java @@ -135,11 +135,6 @@ public static void doSkips(final TestDef def) { .test("crud", "findOneAndUpdate-hint-unacknowledged", "Unacknowledged findOneAndUpdate with hint document on 4.4+ server") .test("crud", "findOneAndDelete-hint-unacknowledged", "Unacknowledged findOneAndDelete with hint string on 4.4+ server") .test("crud", "findOneAndDelete-hint-unacknowledged", "Unacknowledged findOneAndDelete with hint document on 4.4+ server"); - def.skipJira("https://jira.mongodb.org/browse/JAVA-5622") - .test("crud", "replaceOne-sort", "ReplaceOne with sort option") - .test("crud", "replaceOne-sort", "replaceOne with sort option unsupported (server-side error)") - .test("crud", "BulkWrite replaceOne-sort", "BulkWrite replaceOne with sort option") - .test("crud", "BulkWrite replaceOne-sort", "BulkWrite replaceOne with sort option unsupported (server-side error)"); // gridfs From 445b15d4203bd5eb3b5b5fad8334bf7ac201617d Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Mon, 30 Dec 2024 13:53:40 -0500 Subject: [PATCH 3/4] update --- .../mongodb/client/model/ReplaceOptions.java | 24 +++++++++++++------ .../mongodb/client/model/UpdateOptions.java | 24 ++++++++++++------- .../operation/MixedBulkWriteOperation.java | 10 -------- .../model/UpdateOptionsSpecification.groovy | 8 +++++++ .../UpdateRequestSpecification.groovy | 9 +++++++ .../src/main/com/mongodb/ReplaceRequest.java | 16 +------------ .../MongoCollectionSpecification.groovy | 24 ++++++++++--------- 7 files changed, 64 insertions(+), 51 deletions(-) diff --git a/driver-core/src/main/com/mongodb/client/model/ReplaceOptions.java b/driver-core/src/main/com/mongodb/client/model/ReplaceOptions.java index 717d0a2e976..7a26e0997ba 100644 --- a/driver-core/src/main/com/mongodb/client/model/ReplaceOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/ReplaceOptions.java @@ -223,12 +223,18 @@ public ReplaceOptions let(final Bson variables) { } /** - * Gets the sort criteria to apply to the query. The default is null, which means that the documents will be returned in an undefined - * order. + * Gets the sort criteria to apply to the operation. * - * @return a document describing the sort criteria - * @since 5.3 + *

+ * The sort criteria determines which document the operation replaces if the query matches multiple documents. + * The first document matched by the sort criteria will be replaced. + * The default is null, which means no specific sort criteria is applied. + * + * @return a document describing the sort criteria, or null if no sort is specified. * @mongodb.driver.manual reference/method/db.collection.replaceOne/ Sort + * @mongodb.server.release 8.0 + * @since 5.3 + * @see #sort(Bson) */ @Nullable public Bson getSort() { @@ -236,13 +242,17 @@ public Bson getSort() { } /** - * Sets the sort criteria to apply to the query. When multiple documents match the query, the sort order specifies the document to be - * updated first. + * Sets the sort criteria to apply to the operation. A null value means no sort criteria is set. + * + *

+ * The sort criteria determines which document the operation replaces if the query matches multiple documents. + * The first document matched by the specified sort criteria will be replaced. * * @param sort the sort criteria, which may be null. * @return this - * @since 5.3 * @mongodb.driver.manual reference/method/db.collection.replaceOne/ Sort + * @mongodb.server.release 8.0 + * @since 5.3 */ public ReplaceOptions sort(@Nullable final Bson sort) { this.sort = sort; diff --git a/driver-core/src/main/com/mongodb/client/model/UpdateOptions.java b/driver-core/src/main/com/mongodb/client/model/UpdateOptions.java index b8d789e3a27..88eb3cb6acb 100644 --- a/driver-core/src/main/com/mongodb/client/model/UpdateOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/UpdateOptions.java @@ -258,12 +258,18 @@ public UpdateOptions let(final Bson variables) { } /** - * Gets the sort criteria to apply to the query. The default is null, which means that the documents will be returned in an undefined - * order. + * Gets the sort criteria to apply to the operation. * - * @return a document describing the sort criteria - * @since 5.3 + *

+ * The sort criteria determines which document the operation updates if the query matches multiple documents. + * The first document matched by the sort criteria will be updated. + * The default is null, which means no specific sort criteria is applied. + * + * @return a document describing the sort criteria, or null if no sort is specified. * @mongodb.driver.manual reference/method/db.collection.updateOne/ Sort + * @mongodb.server.release 8.0 + * @since 5.3 + * @see #sort(Bson) */ @Nullable public Bson getSort() { @@ -271,15 +277,17 @@ public Bson getSort() { } /** - * Sets the sort criteria to apply to the query. When multiple documents match the query, the sort order specifies the document to be - * updated first. + * Sets the sort criteria to apply to the operation. A null value means no sort criteria is set. * - *

Note: The sort is not applicable to updateMany.

+ *

+ * The sort criteria determines which document the operation updates if the query matches multiple documents. + * The first document matched by the specified sort criteria will be updated. * * @param sort the sort criteria, which may be null. * @return this - * @since 5.3 * @mongodb.driver.manual reference/method/db.collection.updateOne/ Sort + * @mongodb.server.release 8.0 + * @since 5.3 */ public UpdateOptions sort(@Nullable final Bson sort) { this.sort = sort; diff --git a/driver-core/src/main/com/mongodb/internal/operation/MixedBulkWriteOperation.java b/driver-core/src/main/com/mongodb/internal/operation/MixedBulkWriteOperation.java index 2ba953b7125..a32ce6d5153 100644 --- a/driver-core/src/main/com/mongodb/internal/operation/MixedBulkWriteOperation.java +++ b/driver-core/src/main/com/mongodb/internal/operation/MixedBulkWriteOperation.java @@ -85,7 +85,6 @@ public class MixedBulkWriteOperation implements AsyncWriteOperation writeRequests, final boolean ordered, final WriteConcern writeConcern, final boolean retryWrites) { @@ -131,15 +130,6 @@ public MixedBulkWriteOperation comment(@Nullable final BsonValue comment) { return this; } - public BsonDocument getSort() { - return sort; - } - - public MixedBulkWriteOperation sort(@Nullable final BsonDocument sort) { - this.sort = sort; - return this; - } - public MixedBulkWriteOperation let(@Nullable final BsonDocument variables) { this.variables = variables; return this; diff --git a/driver-core/src/test/unit/com/mongodb/client/model/UpdateOptionsSpecification.groovy b/driver-core/src/test/unit/com/mongodb/client/model/UpdateOptionsSpecification.groovy index 0481120b05a..cd588936c18 100644 --- a/driver-core/src/test/unit/com/mongodb/client/model/UpdateOptionsSpecification.groovy +++ b/driver-core/src/test/unit/com/mongodb/client/model/UpdateOptionsSpecification.groovy @@ -78,4 +78,12 @@ class UpdateOptionsSpecification extends Specification { where: hint << [null, '_id_'] } + + def 'should set sort'() { + expect: + new UpdateOptions().sort(sort).getSort() == sort + + where: + sort << [null, new BsonDocument('_id', new BsonInt32(1))] + } } diff --git a/driver-core/src/test/unit/com/mongodb/internal/operation/UpdateRequestSpecification.groovy b/driver-core/src/test/unit/com/mongodb/internal/operation/UpdateRequestSpecification.groovy index f56411578cf..7ab84bb670b 100644 --- a/driver-core/src/test/unit/com/mongodb/internal/operation/UpdateRequestSpecification.groovy +++ b/driver-core/src/test/unit/com/mongodb/internal/operation/UpdateRequestSpecification.groovy @@ -125,4 +125,13 @@ class UpdateRequestSpecification extends Specification { where: arrayFilters << [null, [], [new BsonDocument('a.b', new BsonInt32(42))]] } + + def 'should set sort property'() { + expect: + new UpdateRequest(new BsonDocument(), new BsonDocument(), type).sort(sort).getSort() == sort + + where: + type << [WriteRequest.Type.UPDATE, WriteRequest.Type.REPLACE] + sort << [null, new BsonDocument('_id', new BsonInt32(1))] + } } diff --git a/driver-legacy/src/main/com/mongodb/ReplaceRequest.java b/driver-legacy/src/main/com/mongodb/ReplaceRequest.java index 875eef9d2ba..09443f1ee4d 100644 --- a/driver-legacy/src/main/com/mongodb/ReplaceRequest.java +++ b/driver-legacy/src/main/com/mongodb/ReplaceRequest.java @@ -18,8 +18,6 @@ import com.mongodb.client.model.Collation; import com.mongodb.internal.bulk.UpdateRequest; -import com.mongodb.lang.Nullable; -import org.bson.BsonDocument; import org.bson.BsonDocumentWrapper; import org.bson.codecs.Encoder; @@ -30,7 +28,6 @@ class ReplaceRequest extends WriteRequest { private final Encoder codec; private final Encoder replacementCodec; private final Collation collation; - @Nullable private BsonDocument sort; ReplaceRequest(final DBObject query, final DBObject document, final boolean upsert, final Encoder codec, final Encoder replacementCodec, final Collation collation) { @@ -58,23 +55,12 @@ public Collation getCollation() { return collation; } - @Nullable - public BsonDocument getSort() { - return sort; - } - - public ReplaceRequest sort(@Nullable final BsonDocument sort) { - this.sort = sort; - return this; - } - @Override com.mongodb.internal.bulk.WriteRequest toNew(final DBCollection dbCollection) { return new UpdateRequest(new BsonDocumentWrapper<>(query, codec), new BsonDocumentWrapper<>(document, replacementCodec), com.mongodb.internal.bulk.WriteRequest.Type.REPLACE) .upsert(isUpsert()) - .collation(getCollation()) - .sort(getSort()); + .collation(getCollation()); } } diff --git a/driver-sync/src/test/unit/com/mongodb/client/internal/MongoCollectionSpecification.groovy b/driver-sync/src/test/unit/com/mongodb/client/internal/MongoCollectionSpecification.groovy index 2fba3b90a0a..cbe43c10517 100644 --- a/driver-sync/src/test/unit/com/mongodb/client/internal/MongoCollectionSpecification.groovy +++ b/driver-sync/src/test/unit/com/mongodb/client/internal/MongoCollectionSpecification.groovy @@ -813,7 +813,7 @@ class MongoCollectionSpecification extends Specification { def expectedOperation = { boolean upsert, WriteConcern wc, Boolean bypassValidation, Collation collation -> new MixedBulkWriteOperation(namespace, [new UpdateRequest(new BsonDocument('a', new BsonInt32(1)), new BsonDocument('a', new BsonInt32(10)), REPLACE) - .collation(collation).upsert(upsert).hint(hint).hintString(hintString)], true, wc, retryWrites) + .collation(collation).upsert(upsert).hint(hint).hintString(hintString).sort(sort)], true, wc, retryWrites) .bypassDocumentValidation(bypassValidation) } def replaceOneMethod = collection.&replaceOne @@ -821,7 +821,7 @@ class MongoCollectionSpecification extends Specification { when: def result = execute(replaceOneMethod, session, new Document('a', 1), new Document('a', 10), new ReplaceOptions().upsert(true).bypassDocumentValidation(bypassDocumentValidation).collation(collation) - .hint(hint).hintString(hintString)) + .hint(hint).hintString(hintString).sort(sort)) executor.getClientSession() == session def operation = executor.getWriteOperation() as MixedBulkWriteOperation @@ -830,7 +830,7 @@ class MongoCollectionSpecification extends Specification { result == expectedResult where: - [bypassDocumentValidation, modifiedCount, upsertedId, writeConcern, session, retryWrites, hint, hintString] << [ + [bypassDocumentValidation, modifiedCount, upsertedId, writeConcern, session, retryWrites, hint, hintString, sort] << [ [null, true, false], [1], [null, new BsonInt32(42)], @@ -838,7 +838,8 @@ class MongoCollectionSpecification extends Specification { [null, Stub(ClientSession)], [true, false], [null, new BsonDocument('_id', new BsonInt32(1))], - [null, '_id_'] + [null, '_id_'], + [null, new BsonDocument('_id', new BsonInt32(1))] ].combinations() } @@ -880,11 +881,11 @@ class MongoCollectionSpecification extends Specification { def collection = new MongoCollectionImpl(namespace, Document, codecRegistry, readPreference, writeConcern, retryWrites, true, readConcern, JAVA_LEGACY, null, TIMEOUT_SETTINGS, executor) def expectedOperation = { boolean upsert, WriteConcern wc, Boolean bypassDocumentValidation, Collation collation, - List filters, BsonDocument hintDoc, String hintStr -> + List filters, BsonDocument hintDoc, String hintStr, BsonDocument sortDoc -> new MixedBulkWriteOperation(namespace, [new UpdateRequest(new BsonDocument('a', new BsonInt32(1)), new BsonDocument('a', new BsonInt32(10)), UPDATE) .multi(false).upsert(upsert).collation(collation).arrayFilters(filters) - .hint(hintDoc).hintString(hintStr)], true, wc, retryWrites) + .hint(hintDoc).hintString(hintStr).sort(sortDoc)], true, wc, retryWrites) .bypassDocumentValidation(bypassDocumentValidation) } def updateOneMethod = collection.&updateOne @@ -894,29 +895,30 @@ class MongoCollectionSpecification extends Specification { def operation = executor.getWriteOperation() as MixedBulkWriteOperation then: - expect operation, isTheSameAs(expectedOperation(false, writeConcern, null, null, null, null, null)) + expect operation, isTheSameAs(expectedOperation(false, writeConcern, null, null, null, null, null, null)) executor.getClientSession() == session result == expectedResult when: result = execute(updateOneMethod, session, new Document('a', 1), new Document('a', 10), new UpdateOptions().upsert(true).bypassDocumentValidation(true).collation(collation) - .arrayFilters(arrayFilters).hint(hint).hintString(hintString)) + .arrayFilters(arrayFilters).hint(hint).hintString(hintString).sort(sort)) operation = executor.getWriteOperation() as MixedBulkWriteOperation then: - expect operation, isTheSameAs(expectedOperation(true, writeConcern, true, collation, arrayFilters, hint, hintString)) + expect operation, isTheSameAs(expectedOperation(true, writeConcern, true, collation, arrayFilters, hint, hintString, sort)) executor.getClientSession() == session result == expectedResult where: - [writeConcern, arrayFilters, session, retryWrites, hint, hintString] << [ + [writeConcern, arrayFilters, session, retryWrites, hint, hintString, sort] << [ [ACKNOWLEDGED, UNACKNOWLEDGED], [null, [], [new BsonDocument('a.b', new BsonInt32(42))]], [null, Stub(ClientSession)], [true, false], [null, new BsonDocument('_id', new BsonInt32(1))], - [null, '_id_'] + [null, '_id_'], + [null, new BsonDocument('_id', new BsonInt32(1))] ].combinations() } From b17e26c6139d21383c85074e57c42ab379a52497 Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Wed, 8 Jan 2025 14:14:11 -0500 Subject: [PATCH 4/4] get rid of space in driver-legacy --- driver-legacy/src/main/com/mongodb/ReplaceRequest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/driver-legacy/src/main/com/mongodb/ReplaceRequest.java b/driver-legacy/src/main/com/mongodb/ReplaceRequest.java index 09443f1ee4d..8427471af18 100644 --- a/driver-legacy/src/main/com/mongodb/ReplaceRequest.java +++ b/driver-legacy/src/main/com/mongodb/ReplaceRequest.java @@ -60,7 +60,7 @@ com.mongodb.internal.bulk.WriteRequest toNew(final DBCollection dbCollection) { return new UpdateRequest(new BsonDocumentWrapper<>(query, codec), new BsonDocumentWrapper<>(document, replacementCodec), com.mongodb.internal.bulk.WriteRequest.Type.REPLACE) - .upsert(isUpsert()) - .collation(getCollation()); + .upsert(isUpsert()) + .collation(getCollation()); } }