From 1b51e1759fc96b530b9e4645f05d76994fe74a56 Mon Sep 17 00:00:00 2001 From: Laura Trotta Date: Thu, 15 Jan 2026 16:14:25 +0100 Subject: [PATCH] support searchrequest compatibility for msearch body and script source --- .../elasticsearch/_types/ScriptSource.java | 19 ++++++ .../core/msearch/RequestItem.java | 18 ++++++ .../elasticsearch/model/OverloadsTest.java | 61 ++++++++++++++++++- 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/java-client/src/main/java/co/elastic/clients/elasticsearch/_types/ScriptSource.java b/java-client/src/main/java/co/elastic/clients/elasticsearch/_types/ScriptSource.java index 81aea7e977..e0f38f1962 100644 --- a/java-client/src/main/java/co/elastic/clients/elasticsearch/_types/ScriptSource.java +++ b/java-client/src/main/java/co/elastic/clients/elasticsearch/_types/ScriptSource.java @@ -19,6 +19,7 @@ package co.elastic.clients.elasticsearch._types; +import co.elastic.clients.elasticsearch.core.SearchRequest; import co.elastic.clients.elasticsearch.core.search.SearchRequestBody; import co.elastic.clients.json.JsonpDeserializable; import co.elastic.clients.json.JsonpDeserializer; @@ -163,6 +164,24 @@ public ObjectBuilder scriptTemplate(SearchRequestBody v) { return this; } + public final ObjectBuilder scriptTemplate(SearchRequest value) { + this._kind = Kind.ScriptTemplate; + SearchRequestBody body = SearchRequestBody.of(srb -> srb.aggregations(value.aggregations()) + .collapse(value.collapse()).explain(value.explain()).ext(value.ext()).from(value.from()) + .highlight(value.highlight()).trackTotalHits(value.trackTotalHits()) + .indicesBoost(value.indicesBoost()).docvalueFields(value.docvalueFields()).knn(value.knn()) + .rank(value.rank()).minScore(value.minScore()).postFilter(value.postFilter()) + .profile(value.profile()).query(value.query()).rescore(value.rescore()).retriever(value.retriever()) + .scriptFields(value.scriptFields()).searchAfter(value.searchAfter()).size(value.size()) + .slice(value.slice()).sort(value.sort()).source(value.source()).fields(value.fields()) + .suggest(value.suggest()).terminateAfter(value.terminateAfter()).timeout(value.timeout()) + .trackScores(value.trackScores()).version(value.version()) + .seqNoPrimaryTerm(value.seqNoPrimaryTerm()).storedFields(value.storedFields()).pit(value.pit()) + .runtimeMappings(value.runtimeMappings()).stats(value.stats())); + this._value = body; + return this; + } + public ObjectBuilder scriptTemplate( Function> fn) { return this.scriptTemplate(fn.apply(new SearchRequestBody.Builder()).build()); diff --git a/java-client/src/main/java/co/elastic/clients/elasticsearch/core/msearch/RequestItem.java b/java-client/src/main/java/co/elastic/clients/elasticsearch/core/msearch/RequestItem.java index 195400eb1d..3e23b5b4cd 100644 --- a/java-client/src/main/java/co/elastic/clients/elasticsearch/core/msearch/RequestItem.java +++ b/java-client/src/main/java/co/elastic/clients/elasticsearch/core/msearch/RequestItem.java @@ -19,6 +19,7 @@ package co.elastic.clients.elasticsearch.core.msearch; +import co.elastic.clients.elasticsearch.core.SearchRequest; import co.elastic.clients.elasticsearch.core.search.SearchRequestBody; import co.elastic.clients.json.JsonpDeserializable; import co.elastic.clients.json.JsonpDeserializer; @@ -163,6 +164,23 @@ public final Builder body(Function srb.aggregations(value.aggregations()) + .collapse(value.collapse()).explain(value.explain()).ext(value.ext()).from(value.from()) + .highlight(value.highlight()).trackTotalHits(value.trackTotalHits()) + .indicesBoost(value.indicesBoost()).docvalueFields(value.docvalueFields()).knn(value.knn()) + .rank(value.rank()).minScore(value.minScore()).postFilter(value.postFilter()) + .profile(value.profile()).query(value.query()).rescore(value.rescore()).retriever(value.retriever()) + .scriptFields(value.scriptFields()).searchAfter(value.searchAfter()).size(value.size()) + .slice(value.slice()).sort(value.sort()).source(value.source()).fields(value.fields()) + .suggest(value.suggest()).terminateAfter(value.terminateAfter()).timeout(value.timeout()) + .trackScores(value.trackScores()).version(value.version()) + .seqNoPrimaryTerm(value.seqNoPrimaryTerm()).storedFields(value.storedFields()).pit(value.pit()) + .runtimeMappings(value.runtimeMappings()).stats(value.stats())); + this.body = body; + return this; + } + /** * Builds a {@link RequestItem}. * diff --git a/java-client/src/test/java/co/elastic/clients/elasticsearch/model/OverloadsTest.java b/java-client/src/test/java/co/elastic/clients/elasticsearch/model/OverloadsTest.java index 5216e151e6..a97e111329 100644 --- a/java-client/src/test/java/co/elastic/clients/elasticsearch/model/OverloadsTest.java +++ b/java-client/src/test/java/co/elastic/clients/elasticsearch/model/OverloadsTest.java @@ -22,8 +22,10 @@ import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch._types.FieldSort; import co.elastic.clients.elasticsearch._types.FieldValue; +import co.elastic.clients.elasticsearch._types.ScriptSource; import co.elastic.clients.elasticsearch._types.aggregations.TopMetrics; import co.elastic.clients.elasticsearch._types.query_dsl.MatchAllQuery; +import co.elastic.clients.elasticsearch.core.MsearchRequest; import co.elastic.clients.elasticsearch.core.SearchRequest; import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.testkit.ModelTestCase; @@ -81,13 +83,68 @@ public void arrayOverloads() { } @Test - @Disabled("just need to compile") + @Disabled("just needs to compile") public void voidClassTDocumentOverload() throws IOException { // no need for a complete instance of the client, - // nor testing anything, just checking this compiles + // nor testing anything, just checking that this compiles ElasticsearchClient client = ElasticsearchClient.of(e -> e.host("http://localhost:9200")); SearchResponse resp = client.search(s -> s,Void.class); SearchResponse respDefault = client.search(s -> s); } + + @Test + public void searchRequestBodyOverloads() throws IOException { + + // Normal search request + SearchRequest searchRequest = SearchRequest.of(b -> b + .size(10) + .from(10) + .query(q -> q + .matchAll(m -> m) + ) + ); + + // Msearch compatibility + MsearchRequest msearchRequestStandard = MsearchRequest.of(ms -> ms + .searches(s -> s + .header(h -> h.index("index")) + .body(b -> b + .size(10) + .from(10) + .query(q -> q + .matchAll(m -> m) + ) + ) + ) + ); + + MsearchRequest msearchRequestOverload = MsearchRequest.of(ms -> ms + .searches(s -> s + .header(h -> h.index("index")) + .body(searchRequest) + ) + ); + + // Assert both variants result in the same serialization + assertEquals(msearchRequestStandard.toString(), msearchRequestOverload.toString()); + + // Script source compatibility + ScriptSource scriptSourceStandard = ScriptSource.of(s -> s + .scriptTemplate(t -> t + .size(10) + .from(10) + .query(q -> q + .matchAll(m -> m) + ) + ) + ); + + ScriptSource scriptSourceOverload = ScriptSource.of(s -> s + .scriptTemplate(searchRequest) + ); + + // Assert both variants result in the same serialization + assertEquals(scriptSourceStandard.toString(), scriptSourceOverload.toString()); + } }