From 50c6cface918a2508b3acaa34149245a1b835d03 Mon Sep 17 00:00:00 2001 From: Laura Trotta Date: Thu, 18 Sep 2025 16:54:25 +0200 Subject: [PATCH 1/8] bump version --- config/version.txt | 2 +- .../java/co/elastic/clients/transport/VersionInfo.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/version.txt b/config/version.txt index 43e5dccd3..002901dc3 100644 --- a/config/version.txt +++ b/config/version.txt @@ -1 +1 @@ -8.18.7 +8.18.8 diff --git a/java-client/src/main-flavored/java/co/elastic/clients/transport/VersionInfo.java b/java-client/src/main-flavored/java/co/elastic/clients/transport/VersionInfo.java index 4599e4a4b..5dc728d27 100644 --- a/java-client/src/main-flavored/java/co/elastic/clients/transport/VersionInfo.java +++ b/java-client/src/main-flavored/java/co/elastic/clients/transport/VersionInfo.java @@ -21,5 +21,5 @@ // Package private class VersionInfo { - static final String VERSION = "8.18.7"; + static final String VERSION = "8.18.8"; } From f2423d2f5d2c79409d0db13f473318af3ba8da24 Mon Sep 17 00:00:00 2001 From: Laura Trotta Date: Tue, 7 Oct 2025 18:10:34 +0200 Subject: [PATCH 2/8] [codegen] update to latest spec --- .../elasticsearch/_types/SortOptions.java | 83 ++++++++++--------- .../elasticsearch/_types/TextEmbedding.java | 23 +++-- .../elasticsearch/doc-files/api-spec.html | 6 +- 3 files changed, 66 insertions(+), 46 deletions(-) diff --git a/java-client/src/main/java/co/elastic/clients/elasticsearch/_types/SortOptions.java b/java-client/src/main/java/co/elastic/clients/elasticsearch/_types/SortOptions.java index 4b0dc86f5..6fab6f577 100644 --- a/java-client/src/main/java/co/elastic/clients/elasticsearch/_types/SortOptions.java +++ b/java-client/src/main/java/co/elastic/clients/elasticsearch/_types/SortOptions.java @@ -302,48 +302,57 @@ public SortOptions build() { return new SortOptions(this); } + @Override + public Builder withJson(JsonParser parser, JsonpMapper mapper) { + deserializeBuilder(this, parser.next(), parser, mapper); + return this; + } } public static final JsonpDeserializer _DESERIALIZER = JsonpDeserializer.lazy(() -> JsonpDeserializer .of(EnumSet.of(JsonParser.Event.START_OBJECT, JsonParser.Event.VALUE_STRING), (parser, mapper, event) -> { SortOptions.Builder b = new SortOptions.Builder(); - - if (event == JsonParser.Event.VALUE_STRING) { - switch (parser.getString()) { - case "_score" : - b.score(s -> s); - break; - case "_doc" : - b.doc(d -> d); - break; - default : - b.field(f -> f.field(parser.getString())); - } - return b.build(); - } - - JsonpUtils.expectEvent(parser, JsonParser.Event.START_OBJECT, event); - JsonpUtils.expectNextEvent(parser, JsonParser.Event.KEY_NAME); - switch (parser.getString()) { - case "_score" : - b.score(ScoreSort._DESERIALIZER.deserialize(parser, mapper)); - break; - case "_doc" : - b.doc(ScoreSort._DESERIALIZER.deserialize(parser, mapper)); - break; - case "_geo_distance" : - b.geoDistance(GeoDistanceSort._DESERIALIZER.deserialize(parser, mapper)); - break; - case "_script" : - b.script(ScriptSort._DESERIALIZER.deserialize(parser, mapper)); - break; - default : - // Consumes END_OBJECT - return b.field(FieldSort._DESERIALIZER.deserialize(parser, mapper, JsonParser.Event.KEY_NAME)) - .build(); - } - - JsonpUtils.expectNextEvent(parser, JsonParser.Event.END_OBJECT); + deserializeBuilder(b, event, parser, mapper); return b.build(); })); + + private static void deserializeBuilder(SortOptions.Builder b, JsonParser.Event event, JsonParser parser, + JsonpMapper mapper) { + if (event == JsonParser.Event.VALUE_STRING) { + switch (parser.getString()) { + case "_score" : + b.score(s -> s); + break; + case "_doc" : + b.doc(d -> d); + break; + default : + b.field(f -> f.field(parser.getString())); + } + return; + } + + JsonpUtils.expectEvent(parser, JsonParser.Event.START_OBJECT, event); + JsonpUtils.expectNextEvent(parser, JsonParser.Event.KEY_NAME); + switch (parser.getString()) { + case "_score" : + b.score(ScoreSort._DESERIALIZER.deserialize(parser, mapper)); + break; + case "_doc" : + b.doc(ScoreSort._DESERIALIZER.deserialize(parser, mapper)); + break; + case "_geo_distance" : + b.geoDistance(GeoDistanceSort._DESERIALIZER.deserialize(parser, mapper)); + break; + case "_script" : + b.script(ScriptSort._DESERIALIZER.deserialize(parser, mapper)); + break; + default : + // Consumes END_OBJECT + b.field(FieldSort._DESERIALIZER.deserialize(parser, mapper, JsonParser.Event.KEY_NAME)); + return; + } + + JsonpUtils.expectNextEvent(parser, JsonParser.Event.END_OBJECT); + } } diff --git a/java-client/src/main/java/co/elastic/clients/elasticsearch/_types/TextEmbedding.java b/java-client/src/main/java/co/elastic/clients/elasticsearch/_types/TextEmbedding.java index 35a269181..12d10d182 100644 --- a/java-client/src/main/java/co/elastic/clients/elasticsearch/_types/TextEmbedding.java +++ b/java-client/src/main/java/co/elastic/clients/elasticsearch/_types/TextEmbedding.java @@ -59,6 +59,7 @@ */ @JsonpDeserializable public class TextEmbedding implements QueryVectorBuilderVariant, JsonpSerializable { + @Nullable private final String modelId; private final String modelText; @@ -67,7 +68,7 @@ public class TextEmbedding implements QueryVectorBuilderVariant, JsonpSerializab private TextEmbedding(Builder builder) { - this.modelId = ApiTypeHelper.requireNonNull(builder.modelId, this, "modelId"); + this.modelId = builder.modelId; this.modelText = ApiTypeHelper.requireNonNull(builder.modelText, this, "modelText"); } @@ -85,8 +86,12 @@ public QueryVectorBuilder.Kind _queryVectorBuilderKind() { } /** - * Required - API name: {@code model_id} + * Model ID is required for all dense_vector fields but may be inferred for + * semantic_text fields + *

+ * API name: {@code model_id} */ + @Nullable public final String modelId() { return this.modelId; } @@ -109,9 +114,11 @@ public void serialize(JsonGenerator generator, JsonpMapper mapper) { protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) { - generator.writeKey("model_id"); - generator.write(this.modelId); + if (this.modelId != null) { + generator.writeKey("model_id"); + generator.write(this.modelId); + } generator.writeKey("model_text"); generator.write(this.modelText); @@ -129,14 +136,18 @@ public String toString() { */ public static class Builder extends WithJsonObjectBuilderBase implements ObjectBuilder { + @Nullable private String modelId; private String modelText; /** - * Required - API name: {@code model_id} + * Model ID is required for all dense_vector fields but may be inferred for + * semantic_text fields + *

+ * API name: {@code model_id} */ - public final Builder modelId(String value) { + public final Builder modelId(@Nullable String value) { this.modelId = value; return this; } diff --git a/java-client/src/main/java/co/elastic/clients/elasticsearch/doc-files/api-spec.html b/java-client/src/main/java/co/elastic/clients/elasticsearch/doc-files/api-spec.html index 6ea0e592a..bce15c7d9 100644 --- a/java-client/src/main/java/co/elastic/clients/elasticsearch/doc-files/api-spec.html +++ b/java-client/src/main/java/co/elastic/clients/elasticsearch/doc-files/api-spec.html @@ -369,7 +369,7 @@ '_types.StoredScript': '_types/Scripting.ts#L47-L59', '_types.SuggestMode': '_types/common.ts#L288-L301', '_types.TaskFailure': '_types/Errors.ts#L71-L76', -'_types.TextEmbedding': '_types/Knn.ts#L94-L97', +'_types.TextEmbedding': '_types/Knn.ts#L94-L103', '_types.TextSimilarityReranker': '_types/Retriever.ts#L140-L151', '_types.ThreadType': '_types/common.ts#L303-L309', '_types.TimeUnit': '_types/Time.ts#L69-L77', @@ -3298,10 +3298,10 @@ if (hash.length > 1) { hash = hash.substring(1); } - window.location = "https://github.com/elastic/elasticsearch-specification/tree/b06a808c252f94705e34b7ffddb565c628031a1d/specification/" + (paths[hash] || ""); + window.location = "https://github.com/elastic/elasticsearch-specification/tree/ba9929c3141f0d29bb092ce830eeeaa605e64240/specification/" + (paths[hash] || ""); - Please see the Elasticsearch API specification. + Please see the Elasticsearch API specification. From c891db7c0a0acf767447046e6cea36868f187a78 Mon Sep 17 00:00:00 2001 From: Jay <39220950+vijaykriishna@users.noreply.github.com> Date: Mon, 29 Sep 2025 21:12:11 +0530 Subject: [PATCH 3/8] 866 - JacksonJsonBuffer - Overriding toString (#1073) * 866 - JacksonJsonBuffer - Overriding toString * 866 - Formatting error message --- .../json/jackson/JacksonJsonBuffer.java | 16 +++++ .../json/jackson/JacksonJsonBufferTest.java | 71 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 java-client/src/test/java/co/elastic/clients/json/jackson/JacksonJsonBufferTest.java diff --git a/java-client/src/main/java/co/elastic/clients/json/jackson/JacksonJsonBuffer.java b/java-client/src/main/java/co/elastic/clients/json/jackson/JacksonJsonBuffer.java index c6656937e..333040c5e 100644 --- a/java-client/src/main/java/co/elastic/clients/json/jackson/JacksonJsonBuffer.java +++ b/java-client/src/main/java/co/elastic/clients/json/jackson/JacksonJsonBuffer.java @@ -30,6 +30,7 @@ import jakarta.json.stream.JsonParser; import java.io.IOException; +import java.io.StringWriter; import java.lang.reflect.Type; class JacksonJsonBuffer implements JsonBuffer, JsonData { @@ -99,4 +100,19 @@ public void serialize(JsonGenerator generator, JsonpMapper mapper) { } } } + + /** + * Renders this buffer as a JSON string for debugger and logging convenience. + */ + @Override + public String toString() { + StringWriter writer = new StringWriter(); + try (JacksonJsonpGenerator generator = new JacksonJsonpGenerator(mapper.objectMapper().createGenerator(writer))) { + serialize(generator, mapper); + generator.close(); + return writer.toString(); + } catch (IOException e) { + return String.format("JacksonJsonBuffer: error rendering JSON: %s", e.getMessage()); + } + } } diff --git a/java-client/src/test/java/co/elastic/clients/json/jackson/JacksonJsonBufferTest.java b/java-client/src/test/java/co/elastic/clients/json/jackson/JacksonJsonBufferTest.java new file mode 100644 index 000000000..6014db7ac --- /dev/null +++ b/java-client/src/test/java/co/elastic/clients/json/jackson/JacksonJsonBufferTest.java @@ -0,0 +1,71 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 co.elastic.clients.json.jackson; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.util.TokenBuffer; +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class JacksonJsonBufferTest { + + private JacksonJsonpMapper mapper() { + return new JacksonJsonpMapper(new ObjectMapper()); + } + + @Test + public void testToString_rendersJson() throws Exception { + ObjectMapper om = new ObjectMapper(); + TokenBuffer buffer = new TokenBuffer(om, false); + buffer.writeStartObject(); + buffer.writeStringField("foo", "bar"); + buffer.writeNumberField("baz", 42); + buffer.writeEndObject(); + + JacksonJsonBuffer jsonBuffer = new JacksonJsonBuffer(buffer, mapper()); + String json = jsonBuffer.toString(); + assertTrue(json.contains("\"foo\":\"bar\"")); + assertTrue(json.contains("\"baz\":42")); + assertTrue(json.startsWith("{") && json.endsWith("}")); + } + + @Test + public void testToString_emptyBuffer() throws Exception { + ObjectMapper om = new ObjectMapper(); + TokenBuffer buffer = new TokenBuffer(om, false); + JacksonJsonBuffer jsonBuffer = new JacksonJsonBuffer(buffer, mapper()); + String json = jsonBuffer.toString(); + assertEquals(StringUtils.EMPTY, json.trim()); + } + + @Test + public void testToString_invalidBuffer() throws Exception { + ObjectMapper om = new ObjectMapper(); + TokenBuffer buffer = new TokenBuffer(om, false); + // Write some invalid JSON (start object but don't close) + buffer.writeStartObject(); + JacksonJsonBuffer jsonBuffer = new JacksonJsonBuffer(buffer, mapper()); + String json = jsonBuffer.toString(); + // Should not throw, but may contain error or partial output + assertTrue(json.startsWith("{")); + } +} From a5200ce8cbd540f3aebce933d0fc8c4f1f23ddcc Mon Sep 17 00:00:00 2001 From: Laura Trotta Date: Tue, 7 Oct 2025 18:20:28 +0200 Subject: [PATCH 4/8] fix maven publish --- .ci/make.sh | 4 ++-- build.gradle.kts | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/.ci/make.sh b/.ci/make.sh index 43c43195b..7bdc17c5e 100755 --- a/.ci/make.sh +++ b/.ci/make.sh @@ -196,8 +196,8 @@ if [[ "$CMD" == "release" ]]; then echo "Dry run: building and publishing to the local repository" gradle_task="publishForReleaseManager" else - echo "Releasing to Maven snapshot repo" - gradle_task="publishToSonatype closeAndReleaseStagingRepositories" + echo "Releasing to Maven repo" + gradle_task="publishForMavenCentral" fi docker run --rm --env VERSION=$VERSION -u "$(id -u)" \ $git_mount $src_mount $output_mount \ diff --git a/build.gradle.kts b/build.gradle.kts index 6b77db654..17fdd8b54 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -79,6 +79,39 @@ tasks.register(name = "resolveDependencies") { } } +tasks.register(name = "publishForMavenCentral") { + group = "Publishing" + description = "Publishes artifacts to Maven Central" + dependsOn( + ":java-client:publishAllPublicationsToBuildRepository", + ":java-client:generateLicenseReport", + ":java-client:publishToSonatype", + ":java-client:closeAndReleaseStagingRepositories", + ) + doLast { + val version = this.project.version.toString() + println("Releasing version $version") + + val releaseDir = File(rootProject.layout.buildDirectory.get().asFile, "release") + releaseDir.mkdirs() + + File(rootProject.layout.buildDirectory.get().asFile, "repository/co/elastic/clients").listFiles()?.forEach { artifact -> + println("Releasing artifact " + artifact.name) + + val versionDir = File(artifact, version) + + versionDir.listFiles()?.forEach { file -> + if (file.name.endsWith(".jar") || file.name.endsWith(".pom")) { + var name = file.name + + file.copyTo(File(releaseDir, name), overwrite = true) + } + } + } + } +} + +// TODO delete tasks.register(name = "publishForReleaseManager") { group = "Publishing" description = "Publishes artifacts in a format suitable for the Elastic release manager" From 10fd03ab805e1a1dbc26dc183f205fca43bf094d Mon Sep 17 00:00:00 2001 From: Laura Trotta Date: Tue, 7 Oct 2025 18:32:26 +0200 Subject: [PATCH 5/8] fix maven publish 1 --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 17fdd8b54..028ddeb8c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -85,8 +85,8 @@ tasks.register(name = "publishForMavenCentral") { dependsOn( ":java-client:publishAllPublicationsToBuildRepository", ":java-client:generateLicenseReport", - ":java-client:publishToSonatype", - ":java-client:closeAndReleaseStagingRepositories", + ":publishToSonatype", + ":closeAndReleaseStagingRepositories", ) doLast { val version = this.project.version.toString() From 9c7f4dad3b3eda15b7d1682a2fce06790c3ca555 Mon Sep 17 00:00:00 2001 From: Laura Trotta Date: Tue, 7 Oct 2025 18:41:44 +0200 Subject: [PATCH 6/8] fix maven publish 2 --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 028ddeb8c..b4bb08e0e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -85,8 +85,8 @@ tasks.register(name = "publishForMavenCentral") { dependsOn( ":java-client:publishAllPublicationsToBuildRepository", ":java-client:generateLicenseReport", - ":publishToSonatype", - ":closeAndReleaseStagingRepositories", + tasks.getByName("publishToSonatype"), + tasks.getByName("closeAndReleaseStagingRepositories"), ) doLast { val version = this.project.version.toString() From 111d5264a2c8abfb182cd8e7ed8777acb488ba86 Mon Sep 17 00:00:00 2001 From: Laura Trotta Date: Tue, 7 Oct 2025 18:52:48 +0200 Subject: [PATCH 7/8] fix maven publish 3 --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index b4bb08e0e..a4ede0eaf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -85,8 +85,8 @@ tasks.register(name = "publishForMavenCentral") { dependsOn( ":java-client:publishAllPublicationsToBuildRepository", ":java-client:generateLicenseReport", - tasks.getByName("publishToSonatype"), - tasks.getByName("closeAndReleaseStagingRepositories"), + tasks.named("publishToSonatype"), + tasks.named("closeAndReleaseStagingRepositories"), ) doLast { val version = this.project.version.toString() From a2df62e1ac93bb34c01148d5894c84430c4c7930 Mon Sep 17 00:00:00 2001 From: Laura Trotta Date: Tue, 7 Oct 2025 19:21:39 +0200 Subject: [PATCH 8/8] fix maven publish 4 --- build.gradle.kts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a4ede0eaf..1fe917e80 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -79,14 +79,15 @@ tasks.register(name = "resolveDependencies") { } } + tasks.register(name = "publishForMavenCentral") { - group = "Publishing" + group = "Custom" description = "Publishes artifacts to Maven Central" dependsOn( ":java-client:publishAllPublicationsToBuildRepository", ":java-client:generateLicenseReport", - tasks.named("publishToSonatype"), - tasks.named("closeAndReleaseStagingRepositories"), + ":java-client:publishToSonatype", + "closeAndReleaseStagingRepositories", ) doLast { val version = this.project.version.toString()