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 aad9a074e..85832385b 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/test/java/co/elastic/clients/elasticsearch/model/SerializationTest.java b/java-client/src/test/java/co/elastic/clients/elasticsearch/model/SerializationTest.java index b32eb8ed5..a38f843bb 100644 --- a/java-client/src/test/java/co/elastic/clients/elasticsearch/model/SerializationTest.java +++ b/java-client/src/test/java/co/elastic/clients/elasticsearch/model/SerializationTest.java @@ -19,6 +19,7 @@ package co.elastic.clients.elasticsearch.model; +import co.elastic.clients.elasticsearch._types.SortOptions; import co.elastic.clients.elasticsearch.cat.NodesResponse; import co.elastic.clients.elasticsearch.core.GetSourceResponse; import co.elastic.clients.json.JsonpDeserializable; @@ -131,4 +132,38 @@ public void testJsonpValuesToString() { JsonpUtils.toString(Json.createObjectBuilder().build()); }); } + + @Test + public void testSortOptionsDeserializer() { + + String customField = """ + { + "term" : "asc" + } + """; + + SortOptions so = SortOptions.of(b->b.withJson(new StringReader(customField))); + + String score = """ + "_score" + """; + + so = SortOptions.of(b->b.withJson(new StringReader(score))); + + String geoDistance = """ + { + "_geo_distance" : { + "pin.location" : "<-70>, <40>", + "order" : "asc", + "unit" : "km", + "mode" : "min", + "distance_type" : "arc", + "ignore_unmapped": true + } + } + """; + + so = SortOptions.of(b->b.withJson(new StringReader(geoDistance))); + + } }