Skip to content

Commit 0d87508

Browse files
authored
Add queryString operator to Atlas Search (#1588)
Add queryString operator to Atlas Search There are several Atlas Search query operators that are not implemented with first class support in the Java driver. This PR adds the queryString operator to Atlas Search. JAVA-5727
1 parent e022dbd commit 0d87508

File tree

7 files changed

+94
-2
lines changed

7 files changed

+94
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright 2008-present MongoDB, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.mongodb.client.model.search;
17+
18+
import com.mongodb.annotations.Beta;
19+
import com.mongodb.annotations.Reason;
20+
import com.mongodb.annotations.Sealed;
21+
22+
/**
23+
* @see SearchOperator#queryString(FieldSearchPath, String)
24+
* @since 5.3
25+
*/
26+
@Sealed
27+
@Beta(Reason.CLIENT)
28+
public interface QueryStringSearchOperator extends SearchOperator {
29+
@Override
30+
QueryStringSearchOperator score(SearchScore modifier);
31+
}

driver-core/src/main/com/mongodb/client/model/search/SearchConstructibleBsonElement.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
final class SearchConstructibleBsonElement extends AbstractConstructibleBsonElement<SearchConstructibleBsonElement> implements
3232
MustCompoundSearchOperator, MustNotCompoundSearchOperator, ShouldCompoundSearchOperator, FilterCompoundSearchOperator,
3333
ExistsSearchOperator, TextSearchOperator, AutocompleteSearchOperator,
34-
NumberNearSearchOperator, DateNearSearchOperator, GeoNearSearchOperator, RegexSearchOperator,
34+
NumberNearSearchOperator, DateNearSearchOperator, GeoNearSearchOperator, RegexSearchOperator, QueryStringSearchOperator,
3535
ValueBoostSearchScore, PathBoostSearchScore, ConstantSearchScore, FunctionSearchScore,
3636
GaussSearchScoreExpression, PathSearchScoreExpression,
3737
FacetSearchCollector,

driver-core/src/main/com/mongodb/client/model/search/SearchOperator.java

+17
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,23 @@ static GeoNearSearchOperator near(final Point origin, final Number pivot, final
292292
.append("pivot", notNull("pivot", pivot)));
293293
}
294294

295+
/**
296+
* Returns a {@link SearchOperator} that supports querying a combination of indexed fields and values.
297+
*
298+
* @param defaultPath The field to be searched by default.
299+
* @param query One or more indexed fields and values to search.
300+
* @return The requested {@link SearchOperator}.
301+
* @mongodb.atlas.manual atlas-search/queryString/ queryString operator
302+
*/
303+
static QueryStringSearchOperator queryString(final FieldSearchPath defaultPath, final String query) {
304+
isTrueArgument("path must not be empty", defaultPath != null);
305+
isTrueArgument("query must not be empty", query != null);
306+
307+
return new SearchConstructibleBsonElement("queryString",
308+
new Document("defaultPath", defaultPath.toBsonValue())
309+
.append("query", query));
310+
}
311+
295312
/**
296313
* Returns a {@link SearchOperator} that performs a search for documents containing an ordered sequence of terms.
297314
*

driver-core/src/test/functional/com/mongodb/client/model/search/AggregatesSearchIntegrationTest.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
import static com.mongodb.client.model.search.SearchOperator.exists;
8383
import static com.mongodb.client.model.search.SearchOperator.near;
8484
import static com.mongodb.client.model.search.SearchOperator.numberRange;
85+
import static com.mongodb.client.model.search.SearchOperator.queryString;
8586
import static com.mongodb.client.model.search.SearchOperator.regex;
8687
import static com.mongodb.client.model.search.SearchOperator.phrase;
8788
import static com.mongodb.client.model.search.SearchOperator.text;
@@ -612,7 +613,8 @@ private static Stream<Arguments> searchAndSearchMetaArgs() {
612613
near(0, 1.5, fieldPath("fieldName7"), fieldPath("fieldName8")),
613614
near(Instant.ofEpochMilli(1), Duration.ofMillis(3), fieldPath("fieldName9")),
614615
phrase(fieldPath("fieldName10"), "term6"),
615-
regex(fieldPath("fieldName11"), "term7")
616+
regex(fieldPath("fieldName11"), "term7"),
617+
queryString(fieldPath("fieldName12"), "term8")
616618
))
617619
.minimumShouldMatch(1)
618620
.mustNot(singleton(

driver-core/src/test/unit/com/mongodb/client/model/search/SearchOperatorTest.java

+24
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,30 @@ void near() {
581581
);
582582
}
583583

584+
@Test
585+
void queryString() {
586+
assertAll(
587+
() -> assertThrows(IllegalArgumentException.class, () ->
588+
// queries must not be empty
589+
SearchOperator.queryString(fieldPath("fieldName"), null)
590+
),
591+
() -> assertThrows(IllegalArgumentException.class, () ->
592+
// paths must not be empty
593+
SearchOperator.queryString(null, "term1 AND (term2 OR term3)")
594+
),
595+
() -> assertEquals(
596+
new BsonDocument("queryString",
597+
new BsonDocument("defaultPath", fieldPath("fieldName").toBsonValue())
598+
.append("query", new BsonString("term1 AND (term2 OR term3)"))
599+
),
600+
SearchOperator.queryString(
601+
fieldPath("fieldName"),
602+
"term1 AND (term2 OR term3)")
603+
.toBsonDocument()
604+
)
605+
);
606+
}
607+
584608
@Test
585609
void phrase() {
586610
assertAll(

driver-scala/src/main/scala/org/mongodb/scala/model/search/SearchOperator.scala

+11
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,17 @@ object SearchOperator {
228228
def near(origin: Point, pivot: Number, paths: Iterable[_ <: FieldSearchPath]): GeoNearSearchOperator =
229229
JSearchOperator.near(origin, pivot, paths.asJava)
230230

231+
/**
232+
* Returns a `SearchOperator` that supports querying a combination of indexed fields and values.
233+
*
234+
* @param defaultPath The field to be searched by default.
235+
* @param query One or more indexed fields and values to search.
236+
* @return The requested `SearchOperator`.
237+
* @see [[https://www.mongodb.com/docs/atlas/atlas-search/queryString/ queryString operator]]
238+
*/
239+
def queryString(defaultPath: FieldSearchPath, query: String): QueryStringSearchOperator =
240+
JSearchOperator.queryString(defaultPath, query)
241+
231242
/**
232243
* Returns a `SearchOperator` that performs a search for documents containing an ordered sequence of terms.
233244
*

driver-scala/src/main/scala/org/mongodb/scala/model/search/package.scala

+7
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,13 @@ package object search {
198198
@Beta(Array(Reason.CLIENT))
199199
type GeoNearSearchOperator = com.mongodb.client.model.search.GeoNearSearchOperator
200200

201+
/**
202+
* @see `SearchOperator.queryString`
203+
*/
204+
@Sealed
205+
@Beta(Array(Reason.CLIENT))
206+
type QueryStringSearchOperator = com.mongodb.client.model.search.QueryStringSearchOperator
207+
201208
/**
202209
* Fuzzy search options that may be used with some [[SearchOperator]]s.
203210
*

0 commit comments

Comments
 (0)