From ed89847b28ca7a47b2b22d9183de241d7fa6a11e Mon Sep 17 00:00:00 2001 From: Baekgyu Kim Date: Mon, 22 Dec 2025 00:15:30 +0900 Subject: [PATCH] 1803 - [BUG] Implement equals/hashCode for JsonDataImpl (#1838) * 1803 - [BUG] Implement equals/hashCode for JsonDataImpl Signed-off-by: Baekgyu * [1803] - updated CHANGELOG.md Signed-off-by: Baekgyu * [1803] - added testcase Signed-off-by: Baekgyu --------- Signed-off-by: Baekgyu --- CHANGELOG.md | 1 + .../opensearch/client/json/JsonDataImpl.java | 16 ++++++++ .../client/opensearch/json/JsonDataTest.java | 40 +++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 412e7caf71..66dcea86ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - Fix formatting of the main method to run for various samples ([#1749](https://github.com/opensearch-project/opensearch-java/pull/1749)) - Bump `com.github.jk1.dependency-license-report` from 2.9 to 3.0.1 ([#1779](https://github.com/opensearch-project/opensearch-java/pull/1779), [#1781](https://github.com/opensearch-project/opensearch-java/pull/1781)) - Fix NPE when null ObjectBuilder is accessed ([#1717](https://github.com/opensearch-project/opensearch-java/issues/1717)) +- Added equals and hashCode implementation to JsonDataImpl ([#1803](https://github.com/opensearch-project/opensearch-java/pull/1838)) ## [Unreleased 3.x] ### Added diff --git a/java-client/src/main/java/org/opensearch/client/json/JsonDataImpl.java b/java-client/src/main/java/org/opensearch/client/json/JsonDataImpl.java index e0e97be8b0..d14e46a916 100644 --- a/java-client/src/main/java/org/opensearch/client/json/JsonDataImpl.java +++ b/java-client/src/main/java/org/opensearch/client/json/JsonDataImpl.java @@ -39,6 +39,7 @@ import java.io.StringWriter; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Objects; class JsonDataImpl implements JsonData { private final Object value; @@ -159,4 +160,19 @@ private JsonParser getParser(JsonpMapper mapper) { return mapper.jsonProvider().createParser(new StringReader(sw.toString())); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + JsonDataImpl jsonDataImpl = (JsonDataImpl) o; + // Compare only 'value'. Because 'mapper' is a processing utility, not part of the data identity + return Objects.equals(value, jsonDataImpl.value); + } + + @Override + public int hashCode() { + // Use Objects.hashCode for a single field to avoid the array creation overhead of Objects.hash + return Objects.hashCode(value); + } } diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/json/JsonDataTest.java b/java-client/src/test/java/org/opensearch/client/opensearch/json/JsonDataTest.java index af17210b97..f3fe9eb7d5 100644 --- a/java-client/src/test/java/org/opensearch/client/opensearch/json/JsonDataTest.java +++ b/java-client/src/test/java/org/opensearch/client/opensearch/json/JsonDataTest.java @@ -40,6 +40,7 @@ import org.junit.Test; import org.opensearch.client.json.JsonData; import org.opensearch.client.json.JsonpMapper; +import org.opensearch.client.json.jackson.JacksonJsonpMapper; import org.opensearch.client.json.jsonb.JsonbJsonpMapper; import org.opensearch.client.opensearch.model.ModelTestCase; @@ -89,4 +90,43 @@ public void testConvert() { assertEquals(JsonValue.ValueType.STRING, value.getValueType()); assertEquals("foo", ((JsonString) value).getString()); } + + @Test + public void testEqualsAndHashcodeSameInstance() { + JsonData data = JsonData.of("value"); + + assertEquals(data, data); + } + + @Test + public void testEqualsAndHashcodeLogicalEquality() { + String value = "value"; + JsonData data1 = JsonData.of(value); + JsonData data2 = JsonData.of(value); + + assertEquals(data1, data2); + assertEquals(data1.hashCode(), data2.hashCode()); + } + + @Test + public void testEqualsAndHashcodeRegardlessOfMapper() { + JacksonJsonpMapper mapper1 = new JacksonJsonpMapper(); + JsonbJsonpMapper mapper2 = new JsonbJsonpMapper(); + + String value = "value"; + JsonData data1 = JsonData.of(value, mapper1); + JsonData data2 = JsonData.of(value, mapper2); + + assertEquals(data1, data2); + assertEquals(data1.hashCode(), data2.hashCode()); + } + + @Test + public void testEqualsAndHashcodeDifferentValues() { + JsonpMapper mapper = new JsonbJsonpMapper(); + JsonData data1 = JsonData.of("value1", mapper); + JsonData data2 = JsonData.of("value2", mapper); + + assertNotEquals(data1, data2); + } }