From 9e8f3efed942387d4c0f8c4a5ea3ca0ad78df805 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Sun, 5 Jan 2025 18:42:47 -0800 Subject: [PATCH 01/22] Divide ClientUpdateOptions and ClientDeleteOptions for operation-specific option adaptability. JAVA-5737 --- ...ions.java => ClientDeleteManyOptions.java} | 14 +- .../model/bulk/ClientDeleteOneOptions.java | 65 +++++++++ .../bulk/ClientNamespacedWriteModel.java | 36 ++--- ...ions.java => ClientUpdateManyOptions.java} | 18 +-- .../model/bulk/ClientUpdateOneOptions.java | 83 ++++++++++++ .../model/bulk/AbstractClientDeleteModel.java | 16 +-- .../model/bulk/AbstractClientUpdateModel.java | 17 +-- .../bulk/ConcreteClientDeleteManyModel.java | 17 ++- .../bulk/ConcreteClientDeleteManyOptions.java | 93 +++++++++++++ .../bulk/ConcreteClientDeleteOneModel.java | 16 ++- ...va => ConcreteClientDeleteOneOptions.java} | 14 +- .../bulk/ConcreteClientUpdateManyModel.java | 18 ++- .../bulk/ConcreteClientUpdateManyOptions.java | 125 ++++++++++++++++++ .../bulk/ConcreteClientUpdateOneModel.java | 15 ++- ...va => ConcreteClientUpdateOneOptions.java} | 18 +-- .../operation/ClientBulkWriteOperation.java | 56 +++++++- .../client/unified/UnifiedCrudHelper.java | 87 ++++++++++-- 17 files changed, 598 insertions(+), 110 deletions(-) rename driver-core/src/main/com/mongodb/client/model/bulk/{ClientDeleteOptions.java => ClientDeleteManyOptions.java} (81%) create mode 100644 driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java rename driver-core/src/main/com/mongodb/client/model/bulk/{ClientUpdateOptions.java => ClientUpdateManyOptions.java} (80%) create mode 100644 driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java create mode 100644 driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java rename driver-core/src/main/com/mongodb/internal/client/model/bulk/{ConcreteClientDeleteOptions.java => ConcreteClientDeleteOneOptions.java} (79%) create mode 100644 driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java rename driver-core/src/main/com/mongodb/internal/client/model/bulk/{ConcreteClientUpdateOptions.java => ConcreteClientUpdateOneOptions.java} (78%) diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteManyOptions.java similarity index 81% rename from driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOptions.java rename to driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteManyOptions.java index 54b941776e0..fc03575c9ad 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteManyOptions.java @@ -17,7 +17,7 @@ import com.mongodb.annotations.Sealed; import com.mongodb.client.model.Collation; -import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteOptions; +import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteManyOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; @@ -27,14 +27,14 @@ * @since 5.3 */ @Sealed -public interface ClientDeleteOptions { +public interface ClientDeleteManyOptions { /** * Creates the default options. * * @return The default options. */ - static ClientDeleteOptions clientDeleteOptions() { - return new ConcreteClientDeleteOptions(); + static ClientDeleteManyOptions clientDeleteManyOptions() { + return new ConcreteClientDeleteManyOptions(); } /** @@ -43,7 +43,7 @@ static ClientDeleteOptions clientDeleteOptions() { * @param collation The collation. {@code null} represents the server default. * @return {@code this}. */ - ClientDeleteOptions collation(@Nullable Collation collation); + ClientDeleteManyOptions collation(@Nullable Collation collation); /** * Sets the index specification, @@ -52,7 +52,7 @@ static ClientDeleteOptions clientDeleteOptions() { * @param hint The index specification. {@code null} represents the server default. * @return {@code this}. */ - ClientDeleteOptions hint(@Nullable Bson hint); + ClientDeleteManyOptions hint(@Nullable Bson hint); /** * Sets the index name, @@ -61,5 +61,5 @@ static ClientDeleteOptions clientDeleteOptions() { * @param hintString The index name. {@code null} represents the server default. * @return {@code this}. */ - ClientDeleteOptions hintString(@Nullable String hintString); + ClientDeleteManyOptions hintString(@Nullable String hintString); } diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java new file mode 100644 index 00000000000..ec69bfe443d --- /dev/null +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java @@ -0,0 +1,65 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mongodb.client.model.bulk; + +import com.mongodb.annotations.Sealed; +import com.mongodb.client.model.Collation; +import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteOneOptions; +import com.mongodb.lang.Nullable; +import org.bson.conversions.Bson; + +/** + * The options to apply when deleting document. + * + * @since 5.3 + */ +@Sealed +public interface ClientDeleteOneOptions { + /** + * Creates the default options. + * + * @return The default options. + */ + static ClientDeleteOneOptions clientDeleteOneOptions() { + return new ConcreteClientDeleteOneOptions(); + } + + /** + * Sets the collation. + * + * @param collation The collation. {@code null} represents the server default. + * @return {@code this}. + */ + ClientDeleteOneOptions collation(@Nullable Collation collation); + + /** + * Sets the index specification, + * {@code null}-ifies {@linkplain #hintString(String) hint string}. + * + * @param hint The index specification. {@code null} represents the server default. + * @return {@code this}. + */ + ClientDeleteOneOptions hint(@Nullable Bson hint); + + /** + * Sets the index name, + * {@code null}-ifies {@linkplain #hint(Bson) hint}. + * + * @param hintString The index name. {@code null} represents the server default. + * @return {@code this}. + */ + ClientDeleteOneOptions hintString(@Nullable String hintString); +} diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientNamespacedWriteModel.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientNamespacedWriteModel.java index 5a2e0a672c4..ae04a091a25 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientNamespacedWriteModel.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientNamespacedWriteModel.java @@ -62,8 +62,8 @@ static ClientNamespacedInsertOneModel insertOne(final MongoNamespace /** * Creates a model for updating at most one document in the {@code namespace} matching the {@code filter}. - * This method is functionally equivalent to {@link #updateOne(MongoNamespace, Bson, Bson, ClientUpdateOptions)} - * with the {@linkplain ClientUpdateOptions#clientUpdateOptions() default options}. + * This method is functionally equivalent to {@link #updateOne(MongoNamespace, Bson, Bson, ClientUpdateOneOptions)} + * with the {@linkplain ClientUpdateOneOptions#clientUpdateOneOptions() default options}. * * @param namespace The namespace. * @param filter The filter. @@ -91,7 +91,7 @@ static ClientNamespacedUpdateOneModel updateOne(final MongoNamespace namespace, * @see Updates */ static ClientNamespacedUpdateOneModel updateOne( - final MongoNamespace namespace, final Bson filter, final Bson update, final ClientUpdateOptions options) { + final MongoNamespace namespace, final Bson filter, final Bson update, final ClientUpdateOneOptions options) { notNull("namespace", namespace); notNull("filter", filter); notNull("update", update); @@ -101,8 +101,8 @@ static ClientNamespacedUpdateOneModel updateOne( /** * Creates a model for updating at most one document in the {@code namespace} matching the {@code filter}. - * This method is functionally equivalent to {@link #updateOne(MongoNamespace, Bson, Iterable, ClientUpdateOptions)} - * with the {@linkplain ClientUpdateOptions#clientUpdateOptions() default options}. + * This method is functionally equivalent to {@link #updateOne(MongoNamespace, Bson, Iterable, ClientUpdateOneOptions)} + * with the {@linkplain ClientUpdateOneOptions#clientUpdateOneOptions() default options}. * * @param namespace The namespace. * @param filter The filter. @@ -131,7 +131,7 @@ static ClientNamespacedUpdateOneModel updateOne( * @see Aggregates */ static ClientNamespacedUpdateOneModel updateOne( - final MongoNamespace namespace, final Bson filter, final Iterable updatePipeline, final ClientUpdateOptions options) { + final MongoNamespace namespace, final Bson filter, final Iterable updatePipeline, final ClientUpdateOneOptions options) { notNull("namespace", namespace); notNull("filter", filter); notNull("updatePipeline", updatePipeline); @@ -141,8 +141,8 @@ static ClientNamespacedUpdateOneModel updateOne( /** * Creates a model for updating all documents in the {@code namespace} matching the {@code filter}. - * This method is functionally equivalent to {@link #updateMany(MongoNamespace, Bson, Bson, ClientUpdateOptions)} - * with the {@linkplain ClientUpdateOptions#clientUpdateOptions() default}. + * This method is functionally equivalent to {@link #updateMany(MongoNamespace, Bson, Bson, ClientUpdateManyOptions)} + * with the {@linkplain ClientUpdateManyOptions#clientUpdateManyOptions() default}. * * @param namespace The namespace. * @param filter The filter. @@ -170,7 +170,7 @@ static ClientNamespacedUpdateManyModel updateMany(final MongoNamespace namespace * @see Updates */ static ClientNamespacedUpdateManyModel updateMany( - final MongoNamespace namespace, final Bson filter, final Bson update, final ClientUpdateOptions options) { + final MongoNamespace namespace, final Bson filter, final Bson update, final ClientUpdateManyOptions options) { notNull("namespace", namespace); notNull("filter", filter); notNull("update", update); @@ -180,8 +180,8 @@ static ClientNamespacedUpdateManyModel updateMany( /** * Creates a model for updating all documents in the {@code namespace} matching the {@code filter}. - * This method is functionally equivalent to {@link #updateMany(MongoNamespace, Bson, Iterable, ClientUpdateOptions)} - * with the {@linkplain ClientUpdateOptions#clientUpdateOptions() default options}. + * This method is functionally equivalent to {@link #updateMany(MongoNamespace, Bson, Iterable, ClientUpdateManyOptions)} + * with the {@linkplain ClientUpdateManyOptions#clientUpdateManyOptions() default options}. * * @param namespace The namespace. * @param filter The filter. @@ -210,7 +210,7 @@ static ClientNamespacedUpdateManyModel updateMany( * @see Aggregates */ static ClientNamespacedUpdateManyModel updateMany( - final MongoNamespace namespace, final Bson filter, final Iterable updatePipeline, final ClientUpdateOptions options) { + final MongoNamespace namespace, final Bson filter, final Iterable updatePipeline, final ClientUpdateManyOptions options) { notNull("namespace", namespace); notNull("filter", filter); notNull("updatePipeline", updatePipeline); @@ -261,8 +261,8 @@ static ClientNamespacedReplaceOneModel replaceOne( /** * Creates a model for deleting at most one document from the {@code namespace} matching the {@code filter}. - * This method is functionally equivalent to {@link #deleteOne(MongoNamespace, Bson, ClientDeleteOptions)} - * with the {@linkplain ClientDeleteOptions#clientDeleteOptions() default options}. + * This method is functionally equivalent to {@link #deleteOne(MongoNamespace, Bson, ClientDeleteOneOptions)} + * with the {@linkplain ClientDeleteOneOptions#clientDeleteOneOptions() default options}. * * @param namespace The namespace. * @param filter The filter. @@ -284,7 +284,7 @@ static ClientNamespacedDeleteOneModel deleteOne(final MongoNamespace namespace, * @return The requested {@link ClientNamespacedDeleteOneModel}. * @see Filters */ - static ClientNamespacedDeleteOneModel deleteOne(final MongoNamespace namespace, final Bson filter, final ClientDeleteOptions options) { + static ClientNamespacedDeleteOneModel deleteOne(final MongoNamespace namespace, final Bson filter, final ClientDeleteOneOptions options) { notNull("namespace", namespace); notNull("filter", filter); notNull("options", options); @@ -293,8 +293,8 @@ static ClientNamespacedDeleteOneModel deleteOne(final MongoNamespace namespace, /** * Creates a model for deleting all documents from the {@code namespace} matching the {@code filter}. - * This method is functionally equivalent to {@link #deleteMany(MongoNamespace, Bson, ClientDeleteOptions)} - * with the {@linkplain ClientDeleteOptions#clientDeleteOptions() default options}. + * This method is functionally equivalent to {@link #deleteMany(MongoNamespace, Bson, ClientDeleteManyOptions)} + * with the {@linkplain ClientDeleteManyOptions#clientDeleteManyOptions() default options}. * * @param namespace The namespace. * @param filter The filter. @@ -316,7 +316,7 @@ static ClientNamespacedDeleteManyModel deleteMany(final MongoNamespace namespace * @return The requested {@link ClientNamespacedDeleteManyModel}. * @see Filters */ - static ClientNamespacedDeleteManyModel deleteMany(final MongoNamespace namespace, final Bson filter, final ClientDeleteOptions options) { + static ClientNamespacedDeleteManyModel deleteMany(final MongoNamespace namespace, final Bson filter, final ClientDeleteManyOptions options) { notNull("namespace", namespace); notNull("filter", filter); notNull("options", options); diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java similarity index 80% rename from driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOptions.java rename to driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java index 4a74c8846e9..27fee3882e4 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java @@ -18,7 +18,7 @@ import com.mongodb.annotations.Sealed; import com.mongodb.client.model.Collation; import com.mongodb.client.model.Filters; -import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateOptions; +import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateManyOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; @@ -28,14 +28,14 @@ * @since 5.3 */ @Sealed -public interface ClientUpdateOptions { +public interface ClientUpdateManyOptions { /** * Creates the default options. * * @return The default options. */ - static ClientUpdateOptions clientUpdateOptions() { - return new ConcreteClientUpdateOptions(); + static ClientUpdateManyOptions clientUpdateManyOptions() { + return new ConcreteClientUpdateManyOptions(); } /** @@ -45,7 +45,7 @@ static ClientUpdateOptions clientUpdateOptions() { * @return {@code this}. * @see Filters */ - ClientUpdateOptions arrayFilters(@Nullable Iterable arrayFilters); + ClientUpdateManyOptions arrayFilters(@Nullable Iterable arrayFilters); /** * Sets the collation. @@ -53,7 +53,7 @@ static ClientUpdateOptions clientUpdateOptions() { * @param collation The collation. {@code null} represents the server default. * @return {@code this}. */ - ClientUpdateOptions collation(@Nullable Collation collation); + ClientUpdateManyOptions collation(@Nullable Collation collation); /** * Sets the index specification, @@ -62,7 +62,7 @@ static ClientUpdateOptions clientUpdateOptions() { * @param hint The index specification. {@code null} represents the server default. * @return {@code this}. */ - ClientUpdateOptions hint(@Nullable Bson hint); + ClientUpdateManyOptions hint(@Nullable Bson hint); /** * Sets the index name, @@ -71,7 +71,7 @@ static ClientUpdateOptions clientUpdateOptions() { * @param hintString The index name. {@code null} represents the server default. * @return {@code this}. */ - ClientUpdateOptions hintString(@Nullable String hintString); + ClientUpdateManyOptions hintString(@Nullable String hintString); /** * Enables or disables creation of a document if no documents match the filter. @@ -79,5 +79,5 @@ static ClientUpdateOptions clientUpdateOptions() { * @param upsert The upsert flag. {@code null} represents the server default. * @return {@code this}. */ - ClientUpdateOptions upsert(@Nullable Boolean upsert); + ClientUpdateManyOptions upsert(@Nullable Boolean upsert); } diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java new file mode 100644 index 00000000000..ab831ca683d --- /dev/null +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java @@ -0,0 +1,83 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mongodb.client.model.bulk; + +import com.mongodb.annotations.Sealed; +import com.mongodb.client.model.Collation; +import com.mongodb.client.model.Filters; +import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateOneOptions; +import com.mongodb.lang.Nullable; +import org.bson.conversions.Bson; + +/** + * The options to apply when updating document. + * + * @since 5.3 + */ +@Sealed +public interface ClientUpdateOneOptions { + /** + * Creates the default options. + * + * @return The default options. + */ + static ClientUpdateOneOptions clientUpdateOneOptions() { + return new ConcreteClientUpdateOneOptions(); + } + + /** + * Sets the filters specifying to which array elements an update should apply. + * + * @param arrayFilters The array filters. {@code null} represents the server default. + * @return {@code this}. + * @see Filters + */ + ClientUpdateOneOptions arrayFilters(@Nullable Iterable arrayFilters); + + /** + * Sets the collation. + * + * @param collation The collation. {@code null} represents the server default. + * @return {@code this}. + */ + ClientUpdateOneOptions collation(@Nullable Collation collation); + + /** + * Sets the index specification, + * {@code null}-ifies {@linkplain #hintString(String) hint string}. + * + * @param hint The index specification. {@code null} represents the server default. + * @return {@code this}. + */ + ClientUpdateOneOptions hint(@Nullable Bson hint); + + /** + * Sets the index name, + * {@code null}-ifies {@linkplain #hint(Bson) hint}. + * + * @param hintString The index name. {@code null} represents the server default. + * @return {@code this}. + */ + ClientUpdateOneOptions hintString(@Nullable String hintString); + + /** + * Enables or disables creation of a document if no documents match the filter. + * + * @param upsert The upsert flag. {@code null} represents the server default. + * @return {@code this}. + */ + ClientUpdateOneOptions upsert(@Nullable Boolean upsert); +} diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java index 3d3829661cf..debd939a6e1 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java @@ -15,37 +15,31 @@ */ package com.mongodb.internal.client.model.bulk; -import com.mongodb.client.model.bulk.ClientDeleteOptions; -import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; /** * This class is not part of the public API and may be removed or changed at any time. */ -public abstract class AbstractClientDeleteModel implements ClientWriteModel { +public abstract class AbstractClientDeleteModel implements ClientWriteModel { private final Bson filter; - private final ConcreteClientDeleteOptions options; - AbstractClientDeleteModel(final Bson filter, @Nullable final ClientDeleteOptions options) { + AbstractClientDeleteModel(final Bson filter) { this.filter = filter; - this.options = options == null ? ConcreteClientDeleteOptions.MUTABLE_EMPTY : (ConcreteClientDeleteOptions) options; } public final Bson getFilter() { return filter; } - public final ConcreteClientDeleteOptions getOptions() { - return options; - } - abstract String getToStringDescription(); + abstract T getOptions(); + @Override public final String toString() { return getToStringDescription() + "{filter=" + filter - + ", options=" + options + + ", options=" + getOptions() + '}'; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java index 2c8cadf3d88..c1a208ed668 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java @@ -15,7 +15,6 @@ */ package com.mongodb.internal.client.model.bulk; -import com.mongodb.client.model.bulk.ClientUpdateOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; @@ -27,26 +26,22 @@ /** * This class is not part of the public API and may be removed or changed at any time. */ -public abstract class AbstractClientUpdateModel { +public abstract class AbstractClientUpdateModel { private final Bson filter; @Nullable private final Bson update; @Nullable private final Iterable updatePipeline; - private final ConcreteClientUpdateOptions options; AbstractClientUpdateModel( final Bson filter, @Nullable final Bson update, - @Nullable - final Iterable updatePipeline, - @Nullable final ClientUpdateOptions options) { + @Nullable final Iterable updatePipeline) { this.filter = filter; assertTrue(update == null ^ updatePipeline == null); this.update = update; this.updatePipeline = updatePipeline; - this.options = options == null ? ConcreteClientUpdateOptions.MUTABLE_EMPTY : (ConcreteClientUpdateOptions) options; } public final Bson getFilter() { @@ -61,18 +56,16 @@ public final Optional> getUpdatePipeline() { return ofNullable(updatePipeline); } - public final ConcreteClientUpdateOptions getOptions() { - return options; - } - abstract String getToStringDescription(); + abstract T getOptions(); + @Override public final String toString() { return getToStringDescription() + "{filter=" + filter + ", update=" + (update != null ? update : updatePipeline) - + ", options=" + options + + ", options=" + getOptions() + '}'; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java index 7603c5a7df0..88185c2dbba 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java @@ -15,16 +15,25 @@ */ package com.mongodb.internal.client.model.bulk; -import com.mongodb.client.model.bulk.ClientDeleteOptions; +import com.mongodb.client.model.bulk.ClientDeleteManyOptions; +import com.mongodb.client.model.bulk.ClientDeleteOneOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; /** * This class is not part of the public API and may be removed or changed at any time. */ -public final class ConcreteClientDeleteManyModel extends AbstractClientDeleteModel implements ClientWriteModel { - public ConcreteClientDeleteManyModel(final Bson filter, @Nullable final ClientDeleteOptions options) { - super(filter, options); +public final class ConcreteClientDeleteManyModel extends AbstractClientDeleteModel implements ClientWriteModel { + private final @Nullable ConcreteClientDeleteManyOptions options; + + public ConcreteClientDeleteManyModel(final Bson filter, final @Nullable ClientDeleteManyOptions options) { + super(filter); + this.options = options == null ? ConcreteClientDeleteManyOptions.MUTABLE_EMPTY : (ConcreteClientDeleteManyOptions) options; + } + + @Nullable + public ConcreteClientDeleteManyOptions getOptions() { + return options; } @Override diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java new file mode 100644 index 00000000000..1294ac0b572 --- /dev/null +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java @@ -0,0 +1,93 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mongodb.internal.client.model.bulk; + +import com.mongodb.client.model.Collation; +import com.mongodb.client.model.bulk.ClientDeleteManyOptions; +import com.mongodb.client.model.bulk.ClientDeleteManyOptions; +import com.mongodb.lang.Nullable; +import org.bson.conversions.Bson; + +import java.util.Optional; + +import static java.util.Optional.ofNullable; + +/** + * This class is not part of the public API and may be removed or changed at any time. + */ +public final class ConcreteClientDeleteManyOptions implements ClientDeleteManyOptions { + static final ConcreteClientDeleteManyOptions MUTABLE_EMPTY = new ConcreteClientDeleteManyOptions(); + + @Nullable + private Collation collation; + @Nullable + private Bson hint; + @Nullable + private String hintString; + + public ConcreteClientDeleteManyOptions() { + } + + @Override + public ClientDeleteManyOptions collation(@Nullable final Collation collation) { + this.collation = collation; + return this; + } + + /** + * @see #collation(Collation) + */ + public Optional getCollation() { + return ofNullable(collation); + } + + @Override + public ClientDeleteManyOptions hint(@Nullable final Bson hint) { + this.hint = hint; + this.hintString = null; + return this; + } + + /** + * @see #hint(Bson) + */ + public Optional getHint() { + return ofNullable(hint); + } + + @Override + public ClientDeleteManyOptions hintString(@Nullable final String hintString) { + this.hintString = hintString; + this.hint = null; + return this; + } + + /** + * @see #hintString(String) + */ + public Optional getHintString() { + return ofNullable(hintString); + } + + @Override + public String toString() { + return "ClientDeleteManyOptions{" + + "collation=" + collation + + ", hint=" + hint + + ", hintString='" + hintString + '\'' + + '}'; + } +} diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java index 708f0d3e2ff..74f24261afc 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java @@ -15,16 +15,24 @@ */ package com.mongodb.internal.client.model.bulk; -import com.mongodb.client.model.bulk.ClientDeleteOptions; +import com.mongodb.client.model.bulk.ClientDeleteOneOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; /** * This class is not part of the public API and may be removed or changed at any time. */ -public final class ConcreteClientDeleteOneModel extends AbstractClientDeleteModel implements ClientWriteModel { - public ConcreteClientDeleteOneModel(final Bson filter, @Nullable final ClientDeleteOptions options) { - super(filter, options); +public final class ConcreteClientDeleteOneModel extends AbstractClientDeleteModel implements ClientWriteModel { + private final @Nullable ConcreteClientDeleteOneOptions options; + + public ConcreteClientDeleteOneModel(final Bson filter, @Nullable final ClientDeleteOneOptions options) { + super(filter); + this.options = options == null ? ConcreteClientDeleteOneOptions.MUTABLE_EMPTY : (ConcreteClientDeleteOneOptions) options; + } + + @Nullable + public ConcreteClientDeleteOneOptions getOptions() { + return options; } @Override diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java similarity index 79% rename from driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOptions.java rename to driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java index 1acef43052b..d645c1f0a16 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java @@ -16,7 +16,7 @@ package com.mongodb.internal.client.model.bulk; import com.mongodb.client.model.Collation; -import com.mongodb.client.model.bulk.ClientDeleteOptions; +import com.mongodb.client.model.bulk.ClientDeleteOneOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; @@ -27,8 +27,8 @@ /** * This class is not part of the public API and may be removed or changed at any time. */ -public final class ConcreteClientDeleteOptions implements ClientDeleteOptions { - static final ConcreteClientDeleteOptions MUTABLE_EMPTY = new ConcreteClientDeleteOptions(); +public final class ConcreteClientDeleteOneOptions implements ClientDeleteOneOptions { + static final ConcreteClientDeleteOneOptions MUTABLE_EMPTY = new ConcreteClientDeleteOneOptions(); @Nullable private Collation collation; @@ -37,11 +37,11 @@ public final class ConcreteClientDeleteOptions implements ClientDeleteOptions { @Nullable private String hintString; - public ConcreteClientDeleteOptions() { + public ConcreteClientDeleteOneOptions() { } @Override - public ClientDeleteOptions collation(@Nullable final Collation collation) { + public ClientDeleteOneOptions collation(@Nullable final Collation collation) { this.collation = collation; return this; } @@ -54,7 +54,7 @@ public Optional getCollation() { } @Override - public ClientDeleteOptions hint(@Nullable final Bson hint) { + public ClientDeleteOneOptions hint(@Nullable final Bson hint) { this.hint = hint; this.hintString = null; return this; @@ -68,7 +68,7 @@ public Optional getHint() { } @Override - public ClientDeleteOptions hintString(@Nullable final String hintString) { + public ClientDeleteOneOptions hintString(@Nullable final String hintString) { this.hintString = hintString; this.hint = null; return this; diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java index a7a0b1ac900..eefcb30a968 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java @@ -15,26 +15,36 @@ */ package com.mongodb.internal.client.model.bulk; -import com.mongodb.client.model.bulk.ClientUpdateOptions; +import com.mongodb.client.model.bulk.ClientUpdateManyOptions; +import com.mongodb.client.model.bulk.ClientUpdateOneOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; /** * This class is not part of the public API and may be removed or changed at any time. */ -public final class ConcreteClientUpdateManyModel extends AbstractClientUpdateModel implements ClientWriteModel { +public final class ConcreteClientUpdateManyModel extends AbstractClientUpdateModel implements ClientWriteModel { + private final @Nullable ConcreteClientUpdateManyOptions options; + public ConcreteClientUpdateManyModel( final Bson filter, @Nullable final Bson update, @Nullable final Iterable updatePipeline, - @Nullable final ClientUpdateOptions options) { - super(filter, update, updatePipeline, options); + @Nullable final ClientUpdateManyOptions options) { + super(filter, update, updatePipeline); + this.options = options == null ? ConcreteClientUpdateManyOptions.MUTABLE_EMPTY : (ConcreteClientUpdateManyOptions) options; + } + + public ConcreteClientUpdateManyOptions getOptions() { + return options; } @Override String getToStringDescription() { return "ClientUpdateManyModel"; } + + } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java new file mode 100644 index 00000000000..29756075564 --- /dev/null +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java @@ -0,0 +1,125 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mongodb.internal.client.model.bulk; + +import com.mongodb.client.model.Collation; +import com.mongodb.client.model.bulk.ClientUpdateManyOptions; +import com.mongodb.client.model.bulk.ClientUpdateManyOptions; +import com.mongodb.lang.Nullable; +import org.bson.conversions.Bson; + +import java.util.Optional; + +import static java.util.Optional.ofNullable; + +/** + * This class is not part of the public API and may be removed or changed at any time. + */ +public final class ConcreteClientUpdateManyOptions implements ClientUpdateManyOptions { + static final ConcreteClientUpdateManyOptions MUTABLE_EMPTY = new ConcreteClientUpdateManyOptions(); + + @Nullable + private Iterable arrayFilters; + @Nullable + private Collation collation; + @Nullable + private Bson hint; + @Nullable + private String hintString; + @Nullable + private Boolean upsert; + + public ConcreteClientUpdateManyOptions() { + } + + @Override + public ClientUpdateManyOptions arrayFilters(@Nullable final Iterable arrayFilters) { + this.arrayFilters = arrayFilters; + return this; + } + + /** + * @see #arrayFilters(Iterable) + */ + public Optional> getArrayFilters() { + return ofNullable(arrayFilters); + } + + @Override + public ClientUpdateManyOptions collation(@Nullable final Collation collation) { + this.collation = collation; + return this; + } + + /** + * @see #collation(Collation) + */ + public Optional getCollation() { + return ofNullable(collation); + } + + @Override + public ClientUpdateManyOptions hint(@Nullable final Bson hint) { + this.hint = hint; + this.hintString = null; + return this; + } + + /** + * @see #hint(Bson) + */ + public Optional getHint() { + return ofNullable(hint); + } + + @Override + public ClientUpdateManyOptions hintString(@Nullable final String hintString) { + this.hintString = hintString; + this.hint = null; + return this; + } + + /** + * @see #hintString(String) + */ + public Optional getHintString() { + return ofNullable(hintString); + } + + @Override + public ClientUpdateManyOptions upsert(@Nullable final Boolean upsert) { + this.upsert = upsert; + return this; + } + + /** + * @see #isUpsert() + */ + public Optional isUpsert() { + return ofNullable(upsert); + } + + @Override + public String toString() { + return "ClientUpdateManyOptions{" + + "arrayFilters=" + arrayFilters + + ", collation=" + collation + + ", hint=" + hint + + ", hintString='" + hintString + '\'' + + ", upsert=" + upsert + + '}'; + } +} diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java index aa922a803c6..94fb844df5d 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java @@ -15,22 +15,29 @@ */ package com.mongodb.internal.client.model.bulk; -import com.mongodb.client.model.bulk.ClientUpdateOptions; +import com.mongodb.client.model.bulk.ClientUpdateOneOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; /** * This class is not part of the public API and may be removed or changed at any time. */ -public final class ConcreteClientUpdateOneModel extends AbstractClientUpdateModel implements ClientWriteModel { +public final class ConcreteClientUpdateOneModel extends AbstractClientUpdateModel implements ClientWriteModel { + private final @Nullable ConcreteClientUpdateOneOptions options; + public ConcreteClientUpdateOneModel( final Bson filter, @Nullable final Bson update, @Nullable final Iterable updatePipeline, - @Nullable final ClientUpdateOptions options) { - super(filter, update, updatePipeline, options); + @Nullable final ClientUpdateOneOptions options) { + super(filter, update, updatePipeline); + this.options = options == null ? ConcreteClientUpdateOneOptions.MUTABLE_EMPTY : (ConcreteClientUpdateOneOptions) options; + } + + public ConcreteClientUpdateOneOptions getOptions() { + return options; } @Override diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java similarity index 78% rename from driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOptions.java rename to driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java index cdb0d08839b..f35e4ee7ecc 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java @@ -16,7 +16,7 @@ package com.mongodb.internal.client.model.bulk; import com.mongodb.client.model.Collation; -import com.mongodb.client.model.bulk.ClientUpdateOptions; +import com.mongodb.client.model.bulk.ClientUpdateOneOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; @@ -27,8 +27,8 @@ /** * This class is not part of the public API and may be removed or changed at any time. */ -public final class ConcreteClientUpdateOptions implements ClientUpdateOptions { - static final ConcreteClientUpdateOptions MUTABLE_EMPTY = new ConcreteClientUpdateOptions(); +public final class ConcreteClientUpdateOneOptions implements ClientUpdateOneOptions { + static final ConcreteClientUpdateOneOptions MUTABLE_EMPTY = new ConcreteClientUpdateOneOptions(); @Nullable private Iterable arrayFilters; @@ -41,11 +41,11 @@ public final class ConcreteClientUpdateOptions implements ClientUpdateOptions { @Nullable private Boolean upsert; - public ConcreteClientUpdateOptions() { + public ConcreteClientUpdateOneOptions() { } @Override - public ClientUpdateOptions arrayFilters(@Nullable final Iterable arrayFilters) { + public ClientUpdateOneOptions arrayFilters(@Nullable final Iterable arrayFilters) { this.arrayFilters = arrayFilters; return this; } @@ -58,7 +58,7 @@ public Optional> getArrayFilters() { } @Override - public ClientUpdateOptions collation(@Nullable final Collation collation) { + public ClientUpdateOneOptions collation(@Nullable final Collation collation) { this.collation = collation; return this; } @@ -71,7 +71,7 @@ public Optional getCollation() { } @Override - public ClientUpdateOptions hint(@Nullable final Bson hint) { + public ClientUpdateOneOptions hint(@Nullable final Bson hint) { this.hint = hint; this.hintString = null; return this; @@ -85,7 +85,7 @@ public Optional getHint() { } @Override - public ClientUpdateOptions hintString(@Nullable final String hintString) { + public ClientUpdateOneOptions hintString(@Nullable final String hintString) { this.hintString = hintString; this.hint = null; return this; @@ -99,7 +99,7 @@ public Optional getHintString() { } @Override - public ClientUpdateOptions upsert(@Nullable final Boolean upsert) { + public ClientUpdateOneOptions upsert(@Nullable final Boolean upsert) { this.upsert = upsert; return this; } diff --git a/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java b/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java index 6592fcbaed3..6bd4a17fe0c 100644 --- a/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java +++ b/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java @@ -51,7 +51,6 @@ import com.mongodb.internal.binding.AsyncWriteBinding; import com.mongodb.internal.binding.ConnectionSource; import com.mongodb.internal.binding.WriteBinding; -import com.mongodb.internal.client.model.bulk.AbstractClientDeleteModel; import com.mongodb.internal.client.model.bulk.AbstractClientNamespacedWriteModel; import com.mongodb.internal.client.model.bulk.AbstractClientUpdateModel; import com.mongodb.internal.client.model.bulk.AcknowledgedSummaryClientBulkWriteResult; @@ -59,8 +58,9 @@ import com.mongodb.internal.client.model.bulk.ClientWriteModel; import com.mongodb.internal.client.model.bulk.ConcreteClientBulkWriteOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteManyModel; +import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteManyOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteOneModel; -import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteOptions; +import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteOneOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteResult; import com.mongodb.internal.client.model.bulk.ConcreteClientInsertOneModel; import com.mongodb.internal.client.model.bulk.ConcreteClientInsertOneResult; @@ -73,8 +73,9 @@ import com.mongodb.internal.client.model.bulk.ConcreteClientReplaceOneModel; import com.mongodb.internal.client.model.bulk.ConcreteClientReplaceOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateManyModel; +import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateManyOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateOneModel; -import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateOptions; +import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateOneOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateResult; import com.mongodb.internal.client.model.bulk.UnacknowledgedClientBulkWriteResult; import com.mongodb.internal.connection.AsyncConnection; @@ -1247,7 +1248,7 @@ private void encodeWriteModelInternals( }); } - private void encodeWriteModelInternals(final BsonWriter writer, final AbstractClientUpdateModel model) { + private void encodeUpdateWriteModelInternals(final BsonWriter writer, final AbstractClientUpdateModel model) { writer.writeName("filter"); encodeUsingRegistry(writer, model.getFilter()); model.getUpdate().ifPresent(value -> { @@ -1259,7 +1260,33 @@ private void encodeWriteModelInternals(final BsonWriter writer, final AbstractCl value.forEach(pipelineStage -> encodeUsingRegistry(writer, pipelineStage)); writer.writeEndArray(); }); - ConcreteClientUpdateOptions options = model.getOptions(); + } + + private void encodeWriteModelInternals(final BsonWriter writer, final ConcreteClientUpdateOneModel model) { + encodeUpdateWriteModelInternals(writer, model); + + ConcreteClientUpdateOneOptions options = model.getOptions(); + options.getArrayFilters().ifPresent(value -> { + writer.writeStartArray("arrayFilters"); + value.forEach(filter -> encodeUsingRegistry(writer, filter)); + writer.writeEndArray(); + }); + options.getCollation().ifPresent(value -> { + writer.writeName("collation"); + encodeUsingRegistry(writer, value.asDocument()); + }); + options.getHint().ifPresent(hint -> { + writer.writeName("hint"); + encodeUsingRegistry(writer, hint); + }); + options.getHintString().ifPresent(value -> writer.writeString("hint", value)); + options.isUpsert().ifPresent(value -> writer.writeBoolean("upsert", value)); + } + + private void encodeWriteModelInternals(final BsonWriter writer, final ConcreteClientUpdateManyModel model) { + encodeUpdateWriteModelInternals(writer, model); + + ConcreteClientUpdateManyOptions options = model.getOptions(); options.getArrayFilters().ifPresent(value -> { writer.writeStartArray("arrayFilters"); value.forEach(filter -> encodeUsingRegistry(writer, filter)); @@ -1296,10 +1323,25 @@ private void encodeWriteModelInternals(final BsonBinaryWriter writer, final Conc options.isUpsert().ifPresent(value -> writer.writeBoolean("upsert", value)); } - private void encodeWriteModelInternals(final BsonWriter writer, final AbstractClientDeleteModel model) { + private void encodeWriteModelInternals(final BsonWriter writer, final ConcreteClientDeleteOneModel model) { + writer.writeName("filter"); + encodeUsingRegistry(writer, model.getFilter()); + ConcreteClientDeleteOneOptions options = model.getOptions(); + options.getCollation().ifPresent(value -> { + writer.writeName("collation"); + encodeUsingRegistry(writer, value.asDocument()); + }); + options.getHint().ifPresent(value -> { + writer.writeName("hint"); + encodeUsingRegistry(writer, value); + }); + options.getHintString().ifPresent(value -> writer.writeString("hint", value)); + } + + private void encodeWriteModelInternals(final BsonWriter writer, final ConcreteClientDeleteManyModel model) { writer.writeName("filter"); encodeUsingRegistry(writer, model.getFilter()); - ConcreteClientDeleteOptions options = model.getOptions(); + ConcreteClientDeleteManyOptions options = model.getOptions(); options.getCollation().ifPresent(value -> { writer.writeName("collation"); encodeUsingRegistry(writer, value.asDocument()); 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 03afe429cbc..bb63b3af352 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 @@ -77,9 +77,11 @@ import com.mongodb.client.model.UpdateOptions; import com.mongodb.client.model.WriteModel; import com.mongodb.client.model.bulk.ClientBulkWriteOptions; -import com.mongodb.client.model.bulk.ClientDeleteOptions; +import com.mongodb.client.model.bulk.ClientDeleteManyOptions; +import com.mongodb.client.model.bulk.ClientDeleteOneOptions; import com.mongodb.client.model.bulk.ClientReplaceOptions; -import com.mongodb.client.model.bulk.ClientUpdateOptions; +import com.mongodb.client.model.bulk.ClientUpdateManyOptions; +import com.mongodb.client.model.bulk.ClientUpdateOneOptions; import com.mongodb.client.model.bulk.ClientNamespacedWriteModel; import com.mongodb.client.model.changestream.ChangeStreamDocument; import com.mongodb.client.model.changestream.FullDocument; @@ -121,9 +123,11 @@ import java.util.function.Supplier; import static com.mongodb.client.model.bulk.ClientBulkWriteOptions.clientBulkWriteOptions; -import static com.mongodb.client.model.bulk.ClientDeleteOptions.clientDeleteOptions; +import static com.mongodb.client.model.bulk.ClientDeleteManyOptions.clientDeleteManyOptions; +import static com.mongodb.client.model.bulk.ClientDeleteOneOptions.clientDeleteOneOptions; import static com.mongodb.client.model.bulk.ClientReplaceOptions.clientReplaceOptions; -import static com.mongodb.client.model.bulk.ClientUpdateOptions.clientUpdateOptions; +import static com.mongodb.client.model.bulk.ClientUpdateManyOptions.clientUpdateManyOptions; +import static com.mongodb.client.model.bulk.ClientUpdateOneOptions.clientUpdateOneOptions; import static java.lang.String.format; import static java.util.Arrays.asList; import static java.util.Collections.singleton; @@ -1857,34 +1861,34 @@ private static ClientNamespacedWriteModel toClientNamespacedWriteModel(final Bso namespace, arguments.getDocument("filter"), arguments.getDocument("update"), - getClientUpdateOptions(arguments)) + getClientUpdateOneOptions(arguments)) : ClientNamespacedWriteModel.updateOne( namespace, arguments.getDocument("filter"), arguments.getArray("update").stream().map(BsonValue::asDocument).collect(toList()), - getClientUpdateOptions(arguments)); + getClientUpdateOneOptions(arguments)); case "updateMany": return arguments.isDocument("update") ? ClientNamespacedWriteModel.updateMany( namespace, arguments.getDocument("filter"), arguments.getDocument("update"), - getClientUpdateOptions(arguments)) + getClientUpdateManyOptions(arguments)) : ClientNamespacedWriteModel.updateMany( namespace, arguments.getDocument("filter"), arguments.getArray("update").stream().map(BsonValue::asDocument).collect(toList()), - getClientUpdateOptions(arguments)); + getClientUpdateManyOptions(arguments)); case "deleteOne": return ClientNamespacedWriteModel.deleteOne( namespace, arguments.getDocument("filter"), - getClientDeleteOptions(arguments)); + getClientDeleteOneOptions(arguments)); case "deleteMany": return ClientNamespacedWriteModel.deleteMany( namespace, arguments.getDocument("filter"), - getClientDeleteOptions(arguments)); + getClientDeleteManyOptions(arguments)); default: throw new UnsupportedOperationException("Unsupported client write model type: " + modelType); } @@ -1918,8 +1922,8 @@ private static ClientReplaceOptions getClientReplaceOptions(final BsonDocument a return options; } - private static ClientUpdateOptions getClientUpdateOptions(final BsonDocument arguments) { - ClientUpdateOptions options = clientUpdateOptions(); + private static ClientUpdateOneOptions getClientUpdateOneOptions(final BsonDocument arguments) { + ClientUpdateOneOptions options = clientUpdateOneOptions(); arguments.forEach((key, argument) -> { switch (key) { case "namespace": @@ -1949,8 +1953,63 @@ private static ClientUpdateOptions getClientUpdateOptions(final BsonDocument arg return options; } - private static ClientDeleteOptions getClientDeleteOptions(final BsonDocument arguments) { - ClientDeleteOptions options = clientDeleteOptions(); + private static ClientUpdateManyOptions getClientUpdateManyOptions(final BsonDocument arguments) { + ClientUpdateManyOptions options = clientUpdateManyOptions(); + arguments.forEach((key, argument) -> { + switch (key) { + case "namespace": + case "filter": + case "update": + break; + case "arrayFilters": + options.arrayFilters(argument.asArray().stream().map(BsonValue::asDocument).collect(toList())); + break; + case "collation": + options.collation(asCollation(argument.asDocument())); + break; + case "hint": + if (argument.isDocument()) { + options.hint(argument.asDocument()); + } else { + options.hintString(argument.asString().getValue()); + } + break; + case "upsert": + options.upsert(argument.asBoolean().getValue()); + break; + default: + throw new UnsupportedOperationException(format("Unsupported argument: key=%s, argument=%s", key, argument)); + } + }); + return options; + } + + private static ClientDeleteOneOptions getClientDeleteOneOptions(final BsonDocument arguments) { + ClientDeleteOneOptions options = clientDeleteOneOptions(); + arguments.forEach((key, argument) -> { + switch (key) { + case "namespace": + case "filter": + break; + case "collation": + options.collation(asCollation(argument.asDocument())); + break; + case "hint": + if (argument.isDocument()) { + options.hint(argument.asDocument()); + } else { + options.hintString(argument.asString().getValue()); + } + break; + default: + throw new UnsupportedOperationException(format("Unsupported argument: key=%s, argument=%s", key, argument)); + } + }); + return options; + } + + private static ClientDeleteManyOptions getClientDeleteManyOptions(final BsonDocument arguments) { + ClientDeleteManyOptions options = clientDeleteManyOptions(); arguments.forEach((key, argument) -> { switch (key) { case "namespace": From 69c4f807b0d34dbca2fae2d31b51948e10a7faf2 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Sun, 5 Jan 2025 19:07:00 -0800 Subject: [PATCH 02/22] Change Javadoc. JAVA-5737 --- .../com/mongodb/client/model/bulk/ClientDeleteOneOptions.java | 2 +- .../com/mongodb/client/model/bulk/ClientUpdateOneOptions.java | 2 +- .../client/model/bulk/ConcreteClientDeleteOneOptions.java | 2 +- .../client/model/bulk/ConcreteClientUpdateOneOptions.java | 2 +- .../mongodb/internal/operation/ClientBulkWriteOperation.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java index ec69bfe443d..6285ee3a1e1 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java @@ -22,7 +22,7 @@ import org.bson.conversions.Bson; /** - * The options to apply when deleting document. + * The options to apply when deleting a document. * * @since 5.3 */ diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java index ab831ca683d..522f07ed4c9 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java @@ -23,7 +23,7 @@ import org.bson.conversions.Bson; /** - * The options to apply when updating document. + * The options to apply when updating a document. * * @since 5.3 */ diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java index d645c1f0a16..35b3b6377e6 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java @@ -83,7 +83,7 @@ public Optional getHintString() { @Override public String toString() { - return "ClientDeleteOptions{" + return "ClientDeleteOneOptions{" + "collation=" + collation + ", hint=" + hint + ", hintString='" + hintString + '\'' diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java index f35e4ee7ecc..21e268a598b 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java @@ -113,7 +113,7 @@ public Optional isUpsert() { @Override public String toString() { - return "ClientUpdateOptions{" + return "ClientUpdateOneOptions{" + "arrayFilters=" + arrayFilters + ", collation=" + collation + ", hint=" + hint diff --git a/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java b/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java index 6bd4a17fe0c..f1f381bcc5b 100644 --- a/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java +++ b/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java @@ -1248,7 +1248,7 @@ private void encodeWriteModelInternals( }); } - private void encodeUpdateWriteModelInternals(final BsonWriter writer, final AbstractClientUpdateModel model) { + private void encodeUpdateWriteModelInternals(final BsonWriter writer, final AbstractClientUpdateModel model) { writer.writeName("filter"); encodeUsingRegistry(writer, model.getFilter()); model.getUpdate().ifPresent(value -> { From a5204280895d32ee79a6dacd7ef5cd7281901321 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Mon, 6 Jan 2025 16:22:04 -0800 Subject: [PATCH 03/22] Add Base options to ensure consistency between API methods. JAVA-5737 --- build.gradle | 3 +- driver-core/build.gradle | 1 + .../model/bulk/BaseClientDeleteOptions.java | 16 +++++++ .../model/bulk/BaseClientUpdateOptions.java | 36 ++++++++++++++ .../model/bulk/ClientDeleteManyOptions.java | 2 +- .../model/bulk/ClientDeleteOneOptions.java | 2 +- .../model/bulk/ClientUpdateManyOptions.java | 2 +- .../model/bulk/ClientUpdateOneOptions.java | 2 +- .../bulk/ConcreteClientDeleteManyOptions.java | 1 - .../test/unit/com/mongodb/AssertUtils.java | 48 +++++++++++++++++++ .../bulk/BaseClientUpdateOptionsTest.java | 12 +++++ .../bulk/ClientDeleteManyOptionsTest.java | 12 +++++ 12 files changed, 131 insertions(+), 6 deletions(-) create mode 100644 driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java create mode 100644 driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java create mode 100644 driver-core/src/test/unit/com/mongodb/AssertUtils.java create mode 100644 driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java create mode 100644 driver-core/src/test/unit/com/mongodb/client/model/bulk/ClientDeleteManyOptionsTest.java diff --git a/build.gradle b/build.gradle index e846ea53d93..df2f70c49de 100644 --- a/build.gradle +++ b/build.gradle @@ -59,6 +59,7 @@ ext { junitBomVersion = '5.10.2' logbackVersion = '1.3.14' graalSdkVersion = '24.0.0' + reflectionsVersion = '0.9.10' gitVersion = getGitVersion() } @@ -128,7 +129,7 @@ configure(scalaProjects) { testImplementation('org.scalatestplus:junit-4-13_%%:3.2.9.0') testImplementation('org.scalatestplus:mockito-3-12_%%:3.2.10.0') testImplementation("ch.qos.logback:logback-classic:$logbackVersion") - testImplementation('org.reflections:reflections:0.9.10') + testImplementation("org.reflections:reflections:$reflectionsVersion") } test{ diff --git a/driver-core/build.gradle b/driver-core/build.gradle index 70061ca2b1e..a44f65bbc1b 100644 --- a/driver-core/build.gradle +++ b/driver-core/build.gradle @@ -60,6 +60,7 @@ dependencies { testImplementation project(':bson').sourceSets.test.output testImplementation('org.junit.jupiter:junit-jupiter-api') + testImplementation("org.reflections:reflections:$reflectionsVersion") testRuntimeOnly "io.netty:netty-tcnative-boringssl-static" classifiers.forEach { diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java new file mode 100644 index 00000000000..7ab33896954 --- /dev/null +++ b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java @@ -0,0 +1,16 @@ +package com.mongodb.client.model.bulk; + +import com.mongodb.annotations.Sealed; +import com.mongodb.client.model.Collation; +import com.mongodb.lang.Nullable; +import org.bson.conversions.Bson; + +@Sealed +interface BaseClientDeleteOptions { + + BaseClientDeleteOptions collation(@Nullable Collation collation); + + BaseClientDeleteOptions hint(@Nullable Bson hint); + + BaseClientDeleteOptions hintString(@Nullable String hintString); +} diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java new file mode 100644 index 00000000000..62bdd460575 --- /dev/null +++ b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java @@ -0,0 +1,36 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mongodb.client.model.bulk; + +import com.mongodb.annotations.Sealed; +import com.mongodb.client.model.Collation; +import com.mongodb.lang.Nullable; +import org.bson.conversions.Bson; + + +@Sealed +interface BaseClientUpdateOptions { + + BaseClientUpdateOptions arrayFilters(@Nullable Iterable arrayFilters); + + BaseClientUpdateOptions collation(@Nullable Collation collation); + + BaseClientUpdateOptions hint(@Nullable Bson hint); + + BaseClientUpdateOptions hintString(@Nullable String hintString); + + BaseClientUpdateOptions upsert(@Nullable Boolean upsert); +} diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteManyOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteManyOptions.java index fc03575c9ad..135ffa6e2db 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteManyOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteManyOptions.java @@ -27,7 +27,7 @@ * @since 5.3 */ @Sealed -public interface ClientDeleteManyOptions { +public interface ClientDeleteManyOptions extends BaseClientDeleteOptions { /** * Creates the default options. * diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java index 6285ee3a1e1..098416c70fe 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java @@ -27,7 +27,7 @@ * @since 5.3 */ @Sealed -public interface ClientDeleteOneOptions { +public interface ClientDeleteOneOptions extends BaseClientDeleteOptions{ /** * Creates the default options. * diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java index 27fee3882e4..ced95362c07 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java @@ -28,7 +28,7 @@ * @since 5.3 */ @Sealed -public interface ClientUpdateManyOptions { +public interface ClientUpdateManyOptions extends BaseClientUpdateOptions { /** * Creates the default options. * diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java index 522f07ed4c9..0a333507750 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java @@ -28,7 +28,7 @@ * @since 5.3 */ @Sealed -public interface ClientUpdateOneOptions { +public interface ClientUpdateOneOptions extends BaseClientUpdateOptions{ /** * Creates the default options. * diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java index 1294ac0b572..743124a61f6 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java @@ -17,7 +17,6 @@ import com.mongodb.client.model.Collation; import com.mongodb.client.model.bulk.ClientDeleteManyOptions; -import com.mongodb.client.model.bulk.ClientDeleteManyOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; diff --git a/driver-core/src/test/unit/com/mongodb/AssertUtils.java b/driver-core/src/test/unit/com/mongodb/AssertUtils.java new file mode 100644 index 00000000000..72c8e9b90cf --- /dev/null +++ b/driver-core/src/test/unit/com/mongodb/AssertUtils.java @@ -0,0 +1,48 @@ +package com.mongodb; + +import org.reflections.Reflections; + +import java.lang.reflect.Method; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class AssertUtils { + + public static void assertSubInterfaceReturnTypes(String packageName, Class baseClass) { + Reflections reflections = new Reflections(packageName); + + Set> subInterfaces = reflections.getSubTypesOf(baseClass).stream() + .filter(Class::isInterface) + .collect(Collectors.toSet()); + + Method[] baseMethods = baseClass.getDeclaredMethods(); + + for (Class subInterface : subInterfaces) { + for (Method baseMethod : baseMethods) { + Method method = assertDoesNotThrow( + () -> subInterface.getDeclaredMethod(baseMethod.getName(), baseMethod.getParameterTypes()), + String.format( + "%s does not override %s. The methods must be copied into the implementing interface.", + subInterface.getName(), + baseMethod.getName() + ) + ); + + assertEquals( + subInterface, + method.getReturnType(), + String.format( + "Method %s in %s does not return %s. " + + "The return type must match the defining class.", + method.getName(), + subInterface.getName(), + subInterface.getName() + ) + ); + } + } + } +} \ No newline at end of file diff --git a/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java new file mode 100644 index 00000000000..0cb165b5d34 --- /dev/null +++ b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java @@ -0,0 +1,12 @@ +package com.mongodb.client.model.bulk; + +import com.mongodb.AssertUtils; +import org.junit.jupiter.api.Test; + +class BaseClientUpdateOptionsTest { + + @Test + void testAllSubInterfacesOverrideMethods() { + AssertUtils.assertSubInterfaceReturnTypes("com.mongodb", BaseClientUpdateOptions.class); + } +} diff --git a/driver-core/src/test/unit/com/mongodb/client/model/bulk/ClientDeleteManyOptionsTest.java b/driver-core/src/test/unit/com/mongodb/client/model/bulk/ClientDeleteManyOptionsTest.java new file mode 100644 index 00000000000..d4f7a5d7f31 --- /dev/null +++ b/driver-core/src/test/unit/com/mongodb/client/model/bulk/ClientDeleteManyOptionsTest.java @@ -0,0 +1,12 @@ +package com.mongodb.client.model.bulk; + +import com.mongodb.AssertUtils; +import org.junit.jupiter.api.Test; + +class ClientDeleteManyOptionsTest { + + @Test + void testAllSubInterfacesOverrideMethods() { + AssertUtils.assertSubInterfaceReturnTypes("com.mongodb", BaseClientDeleteOptions.class); + } +} \ No newline at end of file From 550ff7f835d8fe22186b00b7b1accb65ebf4656a Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Mon, 6 Jan 2025 16:53:04 -0800 Subject: [PATCH 04/22] Fix static check issues. JAVA-5737 --- .../model/bulk/BaseClientDeleteOptions.java | 19 ++++++++++++++++ .../model/bulk/BaseClientUpdateOptions.java | 4 +++- .../model/bulk/ClientUpdateManyOptions.java | 2 +- .../model/bulk/AbstractClientDeleteModel.java | 2 ++ .../model/bulk/AbstractClientUpdateModel.java | 1 + .../bulk/ConcreteClientDeleteManyModel.java | 1 - .../bulk/ConcreteClientUpdateManyModel.java | 2 +- .../bulk/ConcreteClientUpdateManyOptions.java | 1 - .../bulk/ConcreteClientUpdateOneModel.java | 1 + .../operation/ClientBulkWriteOperation.java | 1 - .../test/unit/com/mongodb/AssertUtils.java | 22 ++++++++++++++++--- .../bulk/BaseClientUpdateOptionsTest.java | 16 ++++++++++++++ .../bulk/ClientDeleteManyOptionsTest.java | 18 ++++++++++++++- 13 files changed, 80 insertions(+), 10 deletions(-) diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java index 7ab33896954..d19818cff8e 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java @@ -1,3 +1,19 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.mongodb.client.model.bulk; import com.mongodb.annotations.Sealed; @@ -5,6 +21,9 @@ import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; +/** + *

This class is not part of the public API and may be removed or changed at any time

+ */ @Sealed interface BaseClientDeleteOptions { diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java index 62bdd460575..32aca7586b6 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java @@ -20,7 +20,9 @@ import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; - +/** + *

This class is not part of the public API and may be removed or changed at any time

+ */ @Sealed interface BaseClientUpdateOptions { diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java index ced95362c07..a74b92d7aeb 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java @@ -45,7 +45,7 @@ static ClientUpdateManyOptions clientUpdateManyOptions() { * @return {@code this}. * @see Filters */ - ClientUpdateManyOptions arrayFilters(@Nullable Iterable arrayFilters); + BaseClientUpdateOptions arrayFilters(@Nullable Iterable arrayFilters); /** * Sets the collation. diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java index debd939a6e1..2f29c9435a2 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java @@ -15,6 +15,7 @@ */ package com.mongodb.internal.client.model.bulk; +import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; /** @@ -33,6 +34,7 @@ public final Bson getFilter() { abstract String getToStringDescription(); + @Nullable abstract T getOptions(); @Override diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java index c1a208ed668..e2a185cc9f0 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java @@ -58,6 +58,7 @@ public final Optional> getUpdatePipeline() { abstract String getToStringDescription(); + @Nullable abstract T getOptions(); @Override diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java index 88185c2dbba..281f09eb536 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java @@ -16,7 +16,6 @@ package com.mongodb.internal.client.model.bulk; import com.mongodb.client.model.bulk.ClientDeleteManyOptions; -import com.mongodb.client.model.bulk.ClientDeleteOneOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java index eefcb30a968..c469d3b0a6b 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java @@ -16,7 +16,6 @@ package com.mongodb.internal.client.model.bulk; import com.mongodb.client.model.bulk.ClientUpdateManyOptions; -import com.mongodb.client.model.bulk.ClientUpdateOneOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; @@ -37,6 +36,7 @@ public ConcreteClientUpdateManyModel( this.options = options == null ? ConcreteClientUpdateManyOptions.MUTABLE_EMPTY : (ConcreteClientUpdateManyOptions) options; } + @Nullable public ConcreteClientUpdateManyOptions getOptions() { return options; } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java index 29756075564..367f6b49cad 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java @@ -17,7 +17,6 @@ import com.mongodb.client.model.Collation; import com.mongodb.client.model.bulk.ClientUpdateManyOptions; -import com.mongodb.client.model.bulk.ClientUpdateManyOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java index 94fb844df5d..ef28eedc730 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java @@ -36,6 +36,7 @@ public ConcreteClientUpdateOneModel( this.options = options == null ? ConcreteClientUpdateOneOptions.MUTABLE_EMPTY : (ConcreteClientUpdateOneOptions) options; } + @Nullable public ConcreteClientUpdateOneOptions getOptions() { return options; } diff --git a/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java b/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java index f1f381bcc5b..c763a4b4657 100644 --- a/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java +++ b/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java @@ -1264,7 +1264,6 @@ private void encodeUpdateWriteModelInternals(final BsonWriter writer, final Abst private void encodeWriteModelInternals(final BsonWriter writer, final ConcreteClientUpdateOneModel model) { encodeUpdateWriteModelInternals(writer, model); - ConcreteClientUpdateOneOptions options = model.getOptions(); options.getArrayFilters().ifPresent(value -> { writer.writeStartArray("arrayFilters"); diff --git a/driver-core/src/test/unit/com/mongodb/AssertUtils.java b/driver-core/src/test/unit/com/mongodb/AssertUtils.java index 72c8e9b90cf..e31f3f30a15 100644 --- a/driver-core/src/test/unit/com/mongodb/AssertUtils.java +++ b/driver-core/src/test/unit/com/mongodb/AssertUtils.java @@ -1,3 +1,19 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.mongodb; import org.reflections.Reflections; @@ -11,9 +27,9 @@ public class AssertUtils { - public static void assertSubInterfaceReturnTypes(String packageName, Class baseClass) { + public static void assertSubInterfaceReturnTypes(final String packageName, + final Class baseClass) { Reflections reflections = new Reflections(packageName); - Set> subInterfaces = reflections.getSubTypesOf(baseClass).stream() .filter(Class::isInterface) .collect(Collectors.toSet()); @@ -45,4 +61,4 @@ public static void assertSubInterfaceReturnTypes(String packageName, Class Date: Mon, 6 Jan 2025 17:46:43 -0800 Subject: [PATCH 05/22] Remove Nullable. JAVA-5737 --- .../client/model/bulk/AbstractClientDeleteModel.java | 2 -- .../client/model/bulk/AbstractClientUpdateModel.java | 1 - .../client/model/bulk/ConcreteClientDeleteManyModel.java | 5 ++--- .../client/model/bulk/ConcreteClientDeleteOneModel.java | 3 +-- .../client/model/bulk/ConcreteClientUpdateManyModel.java | 3 +-- .../client/model/bulk/ConcreteClientUpdateOneModel.java | 3 +-- .../test/functional/com/mongodb/client/CrudProseTest.java | 6 +++--- 7 files changed, 8 insertions(+), 15 deletions(-) diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java index 2f29c9435a2..debd939a6e1 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java @@ -15,7 +15,6 @@ */ package com.mongodb.internal.client.model.bulk; -import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; /** @@ -34,7 +33,6 @@ public final Bson getFilter() { abstract String getToStringDescription(); - @Nullable abstract T getOptions(); @Override diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java index e2a185cc9f0..c1a208ed668 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java @@ -58,7 +58,6 @@ public final Optional> getUpdatePipeline() { abstract String getToStringDescription(); - @Nullable abstract T getOptions(); @Override diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java index 281f09eb536..6dcae30d8df 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java @@ -23,14 +23,13 @@ * This class is not part of the public API and may be removed or changed at any time. */ public final class ConcreteClientDeleteManyModel extends AbstractClientDeleteModel implements ClientWriteModel { - private final @Nullable ConcreteClientDeleteManyOptions options; + private final ConcreteClientDeleteManyOptions options; - public ConcreteClientDeleteManyModel(final Bson filter, final @Nullable ClientDeleteManyOptions options) { + public ConcreteClientDeleteManyModel(final Bson filter, @Nullable final ClientDeleteManyOptions options) { super(filter); this.options = options == null ? ConcreteClientDeleteManyOptions.MUTABLE_EMPTY : (ConcreteClientDeleteManyOptions) options; } - @Nullable public ConcreteClientDeleteManyOptions getOptions() { return options; } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java index 74f24261afc..c3752df1887 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java @@ -23,14 +23,13 @@ * This class is not part of the public API and may be removed or changed at any time. */ public final class ConcreteClientDeleteOneModel extends AbstractClientDeleteModel implements ClientWriteModel { - private final @Nullable ConcreteClientDeleteOneOptions options; + private final ConcreteClientDeleteOneOptions options; public ConcreteClientDeleteOneModel(final Bson filter, @Nullable final ClientDeleteOneOptions options) { super(filter); this.options = options == null ? ConcreteClientDeleteOneOptions.MUTABLE_EMPTY : (ConcreteClientDeleteOneOptions) options; } - @Nullable public ConcreteClientDeleteOneOptions getOptions() { return options; } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java index c469d3b0a6b..16e449ce590 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java @@ -23,7 +23,7 @@ * This class is not part of the public API and may be removed or changed at any time. */ public final class ConcreteClientUpdateManyModel extends AbstractClientUpdateModel implements ClientWriteModel { - private final @Nullable ConcreteClientUpdateManyOptions options; + private final ConcreteClientUpdateManyOptions options; public ConcreteClientUpdateManyModel( final Bson filter, @@ -36,7 +36,6 @@ public ConcreteClientUpdateManyModel( this.options = options == null ? ConcreteClientUpdateManyOptions.MUTABLE_EMPTY : (ConcreteClientUpdateManyOptions) options; } - @Nullable public ConcreteClientUpdateManyOptions getOptions() { return options; } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java index ef28eedc730..e659c3721ff 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java @@ -23,7 +23,7 @@ * This class is not part of the public API and may be removed or changed at any time. */ public final class ConcreteClientUpdateOneModel extends AbstractClientUpdateModel implements ClientWriteModel { - private final @Nullable ConcreteClientUpdateOneOptions options; + private final ConcreteClientUpdateOneOptions options; public ConcreteClientUpdateOneModel( final Bson filter, @@ -36,7 +36,6 @@ public ConcreteClientUpdateOneModel( this.options = options == null ? ConcreteClientUpdateOneOptions.MUTABLE_EMPTY : (ConcreteClientUpdateOneOptions) options; } - @Nullable public ConcreteClientUpdateOneOptions getOptions() { return options; } diff --git a/driver-sync/src/test/functional/com/mongodb/client/CrudProseTest.java b/driver-sync/src/test/functional/com/mongodb/client/CrudProseTest.java index 101865079e0..7138cdfe67e 100644 --- a/driver-sync/src/test/functional/com/mongodb/client/CrudProseTest.java +++ b/driver-sync/src/test/functional/com/mongodb/client/CrudProseTest.java @@ -72,7 +72,7 @@ import static com.mongodb.client.Fixture.getPrimary; import static com.mongodb.client.model.bulk.ClientBulkWriteOptions.clientBulkWriteOptions; import static com.mongodb.client.model.bulk.ClientNamespacedWriteModel.insertOne; -import static com.mongodb.client.model.bulk.ClientUpdateOptions.clientUpdateOptions; +import static com.mongodb.client.model.bulk.ClientUpdateOneOptions.clientUpdateOneOptions; import static java.lang.String.join; import static java.util.Arrays.asList; import static java.util.Collections.nCopies; @@ -297,12 +297,12 @@ private void assertBulkWriteHandlesCursorRequiringGetMore(final boolean transact NAMESPACE, Filters.eq(join("", nCopies(maxBsonObjectSize / 2, "a"))), Updates.set("x", 1), - clientUpdateOptions().upsert(true)), + clientUpdateOneOptions().upsert(true)), ClientNamespacedWriteModel.updateOne( NAMESPACE, Filters.eq(join("", nCopies(maxBsonObjectSize / 2, "b"))), Updates.set("x", 1), - clientUpdateOptions().upsert(true))), + clientUpdateOneOptions().upsert(true))), clientBulkWriteOptions().verboseResults(true) ); From c68bab4e0c5e7b90e18a896c09cfcf2498011a42 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Mon, 6 Jan 2025 18:12:02 -0800 Subject: [PATCH 06/22] Remove Sealed. JAVA-5737 --- .../com/mongodb/client/model/bulk/BaseClientDeleteOptions.java | 2 -- .../com/mongodb/client/model/bulk/BaseClientUpdateOptions.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java index d19818cff8e..146df14319f 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java @@ -16,7 +16,6 @@ package com.mongodb.client.model.bulk; -import com.mongodb.annotations.Sealed; import com.mongodb.client.model.Collation; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; @@ -24,7 +23,6 @@ /** *

This class is not part of the public API and may be removed or changed at any time

*/ -@Sealed interface BaseClientDeleteOptions { BaseClientDeleteOptions collation(@Nullable Collation collation); diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java index 32aca7586b6..38dc1bb61d2 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java @@ -15,7 +15,6 @@ */ package com.mongodb.client.model.bulk; -import com.mongodb.annotations.Sealed; import com.mongodb.client.model.Collation; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; @@ -23,7 +22,6 @@ /** *

This class is not part of the public API and may be removed or changed at any time

*/ -@Sealed interface BaseClientUpdateOptions { BaseClientUpdateOptions arrayFilters(@Nullable Iterable arrayFilters); From 4a40ee5c06e3ddf56f110b174e9ca9c06dc1bf1a Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Mon, 6 Jan 2025 22:40:59 -0800 Subject: [PATCH 07/22] Remove Base classes from Scala API consistency test. JAVA-5737 --- .../scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/driver-scala/src/test/scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala b/driver-scala/src/test/scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala index a1ee2467f9d..f7d20a3ec9a 100644 --- a/driver-scala/src/test/scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala +++ b/driver-scala/src/test/scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala @@ -90,7 +90,9 @@ class ApiAliasAndCompanionSpec extends BaseSpec { "SyncMongoCluster", "SyncGridFSBucket", "SyncMongoDatabase", - "SyncClientEncryption" + "SyncClientEncryption", + "BaseClientUpdateOptions", + "BaseClientDeleteOptions" ) val scalaExclusions = Set( "BuildInfo", From ce6088520be75bf80a2e165e41ae5addfd2eadd8 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Mon, 6 Jan 2025 22:44:52 -0800 Subject: [PATCH 08/22] Rename Assertions class. JAVA-5737 --- .../com/mongodb/{AssertUtils.java => MongoAssertions.java} | 2 +- .../client/model/bulk/BaseClientUpdateOptionsTest.java | 4 ++-- .../client/model/bulk/ClientDeleteManyOptionsTest.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename driver-core/src/test/unit/com/mongodb/{AssertUtils.java => MongoAssertions.java} (98%) diff --git a/driver-core/src/test/unit/com/mongodb/AssertUtils.java b/driver-core/src/test/unit/com/mongodb/MongoAssertions.java similarity index 98% rename from driver-core/src/test/unit/com/mongodb/AssertUtils.java rename to driver-core/src/test/unit/com/mongodb/MongoAssertions.java index e31f3f30a15..af16af7ab14 100644 --- a/driver-core/src/test/unit/com/mongodb/AssertUtils.java +++ b/driver-core/src/test/unit/com/mongodb/MongoAssertions.java @@ -25,7 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; -public class AssertUtils { +public class MongoAssertions { public static void assertSubInterfaceReturnTypes(final String packageName, final Class baseClass) { diff --git a/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java index 2c772af6bf8..1a326fd58c2 100644 --- a/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java +++ b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java @@ -16,13 +16,13 @@ package com.mongodb.client.model.bulk; -import com.mongodb.AssertUtils; +import com.mongodb.MongoAssertions; import org.junit.jupiter.api.Test; class BaseClientUpdateOptionsTest { @Test void testAllSubInterfacesOverrideMethods() { - AssertUtils.assertSubInterfaceReturnTypes("com.mongodb", BaseClientUpdateOptions.class); + MongoAssertions.assertSubInterfaceReturnTypes("com.mongodb", BaseClientUpdateOptions.class); } } diff --git a/driver-core/src/test/unit/com/mongodb/client/model/bulk/ClientDeleteManyOptionsTest.java b/driver-core/src/test/unit/com/mongodb/client/model/bulk/ClientDeleteManyOptionsTest.java index e2e9922f406..ccb62825a5a 100644 --- a/driver-core/src/test/unit/com/mongodb/client/model/bulk/ClientDeleteManyOptionsTest.java +++ b/driver-core/src/test/unit/com/mongodb/client/model/bulk/ClientDeleteManyOptionsTest.java @@ -16,13 +16,13 @@ package com.mongodb.client.model.bulk; -import com.mongodb.AssertUtils; +import com.mongodb.MongoAssertions; import org.junit.jupiter.api.Test; class ClientDeleteManyOptionsTest { @Test void testAllSubInterfacesOverrideMethods() { - AssertUtils.assertSubInterfaceReturnTypes("com.mongodb", BaseClientDeleteOptions.class); + MongoAssertions.assertSubInterfaceReturnTypes("com.mongodb", BaseClientDeleteOptions.class); } } From 25c8e8c0702bcdd0116e7fb26e8b9d3758aa40a9 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Mon, 6 Jan 2025 22:45:57 -0800 Subject: [PATCH 09/22] Make class final. JAVA-5737 --- driver-core/src/test/unit/com/mongodb/MongoAssertions.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/driver-core/src/test/unit/com/mongodb/MongoAssertions.java b/driver-core/src/test/unit/com/mongodb/MongoAssertions.java index af16af7ab14..17b1491842c 100644 --- a/driver-core/src/test/unit/com/mongodb/MongoAssertions.java +++ b/driver-core/src/test/unit/com/mongodb/MongoAssertions.java @@ -25,7 +25,11 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; -public class MongoAssertions { +public final class MongoAssertions { + + private MongoAssertions() { + //NOP + } public static void assertSubInterfaceReturnTypes(final String packageName, final Class baseClass) { From f0f7ed37ce837b70f3d0cd67150f20498116f9a3 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Mon, 6 Jan 2025 23:24:13 -0800 Subject: [PATCH 10/22] Fix return type. JAVA-5737 --- .../com/mongodb/client/model/bulk/ClientUpdateManyOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java index a74b92d7aeb..ced95362c07 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java @@ -45,7 +45,7 @@ static ClientUpdateManyOptions clientUpdateManyOptions() { * @return {@code this}. * @see Filters */ - BaseClientUpdateOptions arrayFilters(@Nullable Iterable arrayFilters); + ClientUpdateManyOptions arrayFilters(@Nullable Iterable arrayFilters); /** * Sets the collation. From 554345d20a7188d57db07a968d7bdf02f49c58a0 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Tue, 7 Jan 2025 15:56:50 -0800 Subject: [PATCH 11/22] Add Api consistency exclusion. JAVA-5710 --- .../scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/driver-scala/src/test/scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala b/driver-scala/src/test/scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala index f7d20a3ec9a..52c552cfde5 100644 --- a/driver-scala/src/test/scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala +++ b/driver-scala/src/test/scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala @@ -92,7 +92,8 @@ class ApiAliasAndCompanionSpec extends BaseSpec { "SyncMongoDatabase", "SyncClientEncryption", "BaseClientUpdateOptions", - "BaseClientDeleteOptions" + "BaseClientDeleteOptions", + "MongoAssertions" ) val scalaExclusions = Set( "BuildInfo", From 374dff84733c37d46a10488cf67bc5b6a66b602b Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Tue, 7 Jan 2025 18:36:19 -0800 Subject: [PATCH 12/22] Rename classes. JAVA-5737 --- ...eteManyOptionsTest.java => BaseClientDeleteOptionsTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename driver-core/src/test/unit/com/mongodb/client/model/bulk/{ClientDeleteManyOptionsTest.java => BaseClientDeleteOptionsTest.java} (96%) diff --git a/driver-core/src/test/unit/com/mongodb/client/model/bulk/ClientDeleteManyOptionsTest.java b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientDeleteOptionsTest.java similarity index 96% rename from driver-core/src/test/unit/com/mongodb/client/model/bulk/ClientDeleteManyOptionsTest.java rename to driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientDeleteOptionsTest.java index ccb62825a5a..2366e11b46e 100644 --- a/driver-core/src/test/unit/com/mongodb/client/model/bulk/ClientDeleteManyOptionsTest.java +++ b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientDeleteOptionsTest.java @@ -19,7 +19,7 @@ import com.mongodb.MongoAssertions; import org.junit.jupiter.api.Test; -class ClientDeleteManyOptionsTest { +class BaseClientDeleteOptionsTest { @Test void testAllSubInterfacesOverrideMethods() { From 3039e17942b2145f82bccf1394ab0db14a4461ce Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Wed, 8 Jan 2025 14:25:00 -0800 Subject: [PATCH 13/22] Make Options generic. JAVA-5737 --- .../model/bulk/BaseClientDeleteOptions.java | 3 - .../model/bulk/BaseClientUpdateOptions.java | 3 - .../model/bulk/ClientDeleteManyOptions.java | 3 + .../model/bulk/ClientDeleteOneOptions.java | 3 + .../bulk/ClientNamespacedWriteModel.java | 6 +- .../model/bulk/ClientReplaceOptions.java | 73 ------------ .../model/bulk/ClientUpdateManyOptions.java | 5 + .../model/bulk/ClientUpdateOneOptions.java | 5 + .../model/bulk/AbstractClientDeleteModel.java | 12 +- .../model/bulk/AbstractClientUpdateModel.java | 13 ++- .../bulk/ConcreteClientDeleteManyModel.java | 9 +- .../bulk/ConcreteClientDeleteOneModel.java | 9 +- .../bulk/ConcreteClientReplaceOneModel.java | 10 +- .../bulk/ConcreteClientReplaceOptions.java | 108 ------------------ .../bulk/ConcreteClientUpdateManyModel.java | 12 +- .../bulk/ConcreteClientUpdateOneModel.java | 10 +- .../operation/ClientBulkWriteOperation.java | 4 +- .../client/unified/UnifiedCrudHelper.java | 8 +- 18 files changed, 53 insertions(+), 243 deletions(-) delete mode 100644 driver-core/src/main/com/mongodb/client/model/bulk/ClientReplaceOptions.java delete mode 100644 driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOptions.java diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java index 146df14319f..d50a1bc77b5 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java @@ -20,9 +20,6 @@ import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; -/** - *

This class is not part of the public API and may be removed or changed at any time

- */ interface BaseClientDeleteOptions { BaseClientDeleteOptions collation(@Nullable Collation collation); diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java index 38dc1bb61d2..c0ae9c4ac44 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java @@ -19,9 +19,6 @@ import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; -/** - *

This class is not part of the public API and may be removed or changed at any time

- */ interface BaseClientUpdateOptions { BaseClientUpdateOptions arrayFilters(@Nullable Iterable arrayFilters); diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteManyOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteManyOptions.java index 135ffa6e2db..f899c5244c3 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteManyOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteManyOptions.java @@ -43,6 +43,7 @@ static ClientDeleteManyOptions clientDeleteManyOptions() { * @param collation The collation. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientDeleteManyOptions collation(@Nullable Collation collation); /** @@ -52,6 +53,7 @@ static ClientDeleteManyOptions clientDeleteManyOptions() { * @param hint The index specification. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientDeleteManyOptions hint(@Nullable Bson hint); /** @@ -61,5 +63,6 @@ static ClientDeleteManyOptions clientDeleteManyOptions() { * @param hintString The index name. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientDeleteManyOptions hintString(@Nullable String hintString); } diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java index 098416c70fe..1790ca932fe 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java @@ -43,6 +43,7 @@ static ClientDeleteOneOptions clientDeleteOneOptions() { * @param collation The collation. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientDeleteOneOptions collation(@Nullable Collation collation); /** @@ -52,6 +53,7 @@ static ClientDeleteOneOptions clientDeleteOneOptions() { * @param hint The index specification. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientDeleteOneOptions hint(@Nullable Bson hint); /** @@ -61,5 +63,6 @@ static ClientDeleteOneOptions clientDeleteOneOptions() { * @param hintString The index name. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientDeleteOneOptions hintString(@Nullable String hintString); } diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientNamespacedWriteModel.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientNamespacedWriteModel.java index ae04a091a25..886e7cc4367 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientNamespacedWriteModel.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientNamespacedWriteModel.java @@ -220,8 +220,8 @@ static ClientNamespacedUpdateManyModel updateMany( /** * Creates a model for replacing at most one document in the {@code namespace} matching the {@code filter}. - * This method is functionally equivalent to {@link #replaceOne(MongoNamespace, Bson, Object, ClientReplaceOptions)} - * with the {@linkplain ClientReplaceOptions#clientReplaceOptions() default options}. + * This method is functionally equivalent to {@link #replaceOne(MongoNamespace, Bson, Object, ClientReplaceOneOptions)} + * with the {@linkplain ClientReplaceOneOptions#clientReplaceOptions() default options}. * * @param namespace The namespace. * @param filter The filter. @@ -251,7 +251,7 @@ static ClientNamespacedReplaceOneModel replaceOne(final MongoNamespa * @see Filters */ static ClientNamespacedReplaceOneModel replaceOne( - final MongoNamespace namespace, final Bson filter, final TDocument replacement, final ClientReplaceOptions options) { + final MongoNamespace namespace, final Bson filter, final TDocument replacement, final ClientReplaceOneOptions options) { notNull("namespace", namespace); notNull("filter", filter); notNull("replacement", replacement); diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientReplaceOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientReplaceOptions.java deleted file mode 100644 index b6ad2c9c048..00000000000 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientReplaceOptions.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2008-present MongoDB, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.mongodb.client.model.bulk; - -import com.mongodb.annotations.Sealed; -import com.mongodb.client.model.Collation; -import com.mongodb.internal.client.model.bulk.ConcreteClientReplaceOptions; -import com.mongodb.lang.Nullable; -import org.bson.conversions.Bson; - -/** - * The options to apply when replacing documents. - * - * @since 5.3 - */ -@Sealed -public interface ClientReplaceOptions { - /** - * Creates the default options. - * - * @return The default options. - */ - static ClientReplaceOptions clientReplaceOptions() { - return new ConcreteClientReplaceOptions(); - } - - /** - * Sets the collation. - * - * @param collation The collation. {@code null} represents the server default. - * @return {@code this}. - */ - ClientReplaceOptions collation(@Nullable Collation collation); - - /** - * Sets the index specification, - * {@code null}-ifies {@linkplain #hintString(String) hint string}. - * - * @param hint The index specification. {@code null} represents the server default. - * @return {@code this}. - */ - ClientReplaceOptions hint(@Nullable Bson hint); - - /** - * Sets the index name, - * {@code null}-ifies {@linkplain #hint(Bson) hint}. - * - * @param hintString The index name. {@code null} represents the server default. - * @return {@code this}. - */ - ClientReplaceOptions hintString(@Nullable String hintString); - - /** - * Enables or disables creation of a document if no documents match the filter. - * - * @param upsert The upsert flag. {@code null} represents the server default. - * @return {@code this}. - */ - ClientReplaceOptions upsert(@Nullable Boolean upsert); -} diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java index ced95362c07..fd0b0d12f08 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateManyOptions.java @@ -45,6 +45,7 @@ static ClientUpdateManyOptions clientUpdateManyOptions() { * @return {@code this}. * @see Filters */ + @Override ClientUpdateManyOptions arrayFilters(@Nullable Iterable arrayFilters); /** @@ -53,6 +54,7 @@ static ClientUpdateManyOptions clientUpdateManyOptions() { * @param collation The collation. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientUpdateManyOptions collation(@Nullable Collation collation); /** @@ -62,6 +64,7 @@ static ClientUpdateManyOptions clientUpdateManyOptions() { * @param hint The index specification. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientUpdateManyOptions hint(@Nullable Bson hint); /** @@ -71,6 +74,7 @@ static ClientUpdateManyOptions clientUpdateManyOptions() { * @param hintString The index name. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientUpdateManyOptions hintString(@Nullable String hintString); /** @@ -79,5 +83,6 @@ static ClientUpdateManyOptions clientUpdateManyOptions() { * @param upsert The upsert flag. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientUpdateManyOptions upsert(@Nullable Boolean upsert); } diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java index 0a333507750..a0e85e065e9 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientUpdateOneOptions.java @@ -45,6 +45,7 @@ static ClientUpdateOneOptions clientUpdateOneOptions() { * @return {@code this}. * @see Filters */ + @Override ClientUpdateOneOptions arrayFilters(@Nullable Iterable arrayFilters); /** @@ -53,6 +54,7 @@ static ClientUpdateOneOptions clientUpdateOneOptions() { * @param collation The collation. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientUpdateOneOptions collation(@Nullable Collation collation); /** @@ -62,6 +64,7 @@ static ClientUpdateOneOptions clientUpdateOneOptions() { * @param hint The index specification. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientUpdateOneOptions hint(@Nullable Bson hint); /** @@ -71,6 +74,7 @@ static ClientUpdateOneOptions clientUpdateOneOptions() { * @param hintString The index name. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientUpdateOneOptions hintString(@Nullable String hintString); /** @@ -79,5 +83,6 @@ static ClientUpdateOneOptions clientUpdateOneOptions() { * @param upsert The upsert flag. {@code null} represents the server default. * @return {@code this}. */ + @Override ClientUpdateOneOptions upsert(@Nullable Boolean upsert); } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java index debd939a6e1..0fc559695c7 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java @@ -22,24 +22,28 @@ */ public abstract class AbstractClientDeleteModel implements ClientWriteModel { private final Bson filter; + private final T options; - AbstractClientDeleteModel(final Bson filter) { + AbstractClientDeleteModel(final Bson filter, final T options) { this.filter = filter; + this.options = options; } public final Bson getFilter() { return filter; } - abstract String getToStringDescription(); + public final T getOptions() { + return options; + } - abstract T getOptions(); + abstract String getToStringDescription(); @Override public final String toString() { return getToStringDescription() + "{filter=" + filter - + ", options=" + getOptions() + + ", options=" + options + '}'; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java index c1a208ed668..1ba7023140e 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java @@ -32,16 +32,19 @@ public abstract class AbstractClientUpdateModel { private final Bson update; @Nullable private final Iterable updatePipeline; + private final T options; AbstractClientUpdateModel( final Bson filter, @Nullable final Bson update, - @Nullable final Iterable updatePipeline) { + @Nullable final Iterable updatePipeline, + final T options) { this.filter = filter; assertTrue(update == null ^ updatePipeline == null); this.update = update; this.updatePipeline = updatePipeline; + this.options = options; } public final Bson getFilter() { @@ -56,16 +59,18 @@ public final Optional> getUpdatePipeline() { return ofNullable(updatePipeline); } - abstract String getToStringDescription(); + public final T getOptions() { + return options; + } - abstract T getOptions(); + abstract String getToStringDescription(); @Override public final String toString() { return getToStringDescription() + "{filter=" + filter + ", update=" + (update != null ? update : updatePipeline) - + ", options=" + getOptions() + + ", options=" + options + '}'; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java index 6dcae30d8df..cce38f633c8 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java @@ -23,15 +23,8 @@ * This class is not part of the public API and may be removed or changed at any time. */ public final class ConcreteClientDeleteManyModel extends AbstractClientDeleteModel implements ClientWriteModel { - private final ConcreteClientDeleteManyOptions options; - public ConcreteClientDeleteManyModel(final Bson filter, @Nullable final ClientDeleteManyOptions options) { - super(filter); - this.options = options == null ? ConcreteClientDeleteManyOptions.MUTABLE_EMPTY : (ConcreteClientDeleteManyOptions) options; - } - - public ConcreteClientDeleteManyOptions getOptions() { - return options; + super(filter, options == null ? ConcreteClientDeleteManyOptions.MUTABLE_EMPTY : (ConcreteClientDeleteManyOptions) options); } @Override diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java index c3752df1887..692cfb5719e 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java @@ -23,15 +23,8 @@ * This class is not part of the public API and may be removed or changed at any time. */ public final class ConcreteClientDeleteOneModel extends AbstractClientDeleteModel implements ClientWriteModel { - private final ConcreteClientDeleteOneOptions options; - public ConcreteClientDeleteOneModel(final Bson filter, @Nullable final ClientDeleteOneOptions options) { - super(filter); - this.options = options == null ? ConcreteClientDeleteOneOptions.MUTABLE_EMPTY : (ConcreteClientDeleteOneOptions) options; - } - - public ConcreteClientDeleteOneOptions getOptions() { - return options; + super(filter, options == null ? ConcreteClientDeleteOneOptions.MUTABLE_EMPTY : (ConcreteClientDeleteOneOptions) options); } @Override diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOneModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOneModel.java index 3bdf08d424a..7102fe6257d 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOneModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOneModel.java @@ -15,7 +15,7 @@ */ package com.mongodb.internal.client.model.bulk; -import com.mongodb.client.model.bulk.ClientReplaceOptions; +import com.mongodb.client.model.bulk.ClientReplaceOneOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; @@ -25,12 +25,12 @@ public final class ConcreteClientReplaceOneModel implements ClientWriteModel { private final Bson filter; private final Object replacement; - private final ConcreteClientReplaceOptions options; + private final ConcreteClientReplaceOneOptions options; - public ConcreteClientReplaceOneModel(final Bson filter, final Object replacement, @Nullable final ClientReplaceOptions options) { + public ConcreteClientReplaceOneModel(final Bson filter, final Object replacement, @Nullable final ClientReplaceOneOptions options) { this.filter = filter; this.replacement = replacement; - this.options = options == null ? ConcreteClientReplaceOptions.MUTABLE_EMPTY : (ConcreteClientReplaceOptions) options; + this.options = options == null ? ConcreteClientReplaceOneOptions.MUTABLE_EMPTY : (ConcreteClientReplaceOneOptions) options; } public Bson getFilter() { @@ -41,7 +41,7 @@ public Object getReplacement() { return replacement; } - public ConcreteClientReplaceOptions getOptions() { + public ConcreteClientReplaceOneOptions getOptions() { return options; } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOptions.java deleted file mode 100644 index 703e6b48df0..00000000000 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOptions.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2008-present MongoDB, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.mongodb.internal.client.model.bulk; - -import com.mongodb.client.model.Collation; -import com.mongodb.client.model.bulk.ClientReplaceOptions; -import com.mongodb.lang.Nullable; -import org.bson.conversions.Bson; - -import java.util.Optional; - -import static java.util.Optional.ofNullable; - -/** - * This class is not part of the public API and may be removed or changed at any time. - */ -public final class ConcreteClientReplaceOptions implements ClientReplaceOptions { - static final ConcreteClientReplaceOptions MUTABLE_EMPTY = new ConcreteClientReplaceOptions(); - - @Nullable - private Collation collation; - @Nullable - private Bson hint; - @Nullable - private String hintString; - @Nullable - private Boolean upsert; - - public ConcreteClientReplaceOptions() { - } - - @Override - public ClientReplaceOptions collation(@Nullable final Collation collation) { - this.collation = collation; - return this; - } - - /** - * @see #collation(Collation) - */ - public Optional getCollation() { - return ofNullable(collation); - } - - @Override - public ClientReplaceOptions hint(@Nullable final Bson hint) { - this.hint = hint; - this.hintString = null; - return this; - } - - /** - * @see #hint(Bson) - */ - public Optional getHint() { - return ofNullable(hint); - } - - @Override - public ClientReplaceOptions hintString(@Nullable final String hintString) { - this.hintString = hintString; - this.hint = null; - return this; - } - - /** - * @see #hintString(String) - */ - public Optional getHintString() { - return ofNullable(hintString); - } - - @Override - public ClientReplaceOptions upsert(@Nullable final Boolean upsert) { - this.upsert = upsert; - return this; - } - - /** - * @see #upsert(Boolean) - */ - public Optional isUpsert() { - return ofNullable(upsert); - } - - @Override - public String toString() { - return "ClientReplaceOptions{" - + "collation=" + collation - + ", hint=" + hint - + ", hintString='" + hintString + '\'' - + ", upsert=" + upsert - + '}'; - } -} diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java index 16e449ce590..e39d38f60ab 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java @@ -23,8 +23,6 @@ * This class is not part of the public API and may be removed or changed at any time. */ public final class ConcreteClientUpdateManyModel extends AbstractClientUpdateModel implements ClientWriteModel { - private final ConcreteClientUpdateManyOptions options; - public ConcreteClientUpdateManyModel( final Bson filter, @Nullable @@ -32,18 +30,12 @@ public ConcreteClientUpdateManyModel( @Nullable final Iterable updatePipeline, @Nullable final ClientUpdateManyOptions options) { - super(filter, update, updatePipeline); - this.options = options == null ? ConcreteClientUpdateManyOptions.MUTABLE_EMPTY : (ConcreteClientUpdateManyOptions) options; - } - - public ConcreteClientUpdateManyOptions getOptions() { - return options; + super(filter, update, updatePipeline, + options == null ? ConcreteClientUpdateManyOptions.MUTABLE_EMPTY : (ConcreteClientUpdateManyOptions) options); } @Override String getToStringDescription() { return "ClientUpdateManyModel"; } - - } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java index e659c3721ff..96c74ed86f6 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java @@ -23,8 +23,6 @@ * This class is not part of the public API and may be removed or changed at any time. */ public final class ConcreteClientUpdateOneModel extends AbstractClientUpdateModel implements ClientWriteModel { - private final ConcreteClientUpdateOneOptions options; - public ConcreteClientUpdateOneModel( final Bson filter, @Nullable @@ -32,12 +30,8 @@ public ConcreteClientUpdateOneModel( @Nullable final Iterable updatePipeline, @Nullable final ClientUpdateOneOptions options) { - super(filter, update, updatePipeline); - this.options = options == null ? ConcreteClientUpdateOneOptions.MUTABLE_EMPTY : (ConcreteClientUpdateOneOptions) options; - } - - public ConcreteClientUpdateOneOptions getOptions() { - return options; + super(filter, update, updatePipeline, + options == null ? ConcreteClientUpdateOneOptions.MUTABLE_EMPTY : (ConcreteClientUpdateOneOptions) options); } @Override diff --git a/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java b/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java index c763a4b4657..4cc05c3ad79 100644 --- a/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java +++ b/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java @@ -71,7 +71,7 @@ import com.mongodb.internal.client.model.bulk.ConcreteClientNamespacedUpdateManyModel; import com.mongodb.internal.client.model.bulk.ConcreteClientNamespacedUpdateOneModel; import com.mongodb.internal.client.model.bulk.ConcreteClientReplaceOneModel; -import com.mongodb.internal.client.model.bulk.ConcreteClientReplaceOptions; +import com.mongodb.internal.client.model.bulk.ConcreteClientReplaceOneOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateManyModel; import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateManyOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateOneModel; @@ -1309,7 +1309,7 @@ private void encodeWriteModelInternals(final BsonBinaryWriter writer, final Conc encodeUsingRegistry(writer, model.getFilter()); writer.writeName("updateMods"); encodeUsingRegistry(writer, model.getReplacement(), COLLECTIBLE_DOCUMENT_ENCODER_CONTEXT); - ConcreteClientReplaceOptions options = model.getOptions(); + ConcreteClientReplaceOneOptions options = model.getOptions(); options.getCollation().ifPresent(value -> { writer.writeName("collation"); encodeUsingRegistry(writer, value.asDocument()); 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 bb63b3af352..1120632c880 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 @@ -79,7 +79,7 @@ import com.mongodb.client.model.bulk.ClientBulkWriteOptions; import com.mongodb.client.model.bulk.ClientDeleteManyOptions; import com.mongodb.client.model.bulk.ClientDeleteOneOptions; -import com.mongodb.client.model.bulk.ClientReplaceOptions; +import com.mongodb.client.model.bulk.ClientReplaceOneOptions; import com.mongodb.client.model.bulk.ClientUpdateManyOptions; import com.mongodb.client.model.bulk.ClientUpdateOneOptions; import com.mongodb.client.model.bulk.ClientNamespacedWriteModel; @@ -125,7 +125,7 @@ import static com.mongodb.client.model.bulk.ClientBulkWriteOptions.clientBulkWriteOptions; import static com.mongodb.client.model.bulk.ClientDeleteManyOptions.clientDeleteManyOptions; import static com.mongodb.client.model.bulk.ClientDeleteOneOptions.clientDeleteOneOptions; -import static com.mongodb.client.model.bulk.ClientReplaceOptions.clientReplaceOptions; +import static com.mongodb.client.model.bulk.ClientReplaceOneOptions.clientReplaceOptions; import static com.mongodb.client.model.bulk.ClientUpdateManyOptions.clientUpdateManyOptions; import static com.mongodb.client.model.bulk.ClientUpdateOneOptions.clientUpdateOneOptions; import static java.lang.String.format; @@ -1894,8 +1894,8 @@ private static ClientNamespacedWriteModel toClientNamespacedWriteModel(final Bso } } - private static ClientReplaceOptions getClientReplaceOptions(final BsonDocument arguments) { - ClientReplaceOptions options = clientReplaceOptions(); + private static ClientReplaceOneOptions getClientReplaceOptions(final BsonDocument arguments) { + ClientReplaceOneOptions options = clientReplaceOptions(); arguments.forEach((key, argument) -> { switch (key) { case "namespace": From d5bb017305cbd2e75b9c978795bbc43518ea7466 Mon Sep 17 00:00:00 2001 From: Valentin Kovalenko Date: Wed, 8 Jan 2025 09:39:50 -0800 Subject: [PATCH 14/22] Introduce `AbstractClientDeleteOptions`, `AbstractClientUpdateOptions`. JAVA-5737 --- .../model/bulk/ClientDeleteOneOptions.java | 2 +- .../model/bulk/ClientReplaceOneOptions.java | 73 ++++++++++ .../model/bulk/AbstractClientDeleteModel.java | 8 +- .../bulk/AbstractClientDeleteOptions.java | 93 +++++++++++++ .../model/bulk/AbstractClientUpdateModel.java | 8 +- .../bulk/AbstractClientUpdateOptions.java | 125 ++++++++++++++++++ .../bulk/ConcreteClientDeleteManyOptions.java | 59 ++------- .../bulk/ConcreteClientDeleteOneOptions.java | 59 ++------- .../bulk/ConcreteClientReplaceOneOptions.java | 108 +++++++++++++++ .../bulk/ConcreteClientUpdateManyOptions.java | 89 ++----------- .../bulk/ConcreteClientUpdateOneOptions.java | 89 ++----------- .../operation/ClientBulkWriteOperation.java | 55 +------- .../client/unified/UnifiedCrudHelper.java | 81 ++++-------- 13 files changed, 482 insertions(+), 367 deletions(-) create mode 100644 driver-core/src/main/com/mongodb/client/model/bulk/ClientReplaceOneOptions.java create mode 100644 driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteOptions.java create mode 100644 driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateOptions.java create mode 100644 driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOneOptions.java diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java index 1790ca932fe..0c515c7960b 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientDeleteOneOptions.java @@ -27,7 +27,7 @@ * @since 5.3 */ @Sealed -public interface ClientDeleteOneOptions extends BaseClientDeleteOptions{ +public interface ClientDeleteOneOptions extends BaseClientDeleteOptions { /** * Creates the default options. * diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientReplaceOneOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientReplaceOneOptions.java new file mode 100644 index 00000000000..7eb6a282027 --- /dev/null +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientReplaceOneOptions.java @@ -0,0 +1,73 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mongodb.client.model.bulk; + +import com.mongodb.annotations.Sealed; +import com.mongodb.client.model.Collation; +import com.mongodb.internal.client.model.bulk.ConcreteClientReplaceOneOptions; +import com.mongodb.lang.Nullable; +import org.bson.conversions.Bson; + +/** + * The options to apply when replacing a document. + * + * @since 5.3 + */ +@Sealed +public interface ClientReplaceOneOptions { + /** + * Creates the default options. + * + * @return The default options. + */ + static ClientReplaceOneOptions clientReplaceOptions() { + return new ConcreteClientReplaceOneOptions(); + } + + /** + * Sets the collation. + * + * @param collation The collation. {@code null} represents the server default. + * @return {@code this}. + */ + ClientReplaceOneOptions collation(@Nullable Collation collation); + + /** + * Sets the index specification, + * {@code null}-ifies {@linkplain #hintString(String) hint string}. + * + * @param hint The index specification. {@code null} represents the server default. + * @return {@code this}. + */ + ClientReplaceOneOptions hint(@Nullable Bson hint); + + /** + * Sets the index name, + * {@code null}-ifies {@linkplain #hint(Bson) hint}. + * + * @param hintString The index name. {@code null} represents the server default. + * @return {@code this}. + */ + ClientReplaceOneOptions hintString(@Nullable String hintString); + + /** + * Enables or disables creation of a document if no documents match the filter. + * + * @param upsert The upsert flag. {@code null} represents the server default. + * @return {@code this}. + */ + ClientReplaceOneOptions upsert(@Nullable Boolean upsert); +} diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java index 0fc559695c7..8ba31c122d6 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java @@ -20,11 +20,11 @@ /** * This class is not part of the public API and may be removed or changed at any time. */ -public abstract class AbstractClientDeleteModel implements ClientWriteModel { +public abstract class AbstractClientDeleteModel implements ClientWriteModel { private final Bson filter; - private final T options; + private final O options; - AbstractClientDeleteModel(final Bson filter, final T options) { + AbstractClientDeleteModel(final Bson filter, final O options) { this.filter = filter; this.options = options; } @@ -33,7 +33,7 @@ public final Bson getFilter() { return filter; } - public final T getOptions() { + public final O getOptions() { return options; } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteOptions.java new file mode 100644 index 00000000000..3997c025fd3 --- /dev/null +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteOptions.java @@ -0,0 +1,93 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mongodb.internal.client.model.bulk; + +import com.mongodb.client.model.Collation; +import com.mongodb.client.model.bulk.ClientDeleteManyOptions; +import com.mongodb.client.model.bulk.ClientDeleteOneOptions; +import com.mongodb.lang.Nullable; +import org.bson.conversions.Bson; + +import java.util.Optional; + +import static java.util.Optional.ofNullable; + +/** + * This class is not part of the public API and may be removed or changed at any time. + */ +public abstract class AbstractClientDeleteOptions { + @Nullable + private Collation collation; + @Nullable + private Bson hint; + @Nullable + private String hintString; + + AbstractClientDeleteOptions() { + } + + public AbstractClientDeleteOptions collation(@Nullable final Collation collation) { + this.collation = collation; + return this; + } + + /** + * @see ClientDeleteOneOptions#collation(Collation) + * @see ClientDeleteManyOptions#collation(Collation) + */ + public Optional getCollation() { + return ofNullable(collation); + } + + public AbstractClientDeleteOptions hint(@Nullable final Bson hint) { + this.hint = hint; + this.hintString = null; + return this; + } + + /** + * @see ClientDeleteOneOptions#hint(Bson) + * @see ClientDeleteManyOptions#hint(Bson) + */ + public Optional getHint() { + return ofNullable(hint); + } + + public AbstractClientDeleteOptions hintString(@Nullable final String hintString) { + this.hintString = hintString; + this.hint = null; + return this; + } + + /** + * @see ClientDeleteOneOptions#hintString(String) + * @see ClientDeleteManyOptions#hintString(String) + */ + public Optional getHintString() { + return ofNullable(hintString); + } + + abstract String getToStringDescription(); + + @Override + public String toString() { + return getToStringDescription() + + "{collation=" + collation + + ", hint=" + hint + + ", hintString='" + hintString + '\'' + + '}'; + } +} diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java index 1ba7023140e..cdb69969208 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java @@ -26,20 +26,20 @@ /** * This class is not part of the public API and may be removed or changed at any time. */ -public abstract class AbstractClientUpdateModel { +public abstract class AbstractClientUpdateModel { private final Bson filter; @Nullable private final Bson update; @Nullable private final Iterable updatePipeline; - private final T options; + private final O options; AbstractClientUpdateModel( final Bson filter, @Nullable final Bson update, @Nullable final Iterable updatePipeline, - final T options) { + final O options) { this.filter = filter; assertTrue(update == null ^ updatePipeline == null); this.update = update; @@ -59,7 +59,7 @@ public final Optional> getUpdatePipeline() { return ofNullable(updatePipeline); } - public final T getOptions() { + public final O getOptions() { return options; } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateOptions.java new file mode 100644 index 00000000000..21540acbebb --- /dev/null +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateOptions.java @@ -0,0 +1,125 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mongodb.internal.client.model.bulk; + +import com.mongodb.client.model.Collation; +import com.mongodb.client.model.bulk.ClientUpdateManyOptions; +import com.mongodb.client.model.bulk.ClientUpdateOneOptions; +import com.mongodb.lang.Nullable; +import org.bson.conversions.Bson; + +import java.util.Optional; + +import static java.util.Optional.ofNullable; + +/** + * This class is not part of the public API and may be removed or changed at any time. + */ +public abstract class AbstractClientUpdateOptions { + @Nullable + private Iterable arrayFilters; + @Nullable + private Collation collation; + @Nullable + private Bson hint; + @Nullable + private String hintString; + @Nullable + private Boolean upsert; + + AbstractClientUpdateOptions() { + } + + public AbstractClientUpdateOptions arrayFilters(@Nullable final Iterable arrayFilters) { + this.arrayFilters = arrayFilters; + return this; + } + + /** + * @see ClientUpdateOneOptions#arrayFilters(Iterable) + * @see ClientUpdateManyOptions#arrayFilters(Iterable) + */ + public Optional> getArrayFilters() { + return ofNullable(arrayFilters); + } + + public AbstractClientUpdateOptions collation(@Nullable final Collation collation) { + this.collation = collation; + return this; + } + + /** + * @see ClientUpdateOneOptions#collation(Collation) + * @see ClientUpdateManyOptions#collation(Collation) + */ + public Optional getCollation() { + return ofNullable(collation); + } + + public AbstractClientUpdateOptions hint(@Nullable final Bson hint) { + this.hint = hint; + this.hintString = null; + return this; + } + + /** + * @see ClientUpdateOneOptions#hint(Bson) + * @see ClientUpdateManyOptions#hint(Bson) + */ + public Optional getHint() { + return ofNullable(hint); + } + + public AbstractClientUpdateOptions hintString(@Nullable final String hintString) { + this.hintString = hintString; + this.hint = null; + return this; + } + + /** + * @see ClientUpdateOneOptions#hintString(String) + * @see ClientUpdateManyOptions#hintString(String) + */ + public Optional getHintString() { + return ofNullable(hintString); + } + + public AbstractClientUpdateOptions upsert(@Nullable final Boolean upsert) { + this.upsert = upsert; + return this; + } + + /** + * @see ClientUpdateOneOptions#upsert(Boolean) + * @see ClientUpdateManyOptions#upsert(Boolean) + */ + public Optional isUpsert() { + return ofNullable(upsert); + } + + abstract String getToStringDescription(); + + @Override + public String toString() { + return getToStringDescription() + + "{arrayFilters=" + arrayFilters + + ", collation=" + collation + + ", hint=" + hint + + ", hintString='" + hintString + '\'' + + ", upsert=" + upsert + + '}'; + } +} diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java index 743124a61f6..4d333e91510 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java @@ -20,73 +20,32 @@ import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; -import java.util.Optional; - -import static java.util.Optional.ofNullable; - /** * This class is not part of the public API and may be removed or changed at any time. */ -public final class ConcreteClientDeleteManyOptions implements ClientDeleteManyOptions { +public final class ConcreteClientDeleteManyOptions extends AbstractClientDeleteOptions implements ClientDeleteManyOptions { static final ConcreteClientDeleteManyOptions MUTABLE_EMPTY = new ConcreteClientDeleteManyOptions(); - @Nullable - private Collation collation; - @Nullable - private Bson hint; - @Nullable - private String hintString; - public ConcreteClientDeleteManyOptions() { } @Override - public ClientDeleteManyOptions collation(@Nullable final Collation collation) { - this.collation = collation; - return this; - } - - /** - * @see #collation(Collation) - */ - public Optional getCollation() { - return ofNullable(collation); + public ConcreteClientDeleteManyOptions collation(@Nullable final Collation collation) { + return (ConcreteClientDeleteManyOptions) super.collation(collation); } @Override - public ClientDeleteManyOptions hint(@Nullable final Bson hint) { - this.hint = hint; - this.hintString = null; - return this; - } - - /** - * @see #hint(Bson) - */ - public Optional getHint() { - return ofNullable(hint); + public ConcreteClientDeleteManyOptions hint(@Nullable final Bson hint) { + return (ConcreteClientDeleteManyOptions) super.hint(hint); } @Override - public ClientDeleteManyOptions hintString(@Nullable final String hintString) { - this.hintString = hintString; - this.hint = null; - return this; - } - - /** - * @see #hintString(String) - */ - public Optional getHintString() { - return ofNullable(hintString); + public ConcreteClientDeleteManyOptions hintString(@Nullable final String hintString) { + return (ConcreteClientDeleteManyOptions) super.hintString(hintString); } @Override - public String toString() { - return "ClientDeleteManyOptions{" - + "collation=" + collation - + ", hint=" + hint - + ", hintString='" + hintString + '\'' - + '}'; + String getToStringDescription() { + return "ConcreteClientDeleteManyOptions"; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java index 35b3b6377e6..f524fdbe55a 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java @@ -20,73 +20,32 @@ import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; -import java.util.Optional; - -import static java.util.Optional.ofNullable; - /** * This class is not part of the public API and may be removed or changed at any time. */ -public final class ConcreteClientDeleteOneOptions implements ClientDeleteOneOptions { +public final class ConcreteClientDeleteOneOptions extends AbstractClientDeleteOptions implements ClientDeleteOneOptions { static final ConcreteClientDeleteOneOptions MUTABLE_EMPTY = new ConcreteClientDeleteOneOptions(); - @Nullable - private Collation collation; - @Nullable - private Bson hint; - @Nullable - private String hintString; - public ConcreteClientDeleteOneOptions() { } @Override - public ClientDeleteOneOptions collation(@Nullable final Collation collation) { - this.collation = collation; - return this; - } - - /** - * @see #collation(Collation) - */ - public Optional getCollation() { - return ofNullable(collation); + public ConcreteClientDeleteOneOptions collation(@Nullable final Collation collation) { + return (ConcreteClientDeleteOneOptions) super.collation(collation); } @Override - public ClientDeleteOneOptions hint(@Nullable final Bson hint) { - this.hint = hint; - this.hintString = null; - return this; - } - - /** - * @see #hint(Bson) - */ - public Optional getHint() { - return ofNullable(hint); + public ConcreteClientDeleteOneOptions hint(@Nullable final Bson hint) { + return (ConcreteClientDeleteOneOptions) super.hint(hint); } @Override - public ClientDeleteOneOptions hintString(@Nullable final String hintString) { - this.hintString = hintString; - this.hint = null; - return this; - } - - /** - * @see #hintString(String) - */ - public Optional getHintString() { - return ofNullable(hintString); + public ConcreteClientDeleteOneOptions hintString(@Nullable final String hintString) { + return (ConcreteClientDeleteOneOptions) super.hintString(hintString); } @Override - public String toString() { - return "ClientDeleteOneOptions{" - + "collation=" + collation - + ", hint=" + hint - + ", hintString='" + hintString + '\'' - + '}'; + String getToStringDescription() { + return "ConcreteClientDeleteOneOptions"; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOneOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOneOptions.java new file mode 100644 index 00000000000..af2998c0073 --- /dev/null +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOneOptions.java @@ -0,0 +1,108 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mongodb.internal.client.model.bulk; + +import com.mongodb.client.model.Collation; +import com.mongodb.client.model.bulk.ClientReplaceOneOptions; +import com.mongodb.lang.Nullable; +import org.bson.conversions.Bson; + +import java.util.Optional; + +import static java.util.Optional.ofNullable; + +/** + * This class is not part of the public API and may be removed or changed at any time. + */ +public final class ConcreteClientReplaceOneOptions implements ClientReplaceOneOptions { + static final ConcreteClientReplaceOneOptions MUTABLE_EMPTY = new ConcreteClientReplaceOneOptions(); + + @Nullable + private Collation collation; + @Nullable + private Bson hint; + @Nullable + private String hintString; + @Nullable + private Boolean upsert; + + public ConcreteClientReplaceOneOptions() { + } + + @Override + public ClientReplaceOneOptions collation(@Nullable final Collation collation) { + this.collation = collation; + return this; + } + + /** + * @see #collation(Collation) + */ + public Optional getCollation() { + return ofNullable(collation); + } + + @Override + public ClientReplaceOneOptions hint(@Nullable final Bson hint) { + this.hint = hint; + this.hintString = null; + return this; + } + + /** + * @see #hint(Bson) + */ + public Optional getHint() { + return ofNullable(hint); + } + + @Override + public ClientReplaceOneOptions hintString(@Nullable final String hintString) { + this.hintString = hintString; + this.hint = null; + return this; + } + + /** + * @see #hintString(String) + */ + public Optional getHintString() { + return ofNullable(hintString); + } + + @Override + public ClientReplaceOneOptions upsert(@Nullable final Boolean upsert) { + this.upsert = upsert; + return this; + } + + /** + * @see #upsert(Boolean) + */ + public Optional isUpsert() { + return ofNullable(upsert); + } + + @Override + public String toString() { + return "ClientReplaceOptions{" + + "collation=" + collation + + ", hint=" + hint + + ", hintString='" + hintString + '\'' + + ", upsert=" + upsert + + '}'; + } +} diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java index 367f6b49cad..e22c77298a4 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java @@ -20,105 +20,42 @@ import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; -import java.util.Optional; - -import static java.util.Optional.ofNullable; - /** * This class is not part of the public API and may be removed or changed at any time. */ -public final class ConcreteClientUpdateManyOptions implements ClientUpdateManyOptions { +public final class ConcreteClientUpdateManyOptions extends AbstractClientUpdateOptions implements ClientUpdateManyOptions { static final ConcreteClientUpdateManyOptions MUTABLE_EMPTY = new ConcreteClientUpdateManyOptions(); - @Nullable - private Iterable arrayFilters; - @Nullable - private Collation collation; - @Nullable - private Bson hint; - @Nullable - private String hintString; - @Nullable - private Boolean upsert; - public ConcreteClientUpdateManyOptions() { } @Override - public ClientUpdateManyOptions arrayFilters(@Nullable final Iterable arrayFilters) { - this.arrayFilters = arrayFilters; - return this; - } - - /** - * @see #arrayFilters(Iterable) - */ - public Optional> getArrayFilters() { - return ofNullable(arrayFilters); + public ConcreteClientUpdateManyOptions arrayFilters(@Nullable final Iterable arrayFilters) { + return (ConcreteClientUpdateManyOptions) super.arrayFilters(arrayFilters); } @Override - public ClientUpdateManyOptions collation(@Nullable final Collation collation) { - this.collation = collation; - return this; - } - - /** - * @see #collation(Collation) - */ - public Optional getCollation() { - return ofNullable(collation); + public ConcreteClientUpdateManyOptions collation(@Nullable final Collation collation) { + return (ConcreteClientUpdateManyOptions) super.collation(collation); } @Override - public ClientUpdateManyOptions hint(@Nullable final Bson hint) { - this.hint = hint; - this.hintString = null; - return this; - } - - /** - * @see #hint(Bson) - */ - public Optional getHint() { - return ofNullable(hint); + public ConcreteClientUpdateManyOptions hint(@Nullable final Bson hint) { + return (ConcreteClientUpdateManyOptions) super.hint(hint); } @Override - public ClientUpdateManyOptions hintString(@Nullable final String hintString) { - this.hintString = hintString; - this.hint = null; - return this; - } - - /** - * @see #hintString(String) - */ - public Optional getHintString() { - return ofNullable(hintString); + public ConcreteClientUpdateManyOptions hintString(@Nullable final String hintString) { + return (ConcreteClientUpdateManyOptions) super.hintString(hintString); } @Override - public ClientUpdateManyOptions upsert(@Nullable final Boolean upsert) { - this.upsert = upsert; - return this; - } - - /** - * @see #isUpsert() - */ - public Optional isUpsert() { - return ofNullable(upsert); + public ConcreteClientUpdateManyOptions upsert(@Nullable final Boolean upsert) { + return (ConcreteClientUpdateManyOptions) super.upsert(upsert); } @Override - public String toString() { - return "ClientUpdateManyOptions{" - + "arrayFilters=" + arrayFilters - + ", collation=" + collation - + ", hint=" + hint - + ", hintString='" + hintString + '\'' - + ", upsert=" + upsert - + '}'; + String getToStringDescription() { + return "ConcreteClientUpdateManyOptions"; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java index 21e268a598b..de36540a259 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java @@ -20,105 +20,42 @@ import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; -import java.util.Optional; - -import static java.util.Optional.ofNullable; - /** * This class is not part of the public API and may be removed or changed at any time. */ -public final class ConcreteClientUpdateOneOptions implements ClientUpdateOneOptions { +public final class ConcreteClientUpdateOneOptions extends AbstractClientUpdateOptions implements ClientUpdateOneOptions { static final ConcreteClientUpdateOneOptions MUTABLE_EMPTY = new ConcreteClientUpdateOneOptions(); - @Nullable - private Iterable arrayFilters; - @Nullable - private Collation collation; - @Nullable - private Bson hint; - @Nullable - private String hintString; - @Nullable - private Boolean upsert; - public ConcreteClientUpdateOneOptions() { } @Override - public ClientUpdateOneOptions arrayFilters(@Nullable final Iterable arrayFilters) { - this.arrayFilters = arrayFilters; - return this; - } - - /** - * @see #arrayFilters(Iterable) - */ - public Optional> getArrayFilters() { - return ofNullable(arrayFilters); + public ConcreteClientUpdateOneOptions arrayFilters(@Nullable final Iterable arrayFilters) { + return (ConcreteClientUpdateOneOptions) super.arrayFilters(arrayFilters); } @Override - public ClientUpdateOneOptions collation(@Nullable final Collation collation) { - this.collation = collation; - return this; - } - - /** - * @see #collation(Collation) - */ - public Optional getCollation() { - return ofNullable(collation); + public ConcreteClientUpdateOneOptions collation(@Nullable final Collation collation) { + return (ConcreteClientUpdateOneOptions) super.collation(collation); } @Override - public ClientUpdateOneOptions hint(@Nullable final Bson hint) { - this.hint = hint; - this.hintString = null; - return this; - } - - /** - * @see #hint(Bson) - */ - public Optional getHint() { - return ofNullable(hint); + public ConcreteClientUpdateOneOptions hint(@Nullable final Bson hint) { + return (ConcreteClientUpdateOneOptions) super.hint(hint); } @Override - public ClientUpdateOneOptions hintString(@Nullable final String hintString) { - this.hintString = hintString; - this.hint = null; - return this; - } - - /** - * @see #hintString(String) - */ - public Optional getHintString() { - return ofNullable(hintString); + public ConcreteClientUpdateOneOptions hintString(@Nullable final String hintString) { + return (ConcreteClientUpdateOneOptions) super.hintString(hintString); } @Override - public ClientUpdateOneOptions upsert(@Nullable final Boolean upsert) { - this.upsert = upsert; - return this; - } - - /** - * @see #isUpsert() - */ - public Optional isUpsert() { - return ofNullable(upsert); + public ConcreteClientUpdateOneOptions upsert(@Nullable final Boolean upsert) { + return (ConcreteClientUpdateOneOptions) super.upsert(upsert); } @Override - public String toString() { - return "ClientUpdateOneOptions{" - + "arrayFilters=" + arrayFilters - + ", collation=" + collation - + ", hint=" + hint - + ", hintString='" + hintString + '\'' - + ", upsert=" + upsert - + '}'; + String getToStringDescription() { + return "ConcreteClientUpdateOneOptions"; } } diff --git a/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java b/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java index 4cc05c3ad79..ccd7f272e95 100644 --- a/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java +++ b/driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java @@ -51,16 +51,17 @@ import com.mongodb.internal.binding.AsyncWriteBinding; import com.mongodb.internal.binding.ConnectionSource; import com.mongodb.internal.binding.WriteBinding; +import com.mongodb.internal.client.model.bulk.AbstractClientDeleteModel; +import com.mongodb.internal.client.model.bulk.AbstractClientDeleteOptions; import com.mongodb.internal.client.model.bulk.AbstractClientNamespacedWriteModel; import com.mongodb.internal.client.model.bulk.AbstractClientUpdateModel; +import com.mongodb.internal.client.model.bulk.AbstractClientUpdateOptions; import com.mongodb.internal.client.model.bulk.AcknowledgedSummaryClientBulkWriteResult; import com.mongodb.internal.client.model.bulk.AcknowledgedVerboseClientBulkWriteResult; import com.mongodb.internal.client.model.bulk.ClientWriteModel; import com.mongodb.internal.client.model.bulk.ConcreteClientBulkWriteOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteManyModel; -import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteManyOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteOneModel; -import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteOneOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteResult; import com.mongodb.internal.client.model.bulk.ConcreteClientInsertOneModel; import com.mongodb.internal.client.model.bulk.ConcreteClientInsertOneResult; @@ -73,9 +74,7 @@ import com.mongodb.internal.client.model.bulk.ConcreteClientReplaceOneModel; import com.mongodb.internal.client.model.bulk.ConcreteClientReplaceOneOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateManyModel; -import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateManyOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateOneModel; -import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateOneOptions; import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateResult; import com.mongodb.internal.client.model.bulk.UnacknowledgedClientBulkWriteResult; import com.mongodb.internal.connection.AsyncConnection; @@ -1248,7 +1247,7 @@ private void encodeWriteModelInternals( }); } - private void encodeUpdateWriteModelInternals(final BsonWriter writer, final AbstractClientUpdateModel model) { + private void encodeWriteModelInternals(final BsonWriter writer, final AbstractClientUpdateModel model) { writer.writeName("filter"); encodeUsingRegistry(writer, model.getFilter()); model.getUpdate().ifPresent(value -> { @@ -1260,32 +1259,7 @@ private void encodeUpdateWriteModelInternals(final BsonWriter writer, final Abst value.forEach(pipelineStage -> encodeUsingRegistry(writer, pipelineStage)); writer.writeEndArray(); }); - } - - private void encodeWriteModelInternals(final BsonWriter writer, final ConcreteClientUpdateOneModel model) { - encodeUpdateWriteModelInternals(writer, model); - ConcreteClientUpdateOneOptions options = model.getOptions(); - options.getArrayFilters().ifPresent(value -> { - writer.writeStartArray("arrayFilters"); - value.forEach(filter -> encodeUsingRegistry(writer, filter)); - writer.writeEndArray(); - }); - options.getCollation().ifPresent(value -> { - writer.writeName("collation"); - encodeUsingRegistry(writer, value.asDocument()); - }); - options.getHint().ifPresent(hint -> { - writer.writeName("hint"); - encodeUsingRegistry(writer, hint); - }); - options.getHintString().ifPresent(value -> writer.writeString("hint", value)); - options.isUpsert().ifPresent(value -> writer.writeBoolean("upsert", value)); - } - - private void encodeWriteModelInternals(final BsonWriter writer, final ConcreteClientUpdateManyModel model) { - encodeUpdateWriteModelInternals(writer, model); - - ConcreteClientUpdateManyOptions options = model.getOptions(); + AbstractClientUpdateOptions options = model.getOptions(); options.getArrayFilters().ifPresent(value -> { writer.writeStartArray("arrayFilters"); value.forEach(filter -> encodeUsingRegistry(writer, filter)); @@ -1322,25 +1296,10 @@ private void encodeWriteModelInternals(final BsonBinaryWriter writer, final Conc options.isUpsert().ifPresent(value -> writer.writeBoolean("upsert", value)); } - private void encodeWriteModelInternals(final BsonWriter writer, final ConcreteClientDeleteOneModel model) { - writer.writeName("filter"); - encodeUsingRegistry(writer, model.getFilter()); - ConcreteClientDeleteOneOptions options = model.getOptions(); - options.getCollation().ifPresent(value -> { - writer.writeName("collation"); - encodeUsingRegistry(writer, value.asDocument()); - }); - options.getHint().ifPresent(value -> { - writer.writeName("hint"); - encodeUsingRegistry(writer, value); - }); - options.getHintString().ifPresent(value -> writer.writeString("hint", value)); - } - - private void encodeWriteModelInternals(final BsonWriter writer, final ConcreteClientDeleteManyModel model) { + private void encodeWriteModelInternals(final BsonWriter writer, final AbstractClientDeleteModel model) { writer.writeName("filter"); encodeUsingRegistry(writer, model.getFilter()); - ConcreteClientDeleteManyOptions options = model.getOptions(); + AbstractClientDeleteOptions options = model.getOptions(); options.getCollation().ifPresent(value -> { writer.writeName("collation"); encodeUsingRegistry(writer, value.asDocument()); 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 1120632c880..5e79ccbcb83 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 @@ -77,12 +77,14 @@ import com.mongodb.client.model.UpdateOptions; import com.mongodb.client.model.WriteModel; import com.mongodb.client.model.bulk.ClientBulkWriteOptions; +import com.mongodb.client.model.bulk.ClientBulkWriteResult; import com.mongodb.client.model.bulk.ClientDeleteManyOptions; import com.mongodb.client.model.bulk.ClientDeleteOneOptions; +import com.mongodb.client.model.bulk.ClientNamespacedWriteModel; import com.mongodb.client.model.bulk.ClientReplaceOneOptions; import com.mongodb.client.model.bulk.ClientUpdateManyOptions; import com.mongodb.client.model.bulk.ClientUpdateOneOptions; -import com.mongodb.client.model.bulk.ClientNamespacedWriteModel; +import com.mongodb.client.model.bulk.ClientUpdateResult; import com.mongodb.client.model.changestream.ChangeStreamDocument; import com.mongodb.client.model.changestream.FullDocument; import com.mongodb.client.model.changestream.FullDocumentBeforeChange; @@ -90,8 +92,12 @@ import com.mongodb.client.result.InsertManyResult; import com.mongodb.client.result.InsertOneResult; import com.mongodb.client.result.UpdateResult; -import com.mongodb.client.model.bulk.ClientBulkWriteResult; -import com.mongodb.client.model.bulk.ClientUpdateResult; +import com.mongodb.internal.client.model.bulk.AbstractClientDeleteOptions; +import com.mongodb.internal.client.model.bulk.AbstractClientUpdateOptions; +import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteManyOptions; +import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteOneOptions; +import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateManyOptions; +import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateOneOptions; import com.mongodb.lang.NonNull; import com.mongodb.lang.Nullable; import org.bson.BsonArray; @@ -123,11 +129,7 @@ import java.util.function.Supplier; import static com.mongodb.client.model.bulk.ClientBulkWriteOptions.clientBulkWriteOptions; -import static com.mongodb.client.model.bulk.ClientDeleteManyOptions.clientDeleteManyOptions; -import static com.mongodb.client.model.bulk.ClientDeleteOneOptions.clientDeleteOneOptions; import static com.mongodb.client.model.bulk.ClientReplaceOneOptions.clientReplaceOptions; -import static com.mongodb.client.model.bulk.ClientUpdateManyOptions.clientUpdateManyOptions; -import static com.mongodb.client.model.bulk.ClientUpdateOneOptions.clientUpdateOneOptions; import static java.lang.String.format; import static java.util.Arrays.asList; import static java.util.Collections.singleton; @@ -1923,38 +1925,16 @@ private static ClientReplaceOneOptions getClientReplaceOptions(final BsonDocumen } private static ClientUpdateOneOptions getClientUpdateOneOptions(final BsonDocument arguments) { - ClientUpdateOneOptions options = clientUpdateOneOptions(); - arguments.forEach((key, argument) -> { - switch (key) { - case "namespace": - case "filter": - case "update": - break; - case "arrayFilters": - options.arrayFilters(argument.asArray().stream().map(BsonValue::asDocument).collect(toList())); - break; - case "collation": - options.collation(asCollation(argument.asDocument())); - break; - case "hint": - if (argument.isDocument()) { - options.hint(argument.asDocument()); - } else { - options.hintString(argument.asString().getValue()); - } - break; - case "upsert": - options.upsert(argument.asBoolean().getValue()); - break; - default: - throw new UnsupportedOperationException(format("Unsupported argument: key=%s, argument=%s", key, argument)); - } - }); - return options; + return fillAbstractClientUpdateOptions(new ConcreteClientUpdateOneOptions(), arguments); } private static ClientUpdateManyOptions getClientUpdateManyOptions(final BsonDocument arguments) { - ClientUpdateManyOptions options = clientUpdateManyOptions(); + return fillAbstractClientUpdateOptions(new ConcreteClientUpdateManyOptions(), arguments); + } + + private static T fillAbstractClientUpdateOptions( + final T options, + final BsonDocument arguments) { arguments.forEach((key, argument) -> { switch (key) { case "namespace": @@ -1985,31 +1965,16 @@ private static ClientUpdateManyOptions getClientUpdateManyOptions(final BsonDocu } private static ClientDeleteOneOptions getClientDeleteOneOptions(final BsonDocument arguments) { - ClientDeleteOneOptions options = clientDeleteOneOptions(); - arguments.forEach((key, argument) -> { - switch (key) { - case "namespace": - case "filter": - break; - case "collation": - options.collation(asCollation(argument.asDocument())); - break; - case "hint": - if (argument.isDocument()) { - options.hint(argument.asDocument()); - } else { - options.hintString(argument.asString().getValue()); - } - break; - default: - throw new UnsupportedOperationException(format("Unsupported argument: key=%s, argument=%s", key, argument)); - } - }); - return options; + return fillAbstractClientDeleteOptions(new ConcreteClientDeleteOneOptions(), arguments); } private static ClientDeleteManyOptions getClientDeleteManyOptions(final BsonDocument arguments) { - ClientDeleteManyOptions options = clientDeleteManyOptions(); + return fillAbstractClientDeleteOptions(new ConcreteClientDeleteManyOptions(), arguments); + } + + private static T fillAbstractClientDeleteOptions( + final T options, + final BsonDocument arguments) { arguments.forEach((key, argument) -> { switch (key) { case "namespace": From bdb7e2f6ebdc00ecf667abbb707a81315b85b130 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Wed, 8 Jan 2025 15:27:29 -0800 Subject: [PATCH 15/22] Create explicit toString(). JAVA-5737 --- .../model/bulk/AbstractClientDeleteModel.java | 10 ------ .../bulk/AbstractClientDeleteOptions.java | 11 ------ .../model/bulk/AbstractClientUpdateModel.java | 11 ------ .../bulk/AbstractClientUpdateOptions.java | 13 ------- .../bulk/ConcreteClientDeleteManyModel.java | 7 ++-- .../bulk/ConcreteClientDeleteManyOptions.java | 8 +++-- .../bulk/ConcreteClientDeleteOneModel.java | 7 ++-- .../bulk/ConcreteClientDeleteOneOptions.java | 8 +++-- .../bulk/ConcreteClientUpdateManyModel.java | 9 +++-- .../bulk/ConcreteClientUpdateManyOptions.java | 10 ++++-- .../bulk/ConcreteClientUpdateOneModel.java | 9 +++-- .../bulk/ConcreteClientUpdateOneOptions.java | 10 ++++-- ...java => MongoBaseInterfaceAssertions.java} | 36 ++++++++++--------- .../bulk/BaseClientDeleteOptionsTest.java | 4 +-- .../bulk/BaseClientUpdateOptionsTest.java | 4 +-- 15 files changed, 75 insertions(+), 82 deletions(-) rename driver-core/src/test/unit/com/mongodb/{MongoAssertions.java => MongoBaseInterfaceAssertions.java} (56%) diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java index 8ba31c122d6..f7cc0dd4e66 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteModel.java @@ -36,14 +36,4 @@ public final Bson getFilter() { public final O getOptions() { return options; } - - abstract String getToStringDescription(); - - @Override - public final String toString() { - return getToStringDescription() - + "{filter=" + filter - + ", options=" + options - + '}'; - } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteOptions.java index 3997c025fd3..fdacf540073 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientDeleteOptions.java @@ -79,15 +79,4 @@ public AbstractClientDeleteOptions hintString(@Nullable final String hintString) public Optional getHintString() { return ofNullable(hintString); } - - abstract String getToStringDescription(); - - @Override - public String toString() { - return getToStringDescription() - + "{collation=" + collation - + ", hint=" + hint - + ", hintString='" + hintString + '\'' - + '}'; - } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java index cdb69969208..38ff85ae7b2 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateModel.java @@ -62,15 +62,4 @@ public final Optional> getUpdatePipeline() { public final O getOptions() { return options; } - - abstract String getToStringDescription(); - - @Override - public final String toString() { - return getToStringDescription() - + "{filter=" + filter - + ", update=" + (update != null ? update : updatePipeline) - + ", options=" + options - + '}'; - } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateOptions.java index 21540acbebb..508330bd8b7 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/AbstractClientUpdateOptions.java @@ -109,17 +109,4 @@ public AbstractClientUpdateOptions upsert(@Nullable final Boolean upsert) { public Optional isUpsert() { return ofNullable(upsert); } - - abstract String getToStringDescription(); - - @Override - public String toString() { - return getToStringDescription() - + "{arrayFilters=" + arrayFilters - + ", collation=" + collation - + ", hint=" + hint - + ", hintString='" + hintString + '\'' - + ", upsert=" + upsert - + '}'; - } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java index cce38f633c8..b80e83799ae 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java @@ -28,7 +28,10 @@ public ConcreteClientDeleteManyModel(final Bson filter, @Nullable final ClientDe } @Override - String getToStringDescription() { - return "ClientDeleteManyModel"; + public String toString() { + return "ClientDeleteManyModel" + + "{filter=" + getFilter() + + ", options=" + getOptions() + + '}'; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java index 4d333e91510..381cd84fa50 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyOptions.java @@ -45,7 +45,11 @@ public ConcreteClientDeleteManyOptions hintString(@Nullable final String hintStr } @Override - String getToStringDescription() { - return "ConcreteClientDeleteManyOptions"; + public String toString() { + return "ClientDeleteManyOptions{" + + "collation=" + getCollation().orElse(null) + + ", hint=" + getHint().orElse(null) + + ", hintString=" + getHintString().map(s -> '\'' + s + '\'') .orElse(null) + + '}'; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java index 692cfb5719e..5c01946f31b 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java @@ -28,7 +28,10 @@ public ConcreteClientDeleteOneModel(final Bson filter, @Nullable final ClientDel } @Override - String getToStringDescription() { - return "ClientDeleteOneModel"; + public String toString() { + return "ClientDeleteOneModel" + + "{filter=" + getFilter() + + ", options=" + getOptions() + + '}'; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java index f524fdbe55a..3126903cfc5 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneOptions.java @@ -45,7 +45,11 @@ public ConcreteClientDeleteOneOptions hintString(@Nullable final String hintStri } @Override - String getToStringDescription() { - return "ConcreteClientDeleteOneOptions"; + public String toString() { + return "ClientDeleteOneOptions{" + + "collation=" + getCollation().orElse(null) + + ", hint=" + getHint().orElse(null) + + ", hintString=" + getHintString().map(s -> '\'' + s + '\'') .orElse(null) + + '}'; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java index e39d38f60ab..8d0a9e1582b 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java @@ -15,6 +15,7 @@ */ package com.mongodb.internal.client.model.bulk; +import com.mongodb.assertions.Assertions; import com.mongodb.client.model.bulk.ClientUpdateManyOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; @@ -35,7 +36,11 @@ public ConcreteClientUpdateManyModel( } @Override - String getToStringDescription() { - return "ClientUpdateManyModel"; + public String toString() { + return "ClientUpdateManyModel" + + "{filter=" + getFilter() + + ", update=" + (getUpdate().isPresent() ? getUpdate() : getUpdatePipeline().orElseThrow(Assertions::fail)) + + ", options=" + getOptions() + + '}'; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java index e22c77298a4..755b6fb56d7 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyOptions.java @@ -55,7 +55,13 @@ public ConcreteClientUpdateManyOptions upsert(@Nullable final Boolean upsert) { } @Override - String getToStringDescription() { - return "ConcreteClientUpdateManyOptions"; + public String toString() { + return "ClientUpdateManyOptions{" + + "arrayFilters=" + getArrayFilters().orElse(null) + + ", collation=" + getCollation().orElse(null) + + ", hint=" + getHint().orElse(null) + + ", hintString=" + getHintString().map(s -> '\'' + s + '\'') .orElse(null) + + ", upsert=" + isUpsert().orElse(null) + + '}'; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java index 96c74ed86f6..88681c69e01 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java @@ -15,6 +15,7 @@ */ package com.mongodb.internal.client.model.bulk; +import com.mongodb.assertions.Assertions; import com.mongodb.client.model.bulk.ClientUpdateOneOptions; import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; @@ -35,7 +36,11 @@ public ConcreteClientUpdateOneModel( } @Override - String getToStringDescription() { - return "ClientUpdateOneModel"; + public String toString() { + return "ClientUpdateOneModel" + + "{filter=" + getFilter() + + ", update=" + (getUpdate().isPresent() ? getUpdate() : getUpdatePipeline().orElseThrow(Assertions::fail)) + + ", options=" + getOptions() + + '}'; } } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java index de36540a259..fdf960ed1df 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneOptions.java @@ -55,7 +55,13 @@ public ConcreteClientUpdateOneOptions upsert(@Nullable final Boolean upsert) { } @Override - String getToStringDescription() { - return "ConcreteClientUpdateOneOptions"; + public String toString() { + return "ClientUpdateOneOptions{" + + "arrayFilters=" + getArrayFilters().orElse(null) + + ", collation=" + getCollation().orElse(null) + + ", hint=" + getHint().orElse(null) + + ", hintString=" + getHintString().map(s -> '\'' + s + '\'') .orElse(null) + + ", upsert=" + isUpsert().orElse(null) + + '}'; } } diff --git a/driver-core/src/test/unit/com/mongodb/MongoAssertions.java b/driver-core/src/test/unit/com/mongodb/MongoBaseInterfaceAssertions.java similarity index 56% rename from driver-core/src/test/unit/com/mongodb/MongoAssertions.java rename to driver-core/src/test/unit/com/mongodb/MongoBaseInterfaceAssertions.java index 17b1491842c..a898178d706 100644 --- a/driver-core/src/test/unit/com/mongodb/MongoAssertions.java +++ b/driver-core/src/test/unit/com/mongodb/MongoBaseInterfaceAssertions.java @@ -19,47 +19,49 @@ import org.reflections.Reflections; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.Set; import java.util.stream.Collectors; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; -public final class MongoAssertions { +public final class MongoBaseInterfaceAssertions { - private MongoAssertions() { + private MongoBaseInterfaceAssertions() { //NOP } - public static void assertSubInterfaceReturnTypes(final String packageName, - final Class baseClass) { + public static void assertSubtypeReturn(final String packageName, + final Class baseClass) { Reflections reflections = new Reflections(packageName); - Set> subInterfaces = reflections.getSubTypesOf(baseClass).stream() - .filter(Class::isInterface) + Set> subtypes = reflections.getSubTypesOf(baseClass).stream() + .filter(aClass -> Modifier.isPublic(aClass.getModifiers())) + .filter(aClass -> !aClass.getPackage().getName().contains("internal")) .collect(Collectors.toSet()); Method[] baseMethods = baseClass.getDeclaredMethods(); - for (Class subInterface : subInterfaces) { + for (Class subtype : subtypes) { for (Method baseMethod : baseMethods) { Method method = assertDoesNotThrow( - () -> subInterface.getDeclaredMethod(baseMethod.getName(), baseMethod.getParameterTypes()), + () -> subtype.getDeclaredMethod(baseMethod.getName(), baseMethod.getParameterTypes()), String.format( - "%s does not override %s. The methods must be copied into the implementing interface.", - subInterface.getName(), - baseMethod.getName() + "`%s` does not override `%s`. The methods must be copied into the implementing class/interface.", + subtype, + baseMethod ) ); assertEquals( - subInterface, + subtype, method.getReturnType(), String.format( - "Method %s in %s does not return %s. " - + "The return type must match the defining class.", - method.getName(), - subInterface.getName(), - subInterface.getName() + "Method `%s` in `%s` does not return `%s`. " + + "The return type must match the defining class/interface.", + method, + subtype, + subtype ) ); } diff --git a/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientDeleteOptionsTest.java b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientDeleteOptionsTest.java index 2366e11b46e..2766a258a2d 100644 --- a/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientDeleteOptionsTest.java +++ b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientDeleteOptionsTest.java @@ -16,13 +16,13 @@ package com.mongodb.client.model.bulk; -import com.mongodb.MongoAssertions; +import com.mongodb.MongoBaseInterfaceAssertions; import org.junit.jupiter.api.Test; class BaseClientDeleteOptionsTest { @Test void testAllSubInterfacesOverrideMethods() { - MongoAssertions.assertSubInterfaceReturnTypes("com.mongodb", BaseClientDeleteOptions.class); + MongoBaseInterfaceAssertions.assertSubtypeReturn("com.mongodb", BaseClientDeleteOptions.class); } } diff --git a/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java index 1a326fd58c2..28da614d7d6 100644 --- a/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java +++ b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java @@ -16,13 +16,13 @@ package com.mongodb.client.model.bulk; -import com.mongodb.MongoAssertions; +import com.mongodb.MongoBaseInterfaceAssertions; import org.junit.jupiter.api.Test; class BaseClientUpdateOptionsTest { @Test void testAllSubInterfacesOverrideMethods() { - MongoAssertions.assertSubInterfaceReturnTypes("com.mongodb", BaseClientUpdateOptions.class); + MongoBaseInterfaceAssertions.assertSubtypeReturn("com.mongodb", BaseClientUpdateOptions.class); } } From 00eb61d3c83eef79ef190c5194b513d0b21a392f Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Wed, 8 Jan 2025 17:48:23 -0800 Subject: [PATCH 16/22] Rename outstanding replace option methods. JAVA-5737 --- .../client/model/bulk/ClientNamespacedWriteModel.java | 2 +- .../client/model/bulk/ClientReplaceOneOptions.java | 2 +- .../model/bulk/ConcreteClientReplaceOneOptions.java | 2 +- .../com/mongodb/client/unified/UnifiedCrudHelper.java | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientNamespacedWriteModel.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientNamespacedWriteModel.java index 886e7cc4367..3673c35a9de 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientNamespacedWriteModel.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientNamespacedWriteModel.java @@ -221,7 +221,7 @@ static ClientNamespacedUpdateManyModel updateMany( /** * Creates a model for replacing at most one document in the {@code namespace} matching the {@code filter}. * This method is functionally equivalent to {@link #replaceOne(MongoNamespace, Bson, Object, ClientReplaceOneOptions)} - * with the {@linkplain ClientReplaceOneOptions#clientReplaceOptions() default options}. + * with the {@linkplain ClientReplaceOneOptions#clientReplaceOneOptions() default options}. * * @param namespace The namespace. * @param filter The filter. diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/ClientReplaceOneOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/ClientReplaceOneOptions.java index 7eb6a282027..4aa08ae81e1 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/ClientReplaceOneOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/ClientReplaceOneOptions.java @@ -33,7 +33,7 @@ public interface ClientReplaceOneOptions { * * @return The default options. */ - static ClientReplaceOneOptions clientReplaceOptions() { + static ClientReplaceOneOptions clientReplaceOneOptions() { return new ConcreteClientReplaceOneOptions(); } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOneOptions.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOneOptions.java index af2998c0073..18e9d060763 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOneOptions.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientReplaceOneOptions.java @@ -98,7 +98,7 @@ public Optional isUpsert() { @Override public String toString() { - return "ClientReplaceOptions{" + return "ClientReplaceOneOptions{" + "collation=" + collation + ", hint=" + hint + ", hintString='" + hintString + '\'' 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 5e79ccbcb83..811321ad2d1 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 @@ -129,7 +129,7 @@ import java.util.function.Supplier; import static com.mongodb.client.model.bulk.ClientBulkWriteOptions.clientBulkWriteOptions; -import static com.mongodb.client.model.bulk.ClientReplaceOneOptions.clientReplaceOptions; +import static com.mongodb.client.model.bulk.ClientReplaceOneOptions.clientReplaceOneOptions; import static java.lang.String.format; import static java.util.Arrays.asList; import static java.util.Collections.singleton; @@ -1856,7 +1856,7 @@ private static ClientNamespacedWriteModel toClientNamespacedWriteModel(final Bso namespace, arguments.getDocument("filter"), arguments.getDocument("replacement"), - getClientReplaceOptions(arguments)); + getClientReplaceOneOptions(arguments)); case "updateOne": return arguments.isDocument("update") ? ClientNamespacedWriteModel.updateOne( @@ -1896,8 +1896,8 @@ private static ClientNamespacedWriteModel toClientNamespacedWriteModel(final Bso } } - private static ClientReplaceOneOptions getClientReplaceOptions(final BsonDocument arguments) { - ClientReplaceOneOptions options = clientReplaceOptions(); + private static ClientReplaceOneOptions getClientReplaceOneOptions(final BsonDocument arguments) { + ClientReplaceOneOptions options = clientReplaceOneOptions(); arguments.forEach((key, argument) -> { switch (key) { case "namespace": From 5b02b1cd7bf6c837086d0c2bb55d0b551e2cd1f2 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Wed, 8 Jan 2025 18:00:10 -0800 Subject: [PATCH 17/22] Fix toString() JAVA-5737 --- .../client/model/bulk/ConcreteClientDeleteManyModel.java | 4 ++-- .../client/model/bulk/ConcreteClientDeleteOneModel.java | 4 ++-- .../client/model/bulk/ConcreteClientUpdateManyModel.java | 4 ++-- .../client/model/bulk/ConcreteClientUpdateOneModel.java | 4 ++-- .../scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java index b80e83799ae..7db1a47d053 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteManyModel.java @@ -29,8 +29,8 @@ public ConcreteClientDeleteManyModel(final Bson filter, @Nullable final ClientDe @Override public String toString() { - return "ClientDeleteManyModel" - + "{filter=" + getFilter() + return "ClientDeleteManyModel{" + + "filter=" + getFilter() + ", options=" + getOptions() + '}'; } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java index 5c01946f31b..9e969ba9eeb 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientDeleteOneModel.java @@ -29,8 +29,8 @@ public ConcreteClientDeleteOneModel(final Bson filter, @Nullable final ClientDel @Override public String toString() { - return "ClientDeleteOneModel" - + "{filter=" + getFilter() + return "ClientDeleteOneModel{" + + "filter=" + getFilter() + ", options=" + getOptions() + '}'; } diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java index 8d0a9e1582b..2908a500521 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java @@ -37,8 +37,8 @@ public ConcreteClientUpdateManyModel( @Override public String toString() { - return "ClientUpdateManyModel" - + "{filter=" + getFilter() + return "ClientUpdateManyModel{" + + "filter=" + getFilter() + ", update=" + (getUpdate().isPresent() ? getUpdate() : getUpdatePipeline().orElseThrow(Assertions::fail)) + ", options=" + getOptions() + '}'; diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java index 88681c69e01..8e0c4e15d0a 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java @@ -37,8 +37,8 @@ public ConcreteClientUpdateOneModel( @Override public String toString() { - return "ClientUpdateOneModel" - + "{filter=" + getFilter() + return "ClientUpdateOneModel{" + + "filter=" + getFilter() + ", update=" + (getUpdate().isPresent() ? getUpdate() : getUpdatePipeline().orElseThrow(Assertions::fail)) + ", options=" + getOptions() + '}'; diff --git a/driver-scala/src/test/scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala b/driver-scala/src/test/scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala index 52c552cfde5..b6d86bf8118 100644 --- a/driver-scala/src/test/scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala +++ b/driver-scala/src/test/scala/org/mongodb/scala/ApiAliasAndCompanionSpec.scala @@ -93,7 +93,7 @@ class ApiAliasAndCompanionSpec extends BaseSpec { "SyncClientEncryption", "BaseClientUpdateOptions", "BaseClientDeleteOptions", - "MongoAssertions" + "MongoBaseInterfaceAssertions" ) val scalaExclusions = Set( "BuildInfo", From 76b815b200c933ab5be8a3a289c96baecf581630 Mon Sep 17 00:00:00 2001 From: Viacheslav Babanin Date: Wed, 8 Jan 2025 18:15:06 -0800 Subject: [PATCH 18/22] Update driver-core/src/test/unit/com/mongodb/MongoBaseInterfaceAssertions.java Co-authored-by: Valentin Kovalenko --- .../src/test/unit/com/mongodb/MongoBaseInterfaceAssertions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver-core/src/test/unit/com/mongodb/MongoBaseInterfaceAssertions.java b/driver-core/src/test/unit/com/mongodb/MongoBaseInterfaceAssertions.java index a898178d706..fe9a58b0629 100644 --- a/driver-core/src/test/unit/com/mongodb/MongoBaseInterfaceAssertions.java +++ b/driver-core/src/test/unit/com/mongodb/MongoBaseInterfaceAssertions.java @@ -37,7 +37,7 @@ public static void assertSubtypeReturn(final String packageName, Reflections reflections = new Reflections(packageName); Set> subtypes = reflections.getSubTypesOf(baseClass).stream() .filter(aClass -> Modifier.isPublic(aClass.getModifiers())) - .filter(aClass -> !aClass.getPackage().getName().contains("internal")) + .filter(aClass -> !aClass.getPackage().getName().contains(".internal")) .collect(Collectors.toSet()); Method[] baseMethods = baseClass.getDeclaredMethods(); From 8d862ec39e26786c9f2054ca4e9579c115d41bb6 Mon Sep 17 00:00:00 2001 From: Viacheslav Babanin Date: Wed, 8 Jan 2025 18:36:46 -0800 Subject: [PATCH 19/22] Update driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java Co-authored-by: Valentin Kovalenko --- .../client/model/bulk/ConcreteClientUpdateOneModel.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java index 8e0c4e15d0a..83d02669514 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateOneModel.java @@ -39,7 +39,8 @@ public ConcreteClientUpdateOneModel( public String toString() { return "ClientUpdateOneModel{" + "filter=" + getFilter() - + ", update=" + (getUpdate().isPresent() ? getUpdate() : getUpdatePipeline().orElseThrow(Assertions::fail)) + + ", update=" + getUpdate().map(Object::toString).orElseGet(() -> + getUpdatePipeline().map(Object::toString).orElseThrow(Assertions::fail)) + ", options=" + getOptions() + '}'; } From 2cc9abbb603c69652aab5c8cf5061a955140265e Mon Sep 17 00:00:00 2001 From: Viacheslav Babanin Date: Wed, 8 Jan 2025 18:36:52 -0800 Subject: [PATCH 20/22] Update driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java Co-authored-by: Valentin Kovalenko --- .../client/model/bulk/ConcreteClientUpdateManyModel.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java index 2908a500521..83d72e937f6 100644 --- a/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java +++ b/driver-core/src/main/com/mongodb/internal/client/model/bulk/ConcreteClientUpdateManyModel.java @@ -39,7 +39,8 @@ public ConcreteClientUpdateManyModel( public String toString() { return "ClientUpdateManyModel{" + "filter=" + getFilter() - + ", update=" + (getUpdate().isPresent() ? getUpdate() : getUpdatePipeline().orElseThrow(Assertions::fail)) + + ", update=" + getUpdate().map(Object::toString).orElseGet(() -> + getUpdatePipeline().map(Object::toString).orElseThrow(Assertions::fail)) + ", options=" + getOptions() + '}'; } From ac9e2b9b691b5bf2f680da2191abdae1227d7d50 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Wed, 8 Jan 2025 18:38:46 -0800 Subject: [PATCH 21/22] Remove package name as parameter. JAVA-5737 --- .../test/unit/com/mongodb/MongoBaseInterfaceAssertions.java | 5 ++--- .../client/model/bulk/BaseClientDeleteOptionsTest.java | 2 +- .../client/model/bulk/BaseClientUpdateOptionsTest.java | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/driver-core/src/test/unit/com/mongodb/MongoBaseInterfaceAssertions.java b/driver-core/src/test/unit/com/mongodb/MongoBaseInterfaceAssertions.java index fe9a58b0629..93f784b0506 100644 --- a/driver-core/src/test/unit/com/mongodb/MongoBaseInterfaceAssertions.java +++ b/driver-core/src/test/unit/com/mongodb/MongoBaseInterfaceAssertions.java @@ -32,9 +32,8 @@ private MongoBaseInterfaceAssertions() { //NOP } - public static void assertSubtypeReturn(final String packageName, - final Class baseClass) { - Reflections reflections = new Reflections(packageName); + public static void assertSubtypeReturn(final Class baseClass) { + Reflections reflections = new Reflections("com.mongodb"); Set> subtypes = reflections.getSubTypesOf(baseClass).stream() .filter(aClass -> Modifier.isPublic(aClass.getModifiers())) .filter(aClass -> !aClass.getPackage().getName().contains(".internal")) diff --git a/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientDeleteOptionsTest.java b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientDeleteOptionsTest.java index 2766a258a2d..e9832c24b21 100644 --- a/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientDeleteOptionsTest.java +++ b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientDeleteOptionsTest.java @@ -23,6 +23,6 @@ class BaseClientDeleteOptionsTest { @Test void testAllSubInterfacesOverrideMethods() { - MongoBaseInterfaceAssertions.assertSubtypeReturn("com.mongodb", BaseClientDeleteOptions.class); + MongoBaseInterfaceAssertions.assertSubtypeReturn(BaseClientDeleteOptions.class); } } diff --git a/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java index 28da614d7d6..43ba8e0967e 100644 --- a/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java +++ b/driver-core/src/test/unit/com/mongodb/client/model/bulk/BaseClientUpdateOptionsTest.java @@ -23,6 +23,6 @@ class BaseClientUpdateOptionsTest { @Test void testAllSubInterfacesOverrideMethods() { - MongoBaseInterfaceAssertions.assertSubtypeReturn("com.mongodb", BaseClientUpdateOptions.class); + MongoBaseInterfaceAssertions.assertSubtypeReturn(BaseClientUpdateOptions.class); } } From bda45a8d9bb4ee82d116c8d467247dcc5d021016 Mon Sep 17 00:00:00 2001 From: "slav.babanin" Date: Wed, 8 Jan 2025 18:44:18 -0800 Subject: [PATCH 22/22] Add Javadoc. JAVA-5737 --- .../com/mongodb/client/model/bulk/BaseClientDeleteOptions.java | 3 +++ .../com/mongodb/client/model/bulk/BaseClientUpdateOptions.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java index d50a1bc77b5..025865a7217 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientDeleteOptions.java @@ -20,6 +20,9 @@ import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; +/** + * The methods declared in this interface are part of the public API of subclasses or sub-interfaces. + */ interface BaseClientDeleteOptions { BaseClientDeleteOptions collation(@Nullable Collation collation); diff --git a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java index c0ae9c4ac44..13ce34ee8bc 100644 --- a/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java +++ b/driver-core/src/main/com/mongodb/client/model/bulk/BaseClientUpdateOptions.java @@ -19,6 +19,9 @@ import com.mongodb.lang.Nullable; import org.bson.conversions.Bson; +/** + * The methods declared in this interface are part of the public API of subclasses or sub-interfaces. + */ interface BaseClientUpdateOptions { BaseClientUpdateOptions arrayFilters(@Nullable Iterable arrayFilters);