From 3335c98eb647d50c04a3f747824b74e7f575921e Mon Sep 17 00:00:00 2001 From: Rene Cordier Date: Fri, 24 Jun 2022 05:38:45 +0700 Subject: [PATCH] Sort field in Hit deserializer should handle null events (#169) Signed-off-by: Rene Cordier --- .../client/json/JsonpDeserializer.java | 4 ++++ .../client/json/JsonpDeserializerBase.java | 24 +++++++++++++++++++ .../client/opensearch/core/search/Hit.java | 2 +- .../opensearch/model/BuiltinTypesTest.java | 22 +++++++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/java-client/src/main/java/org/opensearch/client/json/JsonpDeserializer.java b/java-client/src/main/java/org/opensearch/client/json/JsonpDeserializer.java index f827ff56d5c44..3c12aa2884242 100644 --- a/java-client/src/main/java/org/opensearch/client/json/JsonpDeserializer.java +++ b/java-client/src/main/java/org/opensearch/client/json/JsonpDeserializer.java @@ -204,6 +204,10 @@ static JsonpDeserializer intOrNullDeserializer(int defaultValue) { return new JsonpDeserializerBase.IntOrNullDeserializer(defaultValue); } + static JsonpDeserializer stringOrNullDeserializer() { + return new JsonpDeserializerBase.StringOrNullDeserializer(); + } + static JsonpDeserializer numberDeserializer() { return JsonpDeserializerBase.NUMBER; } diff --git a/java-client/src/main/java/org/opensearch/client/json/JsonpDeserializerBase.java b/java-client/src/main/java/org/opensearch/client/json/JsonpDeserializerBase.java index 4319059de4457..d706f8ec727c9 100644 --- a/java-client/src/main/java/org/opensearch/client/json/JsonpDeserializerBase.java +++ b/java-client/src/main/java/org/opensearch/client/json/JsonpDeserializerBase.java @@ -238,6 +238,30 @@ public Integer deserialize(JsonParser parser, JsonpMapper mapper, Event event) { } } + static final class StringOrNullDeserializer extends JsonpDeserializerBase { + static final EnumSet nativeEvents = EnumSet.of(Event.VALUE_STRING, Event.VALUE_NULL); + static final EnumSet acceptedEvents = EnumSet.of(Event.KEY_NAME, Event.VALUE_STRING, + Event.VALUE_NUMBER, Event.VALUE_FALSE, Event.VALUE_TRUE, Event.VALUE_NULL); + + StringOrNullDeserializer() { + super(acceptedEvents, nativeEvents); + } + + @Override + public String deserialize(JsonParser parser, JsonpMapper mapper, Event event) { + if (event == Event.VALUE_NULL) { + return null; + } + if (event == Event.VALUE_TRUE) { + return "true"; + } + if (event == Event.VALUE_FALSE) { + return "false"; + } + return parser.getString(); + } + } + static final JsonpDeserializer DOUBLE_OR_NAN = new JsonpDeserializerBase( EnumSet.of(Event.VALUE_NUMBER, Event.VALUE_STRING, Event.VALUE_NULL), diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/core/search/Hit.java b/java-client/src/main/java/org/opensearch/client/opensearch/core/search/Hit.java index 828ed15f72c42..5bd4893b4724a 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/core/search/Hit.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/core/search/Hit.java @@ -775,7 +775,7 @@ protected static void setupHitDeserializer(ObjectDeserializer stringDeserializer = JsonpDeserializer.stringOrNullDeserializer(); + + List result = JsonpDeserializer.arrayDeserializer(stringDeserializer).deserialize(jsonParser, mapper); + + List expected = new ArrayList<>(); + expected.add("lettuce"); + expected.add(null); + expected.add("tomato"); + + assertEquals(result, expected); + } }