diff --git a/CHANGELOG.md b/CHANGELOG.md index abec0346b2..cb0b717d87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased 2.x] ### Added - Adds `queryImage` (query_image) field to `NeuralQuery`, following definition in ([Neural Query](https://opensearch.org/docs/latest/query-dsl/specialized/neural/)) ([#1137](https://github.com/opensearch-project/opensearch-java/pull/1138)) +- Adds `cancelAfterTimeInterval` to `SearchRequest` and `MsearchRequest` ([#1147](https://github.com/opensearch-project/opensearch-java/pull/1147)) ### Dependencies diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/core/MsearchRequest.java b/java-client/src/main/java/org/opensearch/client/opensearch/core/MsearchRequest.java index 931be38b15..a417915504 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/core/MsearchRequest.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/core/MsearchRequest.java @@ -48,6 +48,7 @@ import org.opensearch.client.opensearch._types.ExpandWildcard; import org.opensearch.client.opensearch._types.RequestBase; import org.opensearch.client.opensearch._types.SearchType; +import org.opensearch.client.opensearch._types.Time; import org.opensearch.client.opensearch.core.msearch.RequestItem; import org.opensearch.client.transport.Endpoint; import org.opensearch.client.transport.endpoints.SimpleEndpoint; @@ -66,6 +67,9 @@ public class MsearchRequest extends RequestBase implements NdJsonpSerializable, @Nullable private final Boolean allowNoIndices; + @Nullable + private final Time cancelAfterTimeInterval; + @Nullable private final Boolean ccsMinimizeRoundtrips; @@ -98,6 +102,7 @@ public class MsearchRequest extends RequestBase implements NdJsonpSerializable, private MsearchRequest(Builder builder) { this.allowNoIndices = builder.allowNoIndices; + this.cancelAfterTimeInterval = builder.cancelAfterTimeInterval; this.ccsMinimizeRoundtrips = builder.ccsMinimizeRoundtrips; this.expandWildcards = ApiTypeHelper.unmodifiable(builder.expandWildcards); this.ignoreThrottled = builder.ignoreThrottled; @@ -134,6 +139,17 @@ public final Boolean allowNoIndices() { return this.allowNoIndices; } + /** + * The time after which the search request will be canceled. + * Request-level parameter takes precedence over cancel_after_time_interval cluster setting. + *

+ * API name: {@code cancel_after_time_interval} + */ + @Nullable + public final Time cancelAfterTimeInterval() { + return this.cancelAfterTimeInterval; + } + /** * If true, network roundtrips between the coordinating node and remote clusters * are minimized for cross-cluster search requests. @@ -256,6 +272,7 @@ public void serialize(JsonGenerator generator, JsonpMapper mapper) { public Builder toBuilder() { return new Builder().allowNoIndices(allowNoIndices) + .cancelAfterTimeInterval(cancelAfterTimeInterval) .ccsMinimizeRoundtrips(ccsMinimizeRoundtrips) .expandWildcards(expandWildcards) .ignoreThrottled(ignoreThrottled) @@ -278,6 +295,9 @@ public static class Builder extends ObjectBuilderBase implements ObjectBuilder + * API name: {@code cancel_after_time_interval} + */ + public final Builder cancelAfterTimeInterval(@Nullable Time value) { + this.cancelAfterTimeInterval = value; + return this; + } + + /** + * The time after which the search request will be canceled. + * Request-level parameter takes precedence over cancel_after_time_interval cluster setting. + *

+ * API name: {@code cancel_after_time_interval} + */ + public final Builder cancelAfterTimeInterval(Function> fn) { + return this.cancelAfterTimeInterval(fn.apply(new Time.Builder()).build()); + } + /** * If true, network roundtrips between the coordinating node and remote clusters * are minimized for cross-cluster search requests. @@ -540,6 +581,9 @@ public MsearchRequest build() { request -> { Map params = new HashMap<>(); params.put("typed_keys", "true"); + if (request.cancelAfterTimeInterval != null) { + params.put("cancel_after_time_interval", request.cancelAfterTimeInterval._toJsonString()); + } if (request.preFilterShardSize != null) { params.put("pre_filter_shard_size", String.valueOf(request.preFilterShardSize)); } diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/core/SearchRequest.java b/java-client/src/main/java/org/opensearch/client/opensearch/core/SearchRequest.java index 424d3f1193..7937f30641 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/core/SearchRequest.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/core/SearchRequest.java @@ -110,6 +110,9 @@ public class SearchRequest extends RequestBase implements PlainJsonSerializable @Nullable private final String pipeline; + @Nullable + private final Time cancelAfterTimeInterval; + @Nullable private final FieldCollapse collapse; @@ -246,6 +249,7 @@ private SearchRequest(Builder builder) { this.ccsMinimizeRoundtrips = builder.ccsMinimizeRoundtrips; this.phaseTook = builder.phaseTook; this.pipeline = builder.pipeline; + this.cancelAfterTimeInterval = builder.cancelAfterTimeInterval; this.collapse = builder.collapse; this.defaultOperator = builder.defaultOperator; this.df = builder.df; @@ -405,6 +409,17 @@ public final String pipeline() { return this.pipeline; } + /** + * The time after which the search request will be canceled. + * Request-level parameter takes precedence over cancel_after_time_interval cluster setting. + *

+ * API name: {@code cancel_after_time_interval} + */ + @Nullable + public final Time cancelAfterTimeInterval() { + return this.cancelAfterTimeInterval; + } + /** * API name: {@code collapse} */ @@ -1125,6 +1140,7 @@ public Builder toBuilder() { .ccsMinimizeRoundtrips(ccsMinimizeRoundtrips) .phaseTook(phaseTook) .pipeline(pipeline) + .cancelAfterTimeInterval(cancelAfterTimeInterval) .collapse(collapse) .defaultOperator(defaultOperator) .df(df) @@ -1209,6 +1225,9 @@ public static class Builder extends ObjectBuilderBase implements ObjectBuilder + * API name: {@code cancel_after_time_interval} + */ + public final Builder cancelAfterTimeInterval(@Nullable Time value) { + this.cancelAfterTimeInterval = value; + return this; + } + + /** + * The time after which the search request will be canceled. + * Request-level parameter takes precedence over cancel_after_time_interval cluster setting. + *

+ * API name: {@code cancel_after_time_interval} + */ + public final Builder cancelAfterTimeInterval(Function> fn) { + return this.cancelAfterTimeInterval(fn.apply(new Time.Builder()).build()); + } + /** * API name: {@code collapse} */ @@ -2444,6 +2484,9 @@ protected static void setupSearchRequestDeserializer(ObjectDeserializer ti.time("1000ms")); + MsearchRequest request = new MsearchRequest.Builder().index("index") + .searches(Collections.emptyList()) + .cancelAfterTimeInterval(cancelAfterTimeInterval) + .build(); + + assertEquals("[]", toJson(request)); + assertEquals(cancelAfterTimeInterval, request.cancelAfterTimeInterval()); + assertEquals("1000ms", MsearchRequest._ENDPOINT.queryParameters(request).get("cancel_after_time_interval")); + } } diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/core/SearchRequestTest.java b/java-client/src/test/java/org/opensearch/client/opensearch/core/SearchRequestTest.java index de5e1978b6..18b6e9de81 100644 --- a/java-client/src/test/java/org/opensearch/client/opensearch/core/SearchRequestTest.java +++ b/java-client/src/test/java/org/opensearch/client/opensearch/core/SearchRequestTest.java @@ -13,6 +13,7 @@ import org.junit.Test; import org.opensearch.client.json.JsonData; import org.opensearch.client.opensearch._types.FieldValue; +import org.opensearch.client.opensearch._types.Time; import org.opensearch.client.opensearch.core.search.SourceConfig; import org.opensearch.client.opensearch.core.search.SourceFilter; import org.opensearch.client.opensearch.model.ModelTestCase; @@ -58,6 +59,16 @@ public void pipeline() { assertEquals("my_pipeline", SearchRequest._ENDPOINT.queryParameters(request).get("search_pipeline")); } + @Test + public void cancelAfterTimeInterval() { + Time cancelAfterTimeInterval = Time.of(ti -> ti.time("1000ms")); + SearchRequest request = new SearchRequest.Builder().cancelAfterTimeInterval(cancelAfterTimeInterval).build(); + + assertEquals("{}", toJson(request)); + assertEquals(cancelAfterTimeInterval, request.cancelAfterTimeInterval()); + assertEquals("1000ms", SearchRequest._ENDPOINT.queryParameters(request).get("cancel_after_time_interval")); + } + @Test public void toBuilder() { SearchRequest origin = new SearchRequest.Builder().index("index").build();