From 56948f3770f9f27fbe40d2c4d7ca4ff9fb0c274c Mon Sep 17 00:00:00 2001 From: Radhakrishnan Pachyappan Date: Sun, 5 Jul 2026 12:55:04 +0530 Subject: [PATCH 1/4] Fix DerivedField serializing unsupported name field causing mapper_parsing_exception The _common___DerivedField schema in opensearch-openapi.yaml included a required name property. This caused DerivedField.java to serialize a name key into the JSON mapping body, but the OpenSearch API does not accept name inside a derived field definition and returns: mapper_parsing_exception: unknown parameter [name] on mapper In the API, the derived field's name is expressed as the map key in the parent derived object, not as a property inside the field definition. Remove name from the _common___DerivedField schema (both from properties and required) and update the generated DerivedField.java accordingly. The Java client no longer serializes name inside derived field definitions. Fixes #1937 Signed-off-by: Radhakrishnan Pachyappan --- .../opensearch/_types/DerivedField.java | 30 ------------------- java-codegen/opensearch-openapi.yaml | 3 -- 2 files changed, 33 deletions(-) diff --git a/java-client/src/generated/java/org/opensearch/client/opensearch/_types/DerivedField.java b/java-client/src/generated/java/org/opensearch/client/opensearch/_types/DerivedField.java index eb2e081559..41602d50a2 100644 --- a/java-client/src/generated/java/org/opensearch/client/opensearch/_types/DerivedField.java +++ b/java-client/src/generated/java/org/opensearch/client/opensearch/_types/DerivedField.java @@ -68,9 +68,6 @@ public class DerivedField implements PlainJsonSerializable, ToCopyableBuilder op) { op.add(Builder::format, JsonpDeserializer.stringDeserializer(), "format"); op.add(Builder::ignoreMalformed, JsonpDeserializer.booleanDeserializer(), "ignore_malformed"); - op.add(Builder::name, JsonpDeserializer.stringDeserializer(), "name"); op.add(Builder::prefilterField, JsonpDeserializer.stringDeserializer(), "prefilter_field"); op.add(Builder::properties, JsonpDeserializer.stringMapDeserializer(JsonData._DESERIALIZER), "properties"); op.add(Builder::script, Script._DESERIALIZER, "script"); @@ -385,7 +357,6 @@ public int hashCode() { int result = 17; result = 31 * result + Objects.hashCode(this.format); result = 31 * result + Objects.hashCode(this.ignoreMalformed); - result = 31 * result + this.name.hashCode(); result = 31 * result + Objects.hashCode(this.prefilterField); result = 31 * result + Objects.hashCode(this.properties); result = 31 * result + this.script.hashCode(); @@ -400,7 +371,6 @@ public boolean equals(Object o) { DerivedField other = (DerivedField) o; return Objects.equals(this.format, other.format) && Objects.equals(this.ignoreMalformed, other.ignoreMalformed) - && this.name.equals(other.name) && Objects.equals(this.prefilterField, other.prefilterField) && Objects.equals(this.properties, other.properties) && this.script.equals(other.script) diff --git a/java-codegen/opensearch-openapi.yaml b/java-codegen/opensearch-openapi.yaml index b4829f72a0..a0ef850985 100644 --- a/java-codegen/opensearch-openapi.yaml +++ b/java-codegen/opensearch-openapi.yaml @@ -38878,8 +38878,6 @@ components: _common___DerivedField: type: object properties: - name: - type: string type: type: string script: @@ -38893,7 +38891,6 @@ components: format: type: string required: - - name - script - type _common___DFIIndependenceMeasure: From 8e261bcd848a4a45583f4918beae0ff477aa105d Mon Sep 17 00:00:00 2001 From: Radhakrishnan Pachyappan Date: Sun, 5 Jul 2026 13:06:26 +0530 Subject: [PATCH 2/4] Fix ShardFailure.shard incorrectly required causing deserialization failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ShardFailure.shard was marked as required in the spec, so the generated class threw MissingRequiredPropertyException when OpenSearch returned a ShardFailure without the shard field — masking the real failure. Per the OpenSearch API, shard is an optional integer in ShardFailure (the primary failure reason is always present; the shard number may be absent for certain failure types). Remove shard from the required list in _common___ShardFailure and update the generated ShardFailure.java to use @Nullable Integer with proper null guards in serialization, hashCode, and equals. Fixes #1799 Signed-off-by: Radhakrishnan Pachyappan --- .../opensearch/_types/ShardFailure.java | 22 +++++++++++-------- java-codegen/opensearch-openapi.yaml | 1 - 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/java-client/src/generated/java/org/opensearch/client/opensearch/_types/ShardFailure.java b/java-client/src/generated/java/org/opensearch/client/opensearch/_types/ShardFailure.java index c46b364053..8dff45ebde 100644 --- a/java-client/src/generated/java/org/opensearch/client/opensearch/_types/ShardFailure.java +++ b/java-client/src/generated/java/org/opensearch/client/opensearch/_types/ShardFailure.java @@ -71,7 +71,8 @@ public class ShardFailure implements PlainJsonSerializable, ToCopyableBuilder Date: Sun, 5 Jul 2026 13:13:21 +0530 Subject: [PATCH 3/4] Fix PathHierarchyTokenizer required fields causing deserialization failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit buffer_size, delimiter, reverse, and skip were marked required in the spec, so any index using a PathHierarchyTokenizer configured with OpenSearch defaults (omitting these optional parameters) could not be retrieved — the client threw: Missing required property 'PathHierarchyTokenizer.bufferSize' All four parameters are optional in the OpenSearch API with documented defaults (buffer_size=1024, delimiter=/, reverse=false, skip=0). Only type is actually required. Remove buffer_size, delimiter, reverse, skip from required in the spec and update the generated class to use @Nullable types with proper null guards in serialization, hashCode, and equals. Fixes #1797 Signed-off-by: Radhakrishnan Pachyappan --- .../analysis/PathHierarchyTokenizer.java | 86 +++++++++++-------- java-codegen/opensearch-openapi.yaml | 4 - 2 files changed, 50 insertions(+), 40 deletions(-) diff --git a/java-client/src/generated/java/org/opensearch/client/opensearch/_types/analysis/PathHierarchyTokenizer.java b/java-client/src/generated/java/org/opensearch/client/opensearch/_types/analysis/PathHierarchyTokenizer.java index c6f3d02aba..33f2d4d82b 100644 --- a/java-client/src/generated/java/org/opensearch/client/opensearch/_types/analysis/PathHierarchyTokenizer.java +++ b/java-client/src/generated/java/org/opensearch/client/opensearch/_types/analysis/PathHierarchyTokenizer.java @@ -61,27 +61,30 @@ public class PathHierarchyTokenizer extends TokenizerBase TokenizerDefinitionVariant, ToCopyableBuilder { - private final int bufferSize; + @Nullable + private final Integer bufferSize; - @Nonnull + @Nullable private final String delimiter; @Nullable private final String replacement; - private final boolean reverse; + @Nullable + private final Boolean reverse; - private final int skip; + @Nullable + private final Integer skip; // --------------------------------------------------------------------------------------------- private PathHierarchyTokenizer(Builder builder) { super(builder); - this.bufferSize = ApiTypeHelper.requireNonNull(builder.bufferSize, this, "bufferSize"); - this.delimiter = ApiTypeHelper.requireNonNull(builder.delimiter, this, "delimiter"); + this.bufferSize = builder.bufferSize; + this.delimiter = builder.delimiter; this.replacement = builder.replacement; - this.reverse = ApiTypeHelper.requireNonNull(builder.reverse, this, "reverse"); - this.skip = ApiTypeHelper.requireNonNull(builder.skip, this, "skip"); + this.reverse = builder.reverse; + this.skip = builder.skip; } public static PathHierarchyTokenizer of(Function> fn) { @@ -97,16 +100,17 @@ public TokenizerDefinition.Kind _tokenizerDefinitionKind() { } /** - * Required - API name: {@code buffer_size} + * API name: {@code buffer_size} */ - public final int bufferSize() { + @Nullable + public final Integer bufferSize() { return this.bufferSize; } /** - * Required - API name: {@code delimiter} + * API name: {@code delimiter} */ - @Nonnull + @Nullable public final String delimiter() { return this.delimiter; } @@ -120,38 +124,48 @@ public final String replacement() { } /** - * Required - API name: {@code reverse} + * API name: {@code reverse} */ - public final boolean reverse() { + @Nullable + public final Boolean reverse() { return this.reverse; } /** - * Required - API name: {@code skip} + * API name: {@code skip} */ - public final int skip() { + @Nullable + public final Integer skip() { return this.skip; } protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) { generator.write("type", "path_hierarchy"); super.serializeInternal(generator, mapper); - generator.writeKey("buffer_size"); - generator.write(this.bufferSize); + if (this.bufferSize != null) { + generator.writeKey("buffer_size"); + generator.write(this.bufferSize); + } - generator.writeKey("delimiter"); - generator.write(this.delimiter); + if (this.delimiter != null) { + generator.writeKey("delimiter"); + generator.write(this.delimiter); + } if (this.replacement != null) { generator.writeKey("replacement"); generator.write(this.replacement); } - generator.writeKey("reverse"); - generator.write(this.reverse); + if (this.reverse != null) { + generator.writeKey("reverse"); + generator.write(this.reverse); + } - generator.writeKey("skip"); - generator.write(this.skip); + if (this.skip != null) { + generator.writeKey("skip"); + generator.write(this.skip); + } } // --------------------------------------------------------------------------------------------- @@ -211,7 +225,7 @@ protected Builder self() { } /** - * Required - API name: {@code buffer_size} + * API name: {@code buffer_size} */ @Nonnull public final Builder bufferSize(int value) { @@ -220,7 +234,7 @@ public final Builder bufferSize(int value) { } /** - * Required - API name: {@code delimiter} + * API name: {@code delimiter} */ @Nonnull public final Builder delimiter(String value) { @@ -238,7 +252,7 @@ public final Builder replacement(@Nullable String value) { } /** - * Required - API name: {@code reverse} + * API name: {@code reverse} */ @Nonnull public final Builder reverse(boolean value) { @@ -247,7 +261,7 @@ public final Builder reverse(boolean value) { } /** - * Required - API name: {@code skip} + * API name: {@code skip} */ @Nonnull public final Builder skip(int value) { @@ -293,11 +307,11 @@ protected static void setupPathHierarchyTokenizerDeserializer(ObjectDeserializer @Override public int hashCode() { int result = super.hashCode(); - result = 31 * result + Integer.hashCode(this.bufferSize); - result = 31 * result + this.delimiter.hashCode(); + result = 31 * result + Objects.hashCode(this.bufferSize); + result = 31 * result + Objects.hashCode(this.delimiter); result = 31 * result + Objects.hashCode(this.replacement); - result = 31 * result + Boolean.hashCode(this.reverse); - result = 31 * result + Integer.hashCode(this.skip); + result = 31 * result + Objects.hashCode(this.reverse); + result = 31 * result + Objects.hashCode(this.skip); return result; } @@ -309,10 +323,10 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || this.getClass() != o.getClass()) return false; PathHierarchyTokenizer other = (PathHierarchyTokenizer) o; - return this.bufferSize == other.bufferSize - && this.delimiter.equals(other.delimiter) + return Objects.equals(this.bufferSize, other.bufferSize) + && Objects.equals(this.delimiter, other.delimiter) && Objects.equals(this.replacement, other.replacement) - && this.reverse == other.reverse - && this.skip == other.skip; + && Objects.equals(this.reverse, other.reverse) + && Objects.equals(this.skip, other.skip); } } diff --git a/java-codegen/opensearch-openapi.yaml b/java-codegen/opensearch-openapi.yaml index 56ebe01721..d67dc95d2d 100644 --- a/java-codegen/opensearch-openapi.yaml +++ b/java-codegen/opensearch-openapi.yaml @@ -45952,10 +45952,6 @@ components: skip: $ref: '#/components/schemas/_common___StringifiedInteger' required: - - buffer_size - - delimiter - - reverse - - skip - type _common.analysis___PatternAnalyzer: type: object From 2fed78c4182a2ecedc007c21d254065da9a4984f Mon Sep 17 00:00:00 2001 From: Radhakrishnan Pachyappan Date: Sun, 5 Jul 2026 15:40:41 +0530 Subject: [PATCH 4/4] Add CHANGELOG entry for #2038 Signed-off-by: Radhakrishnan Pachyappan --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f85eaecf78..aefa7e1c51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - Add document lifecycle guide and runnable sample ([#2017](https://github.com/opensearch-project/opensearch-java/pull/2017)) ### Fixed +- Fix `PathHierarchyTokenizer` optional fields incorrectly marked required causing deserialization failure ([#2038](https://github.com/opensearch-project/opensearch-java/pull/2038)) ## [Unreleased 3.x] ### Added