From f884705f737a26c3c56c95a840da0477eeb0da87 Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Wed, 25 Dec 2024 19:56:11 -0500 Subject: [PATCH 1/4] add queryString --- .../search/QueryStringSearchOperator.java | 32 +++++++++++++++++++ .../SearchConstructibleBsonElement.java | 2 +- .../client/model/search/SearchOperator.java | 17 ++++++++++ .../AggregatesSearchIntegrationTest.java | 4 ++- .../model/search/SearchOperatorTest.java | 25 +++++++++++++++ .../scala/model/search/SearchOperator.scala | 11 +++++++ .../mongodb/scala/model/search/package.scala | 7 ++++ 7 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 driver-core/src/main/com/mongodb/client/model/search/QueryStringSearchOperator.java diff --git a/driver-core/src/main/com/mongodb/client/model/search/QueryStringSearchOperator.java b/driver-core/src/main/com/mongodb/client/model/search/QueryStringSearchOperator.java new file mode 100644 index 00000000000..0027d233dc7 --- /dev/null +++ b/driver-core/src/main/com/mongodb/client/model/search/QueryStringSearchOperator.java @@ -0,0 +1,32 @@ +/* + * 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; + +/** + * @see SearchOperator#text(SearchPath, String) + * @see SearchOperator#text(Iterable, Iterable) + * @since 4.7 + */ +@Sealed +@Beta(Reason.CLIENT) +public interface QueryStringSearchOperator 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..54273b89c8d 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, QueryStringSearchOperator, 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..90569f9e42a 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 @@ -292,6 +292,23 @@ static GeoNearSearchOperator near(final Point origin, final Number pivot, final .append("pivot", notNull("pivot", pivot))); } + /** + * Returns a {@link SearchOperator} that supports querying a combination of indexed fields and values. + * + * @param defaultPath The field to be searched by default. + * @param query One or more indexed fields and values to search. + * @return The requested {@link SearchOperator}. + * @mongodb.atlas.manual atlas-search/queryString/ queryString operator + */ + static QueryStringSearchOperator queryString(final SearchPath defaultPath, final String query) { + isTrueArgument("path must not be empty", defaultPath != null); + isTrueArgument("query must not be empty", query != null); + + return new SearchConstructibleBsonElement("queryString", + new Document("defaultPath", defaultPath.toBsonValue()) + .append("query", query)); + } + /** * 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/functional/com/mongodb/client/model/search/AggregatesSearchIntegrationTest.java b/driver-core/src/test/functional/com/mongodb/client/model/search/AggregatesSearchIntegrationTest.java index 29de80dda32..e575af9574d 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 @@ -82,6 +82,7 @@ import static com.mongodb.client.model.search.SearchOperator.exists; 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.queryString; import static com.mongodb.client.model.search.SearchOperator.text; import static com.mongodb.client.model.search.SearchOptions.searchOptions; import static com.mongodb.client.model.search.SearchPath.fieldPath; @@ -608,7 +609,8 @@ 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")), + queryString(fieldPath("fieldName12"), "term8") )) .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 c0ea645fb73..9732045784d 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,31 @@ void near() { ); } + + @Test + void queryString() { + assertAll( + () -> assertThrows(IllegalArgumentException.class, () -> + // queries must not be empty + SearchOperator.queryString(fieldPath("fieldName"), null) + ), + () -> assertThrows(IllegalArgumentException.class, () -> + // paths must not be empty + SearchOperator.queryString(null, "term1 AND (term2 OR term3)") + ), + () -> assertEquals( + new BsonDocument("queryString", + new BsonDocument("defaultPath", fieldPath("fieldName").toBsonValue()) + .append("query", new BsonString("term1 AND (term2 OR term3)")) + ), + SearchOperator.queryString( + fieldPath("fieldName"), + "term1 AND (term2 OR term3)") + .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..b98c0974662 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 @@ -228,6 +228,17 @@ object SearchOperator { def near(origin: Point, pivot: Number, paths: Iterable[_ <: FieldSearchPath]): GeoNearSearchOperator = JSearchOperator.near(origin, pivot, paths.asJava) + /** + * Returns a `SearchOperator` that supports querying a combination of indexed fields and values. + * + * @param defaultPath The field to be searched by default. + * @param query One or more indexed fields and values to search. + * @return The requested `SearchOperator`. + * @see [[https://www.mongodb.com/docs/atlas/atlas-search/queryString/ queryString operator]] + */ + def queryString(defaultPath: SearchPath, query: String): QueryStringSearchOperator = + JSearchOperator.queryString(defaultPath, query) + /** * 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..367e1200f35 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.queryString` + */ + @Sealed + @Beta(Array(Reason.CLIENT)) + type QueryStringSearchOperator = com.mongodb.client.model.search.QueryStringSearchOperator + /** * Fuzzy search options that may be used with some [[SearchOperator]]s. * From 1e313947c7634e40d54fff7a5171287d0ccdde63 Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Wed, 25 Dec 2024 22:59:43 -0500 Subject: [PATCH 2/4] updated version --- .../client/model/search/QueryStringSearchOperator.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/driver-core/src/main/com/mongodb/client/model/search/QueryStringSearchOperator.java b/driver-core/src/main/com/mongodb/client/model/search/QueryStringSearchOperator.java index 0027d233dc7..53acd73cc03 100644 --- a/driver-core/src/main/com/mongodb/client/model/search/QueryStringSearchOperator.java +++ b/driver-core/src/main/com/mongodb/client/model/search/QueryStringSearchOperator.java @@ -20,13 +20,12 @@ import com.mongodb.annotations.Sealed; /** - * @see SearchOperator#text(SearchPath, String) - * @see SearchOperator#text(Iterable, Iterable) - * @since 4.7 + * @see SearchOperator#queryString(SearchPath, String) + * @since 5.3 */ @Sealed @Beta(Reason.CLIENT) public interface QueryStringSearchOperator extends SearchOperator { @Override - TextSearchOperator score(SearchScore modifier); + QueryStringSearchOperator score(SearchScore modifier); } From 85c3580708055d3b3f62a7300624478050eeee4b Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Fri, 10 Jan 2025 12:57:02 -0500 Subject: [PATCH 3/4] searchPath to FieldSearchPath --- .../mongodb/client/model/search/QueryStringSearchOperator.java | 2 +- .../main/com/mongodb/client/model/search/SearchOperator.java | 2 +- .../scala/org/mongodb/scala/model/search/SearchOperator.scala | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/driver-core/src/main/com/mongodb/client/model/search/QueryStringSearchOperator.java b/driver-core/src/main/com/mongodb/client/model/search/QueryStringSearchOperator.java index 53acd73cc03..eb32ee8c733 100644 --- a/driver-core/src/main/com/mongodb/client/model/search/QueryStringSearchOperator.java +++ b/driver-core/src/main/com/mongodb/client/model/search/QueryStringSearchOperator.java @@ -20,7 +20,7 @@ import com.mongodb.annotations.Sealed; /** - * @see SearchOperator#queryString(SearchPath, String) + * @see SearchOperator#queryString(FieldSearchPath, String) * @since 5.3 */ @Sealed 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 90569f9e42a..9a71d9f1f42 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 @@ -300,7 +300,7 @@ static GeoNearSearchOperator near(final Point origin, final Number pivot, final * @return The requested {@link SearchOperator}. * @mongodb.atlas.manual atlas-search/queryString/ queryString operator */ - static QueryStringSearchOperator queryString(final SearchPath defaultPath, final String query) { + static QueryStringSearchOperator queryString(final FieldSearchPath defaultPath, final String query) { isTrueArgument("path must not be empty", defaultPath != null); isTrueArgument("query must not be empty", query != null); 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 b98c0974662..6e1cc91a9bb 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 @@ -236,7 +236,7 @@ object SearchOperator { * @return The requested `SearchOperator`. * @see [[https://www.mongodb.com/docs/atlas/atlas-search/queryString/ queryString operator]] */ - def queryString(defaultPath: SearchPath, query: String): QueryStringSearchOperator = + def queryString(defaultPath: FieldSearchPath, query: String): QueryStringSearchOperator = JSearchOperator.queryString(defaultPath, query) /** From a0a60ba5e5ec98cf644af9d734bf9bd0f1ca59f3 Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Wed, 15 Jan 2025 15:33:52 -0500 Subject: [PATCH 4/4] fix checkstyle --- .../com/mongodb/client/model/search/SearchOperatorTest.java | 2 +- driver-kotlin-extensions/build.gradle.kts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) 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 e596f784f9d..fbb39b2afaf 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 @@ -604,7 +604,7 @@ void queryString() { ) ); } - + @Test void phrase() { assertAll( 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" } } +}