diff --git a/CHANGELOG.md b/CHANGELOG.md index 453685d9e4..e331fa12d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ This section is for maintaining a changelog for all breaking changes for the cli ### Fixed - Fix version and build ([#254](https://github.com/opensearch-project/opensearch-java/pull/254)) +- Deserialize aggregation containing a parent aggregation ([#706](https://github.com/opensearch-project/opensearch-java/pull/706)) ### Security diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/_types/aggregations/Aggregate.java b/java-client/src/main/java/org/opensearch/client/opensearch/_types/aggregations/Aggregate.java index 999bdfc84f..974b795f91 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/_types/aggregations/Aggregate.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/_types/aggregations/Aggregate.java @@ -136,6 +136,8 @@ public enum Kind implements JsonEnum { Nested("nested"), + Parent("parent"), + PercentilesBucket("percentiles_bucket"), Range("range"), @@ -894,6 +896,23 @@ public NestedAggregate nested() { return TaggedUnionUtils.get(this, Kind.Nested); } + /** + * Is this variant instance of kind {@code parent}? + */ + public boolean isParent() { + return _kind == Kind.Parent; + } + + /** + * Get the {@code parent} variant value. + * + * @throws IllegalStateException + * if the current variant is not of the {@code parent} kind. + */ + public ParentAggregate parent() { + return TaggedUnionUtils.get(this, Kind.Parent); + } + /** * Is this variant instance of kind {@code percentiles_bucket}? */ @@ -1754,6 +1773,16 @@ public ObjectBuilder percentilesBucket(PercentilesBucketAggregate v) return this; } + public ObjectBuilder parent(ParentAggregate v) { + this._kind = Kind.Parent; + this._value = v; + return this; + } + + public ObjectBuilder parent(Function> fn) { + return this.parent(fn.apply(new ParentAggregate.Builder()).build()); + } + public ObjectBuilder percentilesBucket( Function> fn ) { @@ -2075,6 +2104,7 @@ public Aggregate build() { deserializers.put("missing", MissingAggregate._DESERIALIZER); deserializers.put("multi_terms", MultiTermsAggregate._DESERIALIZER); deserializers.put("nested", NestedAggregate._DESERIALIZER); + deserializers.put("parent", ParentAggregate._DESERIALIZER); deserializers.put("percentiles_bucket", PercentilesBucketAggregate._DESERIALIZER); deserializers.put("range", RangeAggregate._DESERIALIZER); deserializers.put("rate", RateAggregate._DESERIALIZER); diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/_types/aggregations/ParentAggregate.java b/java-client/src/main/java/org/opensearch/client/opensearch/_types/aggregations/ParentAggregate.java new file mode 100644 index 0000000000..7129d2879c --- /dev/null +++ b/java-client/src/main/java/org/opensearch/client/opensearch/_types/aggregations/ParentAggregate.java @@ -0,0 +1,101 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * Modifications Copyright OpenSearch Contributors. See + * GitHub history for details. + */ + +package org.opensearch.client.opensearch._types.aggregations; + +import java.util.function.Function; +import org.opensearch.client.json.JsonpDeserializable; +import org.opensearch.client.json.JsonpDeserializer; +import org.opensearch.client.json.ObjectBuilderDeserializer; +import org.opensearch.client.json.ObjectDeserializer; +import org.opensearch.client.util.ObjectBuilder; + +// typedef: _types.aggregations.ParentAggregate + +@JsonpDeserializable +public class ParentAggregate extends SingleBucketAggregateBase implements AggregateVariant { + // --------------------------------------------------------------------------------------------- + + private ParentAggregate(Builder builder) { + super(builder); + + } + + public static ParentAggregate of(Function> fn) { + return fn.apply(new Builder()).build(); + } + + @Override + public Aggregate.Kind _aggregateKind() { + return Aggregate.Kind.Parent; + } + + // --------------------------------------------------------------------------------------------- + + /** + * Builder for {@link ParentAggregate}. + */ + + public static class Builder extends SingleBucketAggregateBase.AbstractBuilder implements ObjectBuilder { + @Override + protected Builder self() { + return this; + } + + /** + * Builds a {@link ParentAggregate}. + * + * @throws NullPointerException + * if some of the required fields are null. + */ + public ParentAggregate build() { + _checkSingleUse(); + + return new ParentAggregate(this); + } + } + + // --------------------------------------------------------------------------------------------- + + /** + * Json deserializer for {@link ParentAggregate} + */ + public static final JsonpDeserializer _DESERIALIZER = ObjectBuilderDeserializer.lazy( + Builder::new, + ParentAggregate::setupParentAggregateDeserializer + ); + + protected static void setupParentAggregateDeserializer(ObjectDeserializer op) { + SingleBucketAggregateBase.setupSingleBucketAggregateBaseDeserializer(op); + } + +} diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/core/AggregateResponseTest.java b/java-client/src/test/java/org/opensearch/client/opensearch/core/AggregateResponseTest.java new file mode 100644 index 0000000000..5fe98295a2 --- /dev/null +++ b/java-client/src/test/java/org/opensearch/client/opensearch/core/AggregateResponseTest.java @@ -0,0 +1,54 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.client.opensearch.core; + +import com.fasterxml.jackson.core.JsonProcessingException; +import jakarta.json.stream.JsonParser; +import java.io.StringReader; +import java.util.Map; +import org.junit.Test; +import org.opensearch.client.opensearch._types.aggregations.Aggregate; +import org.opensearch.client.opensearch._types.aggregations.ParentAggregate; +import org.opensearch.client.opensearch.model.ModelTestCase; + +public class AggregateResponseTest extends ModelTestCase { + + @Test + public void shouldCreateParentAggregate() { + // given + final Aggregate aggregate = Aggregate.of((b) -> b.parent((p) -> p.docCount(789L))); + + // when + final ParentAggregate parentAggregate = aggregate.parent(); + + // then + assertEquals(parentAggregate._aggregateKind(), Aggregate.Kind.Parent); + assertEquals(parentAggregate.docCount(), 789L); + } + + @Test + public void shouldDeserializeParentAggregate() throws JsonProcessingException { + // given + final String parentAggreationJson = "{\"took\": 3,\"timed_out\": false," + + "\"_shards\": {\"total\": 1,\"successful\": 1,\"skipped\": 0,\"failed\": 0}," + + "\"hits\": {\"total\": {\"value\": 0,\"relation\": \"eq\"},\"hits\": []}," + + "\"aggregations\": {\"parent#foo\": {\"doc_count\": 123456}}}"; + final JsonParser parser = mapper.jsonProvider().createParser(new StringReader(parentAggreationJson)); + + // when + final SearchResponse response = SearchResponse._DESERIALIZER.deserialize(parser, mapper); + + // then + final Map aggregations = response.aggregations(); + assertFalse(aggregations.isEmpty()); + assertTrue(aggregations.containsKey("foo")); + assertEquals(aggregations.get("foo").parent()._aggregateKind(), Aggregate.Kind.Parent); + assertEquals(aggregations.get("foo").parent().docCount(), 123456L); + } +}