opensearch-project / opensearch-java

Java Client for OpenSearch
Apache License 2.0
118 stars 182 forks source link

[BUG] org.opensearch.client.util.MissingRequiredPropertyException: Missing required property 'GeoBoundsAggregate.bounds' #1091

Open TatianaNeuer opened 2 months ago

TatianaNeuer commented 2 months ago

What is the bug?

When performing a geo bounds aggregation on a null field, the response cannot be deserialized. This is the error:

org.opensearch.client.util.MissingRequiredPropertyException: Missing required property 'GeoBoundsAggregate.bounds'

    at org.opensearch.client.util.ApiTypeHelper.requireNonNull(ApiTypeHelper.java:89)
    at org.opensearch.client.opensearch._types.aggregations.GeoBoundsAggregate.<init>(GeoBoundsAggregate.java:57)
    at org.opensearch.client.opensearch._types.aggregations.GeoBoundsAggregate.<init>(GeoBoundsAggregate.java:49)
    at org.opensearch.client.opensearch._types.aggregations.GeoBoundsAggregate$Builder.build(GeoBoundsAggregate.java:126)
    at org.opensearch.client.opensearch._types.aggregations.GeoBoundsAggregate$Builder.build(GeoBoundsAggregate.java:94)
    at org.opensearch.client.json.ObjectBuilderDeserializer.deserialize(ObjectBuilderDeserializer.java:98)
    at org.opensearch.client.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:60)
    at org.opensearch.client.json.ExternallyTaggedUnion$Deserializer.deserialize(ExternallyTaggedUnion.java:94)
    at org.opensearch.client.json.ExternallyTaggedUnion$TypedKeysDeserializer.deserializeEntry(ExternallyTaggedUnion.java:136)
    at org.opensearch.client.json.ExternallyTaggedUnion$TypedKeysDeserializer.deserialize(ExternallyTaggedUnion.java:119)
    at org.opensearch.client.json.ExternallyTaggedUnion$TypedKeysDeserializer.deserialize(ExternallyTaggedUnion.java:106)
    at org.opensearch.client.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:87)
    at org.opensearch.client.json.ObjectDeserializer$FieldObjectDeserializer.deserialize(ObjectDeserializer.java:81)
    at org.opensearch.client.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:185)
    at org.opensearch.client.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:146)
    at org.opensearch.client.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:87)
    at org.opensearch.client.json.ObjectBuilderDeserializer.deserialize(ObjectBuilderDeserializer.java:91)
    at org.opensearch.client.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:55)
    at org.opensearch.client.transport.endpoints.EndpointWithResponseMapperAttr$1.deserialize(EndpointWithResponseMapperAttr.java:68)
    at org.opensearch.client.transport.rest_client.RestClientTransport.decodeResponse(RestClientTransport.java:360)
    at org.opensearch.client.transport.rest_client.RestClientTransport.getHighLevelResponse(RestClientTransport.java:326)
    at org.opensearch.client.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:148)
    at org.opensearch.client.opensearch.OpenSearchClient.search(OpenSearchClient.java:1381)

How can one reproduce the bug?

Configure a template mapping with a geo_point field:

"mappings": {
      "properties": {
        "location": {
          "properties": {
            "coordinates": {
              "type": "geo_point"
            }
          }
        }
      }
    }

Index a document without the geo_point field:

Map<String, String> indexData = Map.of("first_name", "Bruce");
IndexRequest<Map> indexRequest = new IndexRequest.Builder<Map>().index("index_test").id("1").document(indexData).build();
        openSearchClient.index(indexRequest);

Perform a geo_bounds aggregation:

org.opensearch.client.opensearch.core.SearchResponse<Object> result = openSearchClient.search(
                org.opensearch.client.opensearch.core.SearchRequest.of(s -> s.index("index_test")
                        .aggregations("box", b -> b.geoBounds(g -> g.field("location.coordinates")))), Object.class);

What is the expected behavior?

Deserialize the response and not throwing an exception

What is your host/environment?

Opensearch 2.15.0 org.opensearch.client:opensearch-java:2.11.1

Do you have any additional context?

Here is the aggregation part of the response from opensearch, it does not contain a "bounds" field:

"aggregations": {
        "geo_bounds#box": {}
}

The bug seems similar to https://github.com/opensearch-project/opensearch-java/issues/520 but on GeoBoundsAggregate

dblock commented 1 month ago

[Catch All Triage - 1, 2, 3]