From 2e8eecfd7e7ceda33b7cd6974b223d0f026906cb Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Tue, 7 Jan 2025 15:11:37 -0500 Subject: [PATCH 1/5] wip --- .../search/MoreLikeThisSearchOperator.java | 33 +++++++++++++++ .../SearchConstructibleBsonElement.java | 2 +- .../client/model/search/SearchOperator.java | 26 ++++++++++++ .../model/search/SearchOperatorTest.java | 42 +++++++++++++++++++ .../scala/model/search/SearchOperator.scala | 20 +++++++++ .../mongodb/scala/model/search/package.scala | 7 ++++ 6 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 driver-core/src/main/com/mongodb/client/model/search/MoreLikeThisSearchOperator.java diff --git a/driver-core/src/main/com/mongodb/client/model/search/MoreLikeThisSearchOperator.java b/driver-core/src/main/com/mongodb/client/model/search/MoreLikeThisSearchOperator.java new file mode 100644 index 00000000000..b9f9826d858 --- /dev/null +++ b/driver-core/src/main/com/mongodb/client/model/search/MoreLikeThisSearchOperator.java @@ -0,0 +1,33 @@ +/* + * 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.search; + +import com.mongodb.annotations.Beta; +import com.mongodb.annotations.Reason; +import com.mongodb.annotations.Sealed; +import org.bson.BsonDocument; + +/** + * @see SearchOperator#moreLikeThis(BsonDocument) + * @see SearchOperator#moreLikeThis(Iterable) + * @since 4.7 + */ +@Sealed +@Beta(Reason.CLIENT) +public interface MoreLikeThisSearchOperator extends SearchOperator { + @Override + TextSearchOperator score(SearchScore modifier); +} diff --git a/driver-core/src/main/com/mongodb/client/model/search/SearchConstructibleBsonElement.java b/driver-core/src/main/com/mongodb/client/model/search/SearchConstructibleBsonElement.java index 8f0b1e510c5..73f61991838 100644 --- a/driver-core/src/main/com/mongodb/client/model/search/SearchConstructibleBsonElement.java +++ b/driver-core/src/main/com/mongodb/client/model/search/SearchConstructibleBsonElement.java @@ -31,7 +31,7 @@ final class SearchConstructibleBsonElement extends AbstractConstructibleBsonElement implements MustCompoundSearchOperator, MustNotCompoundSearchOperator, ShouldCompoundSearchOperator, FilterCompoundSearchOperator, ExistsSearchOperator, TextSearchOperator, AutocompleteSearchOperator, - NumberNearSearchOperator, DateNearSearchOperator, GeoNearSearchOperator, + NumberNearSearchOperator, DateNearSearchOperator, GeoNearSearchOperator, MoreLikeThisSearchOperator, ValueBoostSearchScore, PathBoostSearchScore, ConstantSearchScore, FunctionSearchScore, GaussSearchScoreExpression, PathSearchScoreExpression, FacetSearchCollector, diff --git a/driver-core/src/main/com/mongodb/client/model/search/SearchOperator.java b/driver-core/src/main/com/mongodb/client/model/search/SearchOperator.java index 9234db91c51..6f2d14e54be 100644 --- a/driver-core/src/main/com/mongodb/client/model/search/SearchOperator.java +++ b/driver-core/src/main/com/mongodb/client/model/search/SearchOperator.java @@ -20,6 +20,7 @@ import com.mongodb.annotations.Sealed; import com.mongodb.client.model.Aggregates; import com.mongodb.client.model.geojson.Point; +import org.bson.BsonDocument; import org.bson.BsonType; import org.bson.Document; import org.bson.conversions.Bson; @@ -292,6 +293,31 @@ static GeoNearSearchOperator near(final Point origin, final Number pivot, final .append("pivot", notNull("pivot", pivot))); } + /** + * Returns a {@link SearchOperator} that returns documents similar to input documents. + * + * @param like The BSON document that is used to extract representative terms to query for. + * @return The requested {@link SearchOperator}. + * @mongodb.atlas.manual atlas-search/morelikethis/ moreLikeThis operator + */ + static MoreLikeThisSearchOperator moreLikeThis(final BsonDocument like) { + return moreLikeThis(singleton(notNull("like", like))); + } + + /** + * Returns a {@link SearchOperator} that returns documents similar to input documents. + * + * @param likes The BSON documents that are used to extract representative terms to query for. + * @return The requested {@link SearchOperator}. + * @mongodb.atlas.manual atlas-search/morelikethis/ moreLikeThis operator + */ + static MoreLikeThisSearchOperator moreLikeThis(final Iterable likes) { + Iterator likesIterator = notNull("likes", likes).iterator(); + isTrueArgument("likes must not be empty", likesIterator.hasNext()); + BsonDocument firstLike = likesIterator.next(); + return new SearchConstructibleBsonElement("moreLikeThis", new Document("like", likesIterator.hasNext() ? likes : firstLike)); + } + /** * Creates a {@link SearchOperator} from a {@link Bson} in situations when there is no builder method that better satisfies your needs. * This method cannot be used to validate the syntax. diff --git a/driver-core/src/test/unit/com/mongodb/client/model/search/SearchOperatorTest.java b/driver-core/src/test/unit/com/mongodb/client/model/search/SearchOperatorTest.java index c0ea645fb73..37396a481c4 100644 --- a/driver-core/src/test/unit/com/mongodb/client/model/search/SearchOperatorTest.java +++ b/driver-core/src/test/unit/com/mongodb/client/model/search/SearchOperatorTest.java @@ -581,6 +581,48 @@ void near() { ); } + @Test + void moreLikeThis() { + BsonDocument doc = new BsonDocument("like", new BsonDocument("fieldName", new BsonString("fieldValue")) + .append("fieldName2", new BsonString("fieldValue2"))); + assertAll( + () -> assertThrows(IllegalArgumentException.class, () -> + // likes must not be empty + SearchOperator.moreLikeThis(emptyList()) + ), + () -> assertEquals( + new BsonDocument("moreLikeThis", + new BsonDocument("like", new BsonDocument("fieldName", new BsonString("fieldValue"))) + ), + SearchOperator.moreLikeThis(new BsonDocument("fieldName", new BsonString("fieldValue"))) + .toBsonDocument() + ), + () -> assertEquals( + new BsonDocument("moreLikeThis", + new BsonDocument("like", new BsonDocument("fieldName", new BsonString("fieldValue")) + .append("fieldName2", new BsonString("fieldValue2"))) + ), + SearchOperator.moreLikeThis(new BsonDocument("fieldName", new BsonString("fieldValue")) + .append("fieldName2", new BsonString("fieldValue2"))) + .toBsonDocument() + ), + () -> assertEquals( + new BsonDocument("moreLikeThis", + new BsonDocument("like", new BsonArray(asList( + new BsonDocument("fieldName", new BsonString("fieldValue")) + .append("fieldName2", new BsonString("fieldValue2")), + new BsonDocument("fieldName3", new BsonString("fieldValue3")) + ))) + ), + SearchOperator.moreLikeThis(asList( + new BsonDocument("fieldName", new BsonString("fieldValue")) + .append("fieldName2", new BsonString("fieldValue2")), + new BsonDocument("fieldName3", new BsonString("fieldValue3")))) + .toBsonDocument() + ) + ); + } + private static SearchOperator docExamplePredefined() { return SearchOperator.exists( fieldPath("fieldName")); diff --git a/driver-scala/src/main/scala/org/mongodb/scala/model/search/SearchOperator.scala b/driver-scala/src/main/scala/org/mongodb/scala/model/search/SearchOperator.scala index 90f27092ebc..ae4b2bf8616 100644 --- a/driver-scala/src/main/scala/org/mongodb/scala/model/search/SearchOperator.scala +++ b/driver-scala/src/main/scala/org/mongodb/scala/model/search/SearchOperator.scala @@ -17,6 +17,7 @@ package org.mongodb.scala.model.search import com.mongodb.annotations.{ Beta, Reason } import com.mongodb.client.model.search.{ SearchOperator => JSearchOperator } +import org.mongodb.scala.bson.BsonDocument import org.mongodb.scala.bson.conversions.Bson import org.mongodb.scala.model.geojson.Point @@ -228,6 +229,25 @@ object SearchOperator { def near(origin: Point, pivot: Number, paths: Iterable[_ <: FieldSearchPath]): GeoNearSearchOperator = JSearchOperator.near(origin, pivot, paths.asJava) + /** + * Returns a `SearchOperator` that returns documents similar to input documents. + * + * @param like The BSON document that is used to extract representative terms to query for. + * @return The requested `SearchOperator`. + * @see [[https://www.mongodb.com/docs/atlas/atlas-search/morelikethis/ moreLikeThis operator]] + */ + def moreLikeThis(like: BsonDocument): MoreLikeThisSearchOperator = JSearchOperator.moreLikeThis(like) + + /** + * Returns a `SearchOperator` that returns documents similar to input documents. + * + * @param likes The BSON documents that are used to extract representative terms to query for. + * @return The requested `SearchOperator`. + * @see [[https://www.mongodb.com/docs/atlas/atlas-search/morelikethis/ moreLikeThis operator]] + */ + def moreLikeThis(likes: Iterable[BsonDocument]): MoreLikeThisSearchOperator = + JSearchOperator.moreLikeThis(likes.asJava) + /** * Creates a `SearchOperator` from a `Bson` in situations when there is no builder method that better satisfies your needs. * This method cannot be used to validate the syntax. diff --git a/driver-scala/src/main/scala/org/mongodb/scala/model/search/package.scala b/driver-scala/src/main/scala/org/mongodb/scala/model/search/package.scala index 557060324cd..d0a1ca51651 100644 --- a/driver-scala/src/main/scala/org/mongodb/scala/model/search/package.scala +++ b/driver-scala/src/main/scala/org/mongodb/scala/model/search/package.scala @@ -182,6 +182,13 @@ package object search { @Beta(Array(Reason.CLIENT)) type GeoNearSearchOperator = com.mongodb.client.model.search.GeoNearSearchOperator + /** + * @see `SearchOperator.moreLikeThis` + */ + @Sealed + @Beta(Array(Reason.CLIENT)) + type MoreLikeThisSearchOperator = com.mongodb.client.model.search.MoreLikeThisSearchOperator + /** * Fuzzy search options that may be used with some [[SearchOperator]]s. * From 8956d4654e55e388ef0d43f7d5939833e9feca12 Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Thu, 9 Jan 2025 16:34:18 -0500 Subject: [PATCH 2/5] wip --- .../model/search/AggregatesSearchIntegrationTest.java | 6 +++++- .../com/mongodb/client/model/search/SearchOperatorTest.java | 2 -- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/driver-core/src/test/functional/com/mongodb/client/model/search/AggregatesSearchIntegrationTest.java b/driver-core/src/test/functional/com/mongodb/client/model/search/AggregatesSearchIntegrationTest.java index 29de80dda32..1ad5af82435 100644 --- a/driver-core/src/test/functional/com/mongodb/client/model/search/AggregatesSearchIntegrationTest.java +++ b/driver-core/src/test/functional/com/mongodb/client/model/search/AggregatesSearchIntegrationTest.java @@ -23,6 +23,7 @@ import com.mongodb.client.model.geojson.Position; import com.mongodb.client.test.CollectionHelper; import org.bson.BsonDocument; +import org.bson.BsonString; import org.bson.codecs.BsonDocumentCodec; import org.bson.conversions.Bson; import org.bson.json.JsonWriterSettings; @@ -80,6 +81,7 @@ import static com.mongodb.client.model.search.SearchOperator.compound; import static com.mongodb.client.model.search.SearchOperator.dateRange; import static com.mongodb.client.model.search.SearchOperator.exists; +import static com.mongodb.client.model.search.SearchOperator.moreLikeThis; import static com.mongodb.client.model.search.SearchOperator.near; import static com.mongodb.client.model.search.SearchOperator.numberRange; import static com.mongodb.client.model.search.SearchOperator.text; @@ -608,7 +610,9 @@ private static Stream searchAndSearchMetaArgs() { dateRange(fieldPath("fieldName6")) .lte(Instant.ofEpochMilli(1)), near(0, 1.5, fieldPath("fieldName7"), fieldPath("fieldName8")), - near(Instant.ofEpochMilli(1), Duration.ofMillis(3), fieldPath("fieldName9")) + near(Instant.ofEpochMilli(1), Duration.ofMillis(3), fieldPath("fieldName9")), + moreLikeThis(new BsonDocument("like", new BsonDocument("fieldName10", + new BsonString("term6")))) )) .minimumShouldMatch(1) .mustNot(singleton( diff --git a/driver-core/src/test/unit/com/mongodb/client/model/search/SearchOperatorTest.java b/driver-core/src/test/unit/com/mongodb/client/model/search/SearchOperatorTest.java index 37396a481c4..bcfc7b28032 100644 --- a/driver-core/src/test/unit/com/mongodb/client/model/search/SearchOperatorTest.java +++ b/driver-core/src/test/unit/com/mongodb/client/model/search/SearchOperatorTest.java @@ -583,8 +583,6 @@ void near() { @Test void moreLikeThis() { - BsonDocument doc = new BsonDocument("like", new BsonDocument("fieldName", new BsonString("fieldValue")) - .append("fieldName2", new BsonString("fieldValue2"))); assertAll( () -> assertThrows(IllegalArgumentException.class, () -> // likes must not be empty From 363b7439f96220a8a5f6206a0231948a8c690fcb Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Wed, 15 Jan 2025 17:07:16 -0500 Subject: [PATCH 3/5] wip --- .../com/mongodb/client/model/search/SearchOperatorTest.java | 1 + driver-kotlin-extensions/build.gradle.kts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/driver-core/src/test/unit/com/mongodb/client/model/search/SearchOperatorTest.java b/driver-core/src/test/unit/com/mongodb/client/model/search/SearchOperatorTest.java index d2ee744d2d4..bf720054368 100644 --- a/driver-core/src/test/unit/com/mongodb/client/model/search/SearchOperatorTest.java +++ b/driver-core/src/test/unit/com/mongodb/client/model/search/SearchOperatorTest.java @@ -616,6 +616,7 @@ void moreLikeThis() { new BsonDocument("fieldName", new BsonString("fieldValue")) .append("fieldName2", new BsonString("fieldValue2")), new BsonDocument("fieldName3", new BsonString("fieldValue3")))) + .toBsonDocument() ) ); } diff --git a/driver-kotlin-extensions/build.gradle.kts b/driver-kotlin-extensions/build.gradle.kts index e0192fa5abc..76f36ca33b2 100644 --- a/driver-kotlin-extensions/build.gradle.kts +++ b/driver-kotlin-extensions/build.gradle.kts @@ -165,4 +165,6 @@ tasks.javadocJar.configure { // =========================== tasks.sourcesJar { from(project.sourceSets.main.map { it.kotlin }) } -afterEvaluate { tasks.jar { manifest { attributes["Automatic-Module-Name"] = "org.mongodb.driver.kotlin.extensions" } } } +afterEvaluate { + tasks.jar { manifest { attributes["Automatic-Module-Name"] = "org.mongodb.driver.kotlin.extensions" } } +} From 756ea4bd6b0aab8f28cce857e4b2db0d3e572ad8 Mon Sep 17 00:00:00 2001 From: joykim1005 <81274936+joykim1005@users.noreply.github.com> Date: Fri, 17 Jan 2025 10:39:03 -0500 Subject: [PATCH 4/5] Update driver-core/src/main/com/mongodb/client/model/search/SearchOperator.java Co-authored-by: Maxim Katcharov --- .../main/com/mongodb/client/model/search/SearchOperator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver-core/src/main/com/mongodb/client/model/search/SearchOperator.java b/driver-core/src/main/com/mongodb/client/model/search/SearchOperator.java index c2d29088659..002386425ae 100644 --- a/driver-core/src/main/com/mongodb/client/model/search/SearchOperator.java +++ b/driver-core/src/main/com/mongodb/client/model/search/SearchOperator.java @@ -305,7 +305,7 @@ static MoreLikeThisSearchOperator moreLikeThis(final BsonDocument like) { } /** - * Returns a {@link SearchOperator} that returns documents similar to input documents. + * Returns a {@link SearchOperator} that returns documents similar to input document. * * @param likes The BSON documents that are used to extract representative terms to query for. * @return The requested {@link SearchOperator}. From 53f441451eb707f0b9ac296eb3fd8211f0eece16 Mon Sep 17 00:00:00 2001 From: joykim1005 <81274936+joykim1005@users.noreply.github.com> Date: Fri, 17 Jan 2025 10:39:13 -0500 Subject: [PATCH 5/5] Update driver-scala/src/main/scala/org/mongodb/scala/model/search/SearchOperator.scala Co-authored-by: Maxim Katcharov --- .../scala/org/mongodb/scala/model/search/SearchOperator.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver-scala/src/main/scala/org/mongodb/scala/model/search/SearchOperator.scala b/driver-scala/src/main/scala/org/mongodb/scala/model/search/SearchOperator.scala index db13ad9126f..2bdc39bc464 100644 --- a/driver-scala/src/main/scala/org/mongodb/scala/model/search/SearchOperator.scala +++ b/driver-scala/src/main/scala/org/mongodb/scala/model/search/SearchOperator.scala @@ -230,7 +230,7 @@ object SearchOperator { JSearchOperator.near(origin, pivot, paths.asJava) /** - * Returns a `SearchOperator` that returns documents similar to input documents. + * Returns a `SearchOperator` that returns documents similar to input document. * * @param like The BSON document that is used to extract representative terms to query for. * @return The requested `SearchOperator`.