From c1bf3ed39f709045afd5fa59cbec32960f65d280 Mon Sep 17 00:00:00 2001 From: Leo Date: Tue, 19 Nov 2024 02:34:55 +0900 Subject: [PATCH 1/5] fix toJsonString default mapper serialize type Signed-off-by: Leo --- .../opensearch/client/json/JsonpUtils.java | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java b/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java index d9cfdaf306..4f1e724d5e 100644 --- a/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java +++ b/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java @@ -81,15 +81,30 @@ public void serialize(T value, JsonGenerator generator) { return; } + if (value instanceof String) { + generator.write((String) value); + return; + } + + if (value instanceof Integer) { + generator.write((Integer) value); + return; + } + + if (value instanceof Double) { + generator.write((Double) value); + return; + } + throw new JsonException( - "Cannot find a serializer for type " + value.getClass().getName() + ". Consider using a full-featured JsonpMapper." + "Cannot find a serializer for type " + value.getClass().getName() + ". Consider using a full-featured JsonpMapper." ); } @Override protected JsonpDeserializer getDefaultDeserializer(Class clazz) { throw new JsonException( - "Cannot find a default deserializer for type " + clazz.getName() + ". Consider using a full-featured JsonpMapper." + "Cannot find a default deserializer for type " + clazz.getName() + ". Consider using a full-featured JsonpMapper." ); } }; @@ -168,10 +183,10 @@ public static void serialize(T value, JsonGenerator generator, @Nullable Jso * (the object has been consumed from the original one). */ public static Map.Entry lookAheadFieldValue( - String name, - String defaultValue, - JsonParser parser, - JsonpMapper mapper + String name, + String defaultValue, + JsonParser parser, + JsonpMapper mapper ) { JsonLocation location = parser.getLocation(); From 5169047ec0454370224e66077b21eaa1728c5573 Mon Sep 17 00:00:00 2001 From: Leo Date: Tue, 19 Nov 2024 02:35:11 +0900 Subject: [PATCH 2/5] test range query JsonData type value Signed-off-by: Leo --- .../opensearch/json/JsonpMapperTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/json/JsonpMapperTest.java b/java-client/src/test/java/org/opensearch/client/opensearch/json/JsonpMapperTest.java index 256eb9b81f..c36bcfaf9d 100644 --- a/java-client/src/test/java/org/opensearch/client/opensearch/json/JsonpMapperTest.java +++ b/java-client/src/test/java/org/opensearch/client/opensearch/json/JsonpMapperTest.java @@ -51,11 +51,13 @@ import java.util.concurrent.atomic.AtomicInteger; import org.junit.Assert; import org.junit.Test; +import org.opensearch.client.json.JsonData; import org.opensearch.client.json.JsonpDeserializer; 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.IOUtils; +import org.opensearch.client.opensearch.core.SearchRequest; import org.opensearch.client.opensearch.model.ModelTestCase; public class JsonpMapperTest extends Assert { @@ -240,4 +242,29 @@ public void setChildren(List children) { this.children = children; } } + + @Test + public void testRangeQuery() { + + String expectedStringValue = + "{\"aggregations\":{},\"query\":{\"range\":{\"rangeField\":{\"gte\":10.5,\"lte\":30,\"from\":\"2024-01-01T00:00:00Z\",\"format\":\"strict_date_optional_time\"}}},\"terminate_after\":5}"; + + SearchRequest searchRequest = SearchRequest.of( + request -> request.index("index1", "index2") + .aggregations(Collections.emptyMap()) + .terminateAfter(5L) + .query( + q -> q.range( + r -> r.field("rangeField") + .gte(JsonData.of(10.5)) + .lte(JsonData.of(30)) + .from(JsonData.of("2024-01-01T00:00:00Z")) + .format("strict_date_optional_time") + ) + ) + ); + String searchRequestString = searchRequest.toJsonString(); + assertEquals(expectedStringValue, searchRequestString); + } + } From c753b82960bf3a1d2db6dd992dbaa6d3e10c64aa Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 20 Nov 2024 01:54:44 +0900 Subject: [PATCH 3/5] refactor don't invoke the mapper's serialize method for the RangeQuery JsonData raw value Signed-off-by: Leo --- .../opensearch/client/json/JsonDataImpl.java | 6 ++++ .../opensearch/client/json/JsonpUtils.java | 28 ++++--------------- .../opensearch/json/JsonpMapperTest.java | 26 ++++++++--------- 3 files changed, 25 insertions(+), 35 deletions(-) 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 72c9e0235b..0ab2342d78 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 @@ -109,6 +109,12 @@ public T deserialize(JsonpDeserializer deserializer, JsonpMapper mapper) public void serialize(JsonGenerator generator, JsonpMapper mapper) { if (value instanceof JsonValue) { generator.write((JsonValue) value); + } else if (value instanceof String) { + generator.write((String) value); + } else if (value instanceof Integer) { + generator.write((Integer) value); + } else if (value instanceof Double) { + generator.write((Double) value); } else { // Mapper provided at creation time has precedence (this.mapper != null ? this.mapper : mapper).serialize(value, generator); diff --git a/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java b/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java index 4f1e724d5e..8cf51df787 100644 --- a/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java +++ b/java-client/src/main/java/org/opensearch/client/json/JsonpUtils.java @@ -80,31 +80,15 @@ public void serialize(T value, JsonGenerator generator) { ((JsonpSerializable) value).serialize(generator, this); return; } - - if (value instanceof String) { - generator.write((String) value); - return; - } - - if (value instanceof Integer) { - generator.write((Integer) value); - return; - } - - if (value instanceof Double) { - generator.write((Double) value); - return; - } - throw new JsonException( - "Cannot find a serializer for type " + value.getClass().getName() + ". Consider using a full-featured JsonpMapper." + "Cannot find a serializer for type " + value.getClass().getName() + ". Consider using a full-featured JsonpMapper." ); } @Override protected JsonpDeserializer getDefaultDeserializer(Class clazz) { throw new JsonException( - "Cannot find a default deserializer for type " + clazz.getName() + ". Consider using a full-featured JsonpMapper." + "Cannot find a default deserializer for type " + clazz.getName() + ". Consider using a full-featured JsonpMapper." ); } }; @@ -183,10 +167,10 @@ public static void serialize(T value, JsonGenerator generator, @Nullable Jso * (the object has been consumed from the original one). */ public static Map.Entry lookAheadFieldValue( - String name, - String defaultValue, - JsonParser parser, - JsonpMapper mapper + String name, + String defaultValue, + JsonParser parser, + JsonpMapper mapper ) { JsonLocation location = parser.getLocation(); diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/json/JsonpMapperTest.java b/java-client/src/test/java/org/opensearch/client/opensearch/json/JsonpMapperTest.java index c36bcfaf9d..1031c19e27 100644 --- a/java-client/src/test/java/org/opensearch/client/opensearch/json/JsonpMapperTest.java +++ b/java-client/src/test/java/org/opensearch/client/opensearch/json/JsonpMapperTest.java @@ -247,21 +247,21 @@ public void setChildren(List children) { public void testRangeQuery() { String expectedStringValue = - "{\"aggregations\":{},\"query\":{\"range\":{\"rangeField\":{\"gte\":10.5,\"lte\":30,\"from\":\"2024-01-01T00:00:00Z\",\"format\":\"strict_date_optional_time\"}}},\"terminate_after\":5}"; + "{\"aggregations\":{},\"query\":{\"range\":{\"rangeField\":{\"gte\":10.5,\"lte\":30,\"from\":\"2024-01-01T00:00:00Z\",\"format\":\"strict_date_optional_time\"}}},\"terminate_after\":5}"; SearchRequest searchRequest = SearchRequest.of( - request -> request.index("index1", "index2") - .aggregations(Collections.emptyMap()) - .terminateAfter(5L) - .query( - q -> q.range( - r -> r.field("rangeField") - .gte(JsonData.of(10.5)) - .lte(JsonData.of(30)) - .from(JsonData.of("2024-01-01T00:00:00Z")) - .format("strict_date_optional_time") - ) - ) + request -> request.index("index1", "index2") + .aggregations(Collections.emptyMap()) + .terminateAfter(5L) + .query( + q -> q.range( + r -> r.field("rangeField") + .gte(JsonData.of(10.5)) + .lte(JsonData.of(30)) + .from(JsonData.of("2024-01-01T00:00:00Z")) + .format("strict_date_optional_time") + ) + ) ); String searchRequestString = searchRequest.toJsonString(); assertEquals(expectedStringValue, searchRequestString); From ee4d373bb171599fe543b1d036b587b97ce9ad48 Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 20 Nov 2024 01:55:29 +0900 Subject: [PATCH 4/5] update CHANGELOG #1309 PR Signed-off-by: Leo --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f780e125c7..8163bc5e34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ This section is for maintaining a changelog for all breaking changes for the cli ### Removed ### Fixed +- Fixed don't invoke the mapper's serialize method for the RangeQuery JsonData raw value [#1309](https://github.com/opensearch-project/opensearch-java/pull/1309) ### Security From fae2c65487dc4869a4a5b2fbf174da5de49896f5 Mon Sep 17 00:00:00 2001 From: Leo Date: Sat, 23 Nov 2024 12:56:54 +0900 Subject: [PATCH 5/5] add JsonDataImpl serialize value type Signed-off-by: Leo --- .../org/opensearch/client/json/JsonDataImpl.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 0ab2342d78..e0e97be8b0 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 @@ -37,6 +37,8 @@ import jakarta.json.stream.JsonParser; import java.io.StringReader; import java.io.StringWriter; +import java.math.BigDecimal; +import java.math.BigInteger; class JsonDataImpl implements JsonData { private final Object value; @@ -111,10 +113,22 @@ public void serialize(JsonGenerator generator, JsonpMapper mapper) { generator.write((JsonValue) value); } else if (value instanceof String) { generator.write((String) value); + } else if (value instanceof BigDecimal) { + generator.write((BigDecimal) value); + } else if (value instanceof BigInteger) { + generator.write((BigInteger) value); + } else if (value instanceof Short) { + generator.write((Short) value); } else if (value instanceof Integer) { generator.write((Integer) value); + } else if (value instanceof Long) { + generator.write((Long) value); + } else if (value instanceof Float) { + generator.write((Float) value); } else if (value instanceof Double) { generator.write((Double) value); + } else if (value instanceof Boolean) { + generator.write((Boolean) value); } else { // Mapper provided at creation time has precedence (this.mapper != null ? this.mapper : mapper).serialize(value, generator);