Skip to content

Commit

Permalink
fix(parent/agg): deserialize parent aggregation (#706) (#1048)
Browse files Browse the repository at this point in the history
* fix(parent/agg): deserialize parent aggregation



* test: provide additional to deserialize parent aggregation



---------

Signed-off-by: Roman <[email protected]>
  • Loading branch information
romansmirnov authored Jun 24, 2024
1 parent 69aa51c commit 1722eb6
Show file tree
Hide file tree
Showing 4 changed files with 186 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)

### Fixed
- Fixed error when deserializing an analyzer without `type` specified ([#1033](https://github.com/opensearch-project/opensearch-java/pull/1033))
- Deserialize aggregation containing a parent aggregation ([#706](https://github.com/opensearch-project/opensearch-java/pull/706))

### Security

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,8 @@ public enum Kind implements JsonEnum {

Nested("nested"),

Parent("parent"),

PercentilesBucket("percentiles_bucket"),

Range("range"),
Expand Down Expand Up @@ -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}?
*/
Expand Down Expand Up @@ -1754,6 +1773,16 @@ public ObjectBuilder<Aggregate> percentilesBucket(PercentilesBucketAggregate v)
return this;
}

public ObjectBuilder<Aggregate> parent(ParentAggregate v) {
this._kind = Kind.Parent;
this._value = v;
return this;
}

public ObjectBuilder<Aggregate> parent(Function<ParentAggregate.Builder, ObjectBuilder<ParentAggregate>> fn) {
return this.parent(fn.apply(new ParentAggregate.Builder()).build());
}

public ObjectBuilder<Aggregate> percentilesBucket(
Function<PercentilesBucketAggregate.Builder, ObjectBuilder<PercentilesBucketAggregate>> fn
) {
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Builder, ObjectBuilder<ParentAggregate>> 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<Builder> implements ObjectBuilder<ParentAggregate> {
@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<ParentAggregate> _DESERIALIZER = ObjectBuilderDeserializer.lazy(
Builder::new,
ParentAggregate::setupParentAggregateDeserializer
);

protected static void setupParentAggregateDeserializer(ObjectDeserializer<ParentAggregate.Builder> op) {
SingleBucketAggregateBase.setupSingleBucketAggregateBaseDeserializer(op);
}

}
Original file line number Diff line number Diff line change
@@ -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<Object> response = SearchResponse._DESERIALIZER.deserialize(parser, mapper);

// then
final Map<String, Aggregate> 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);
}
}

0 comments on commit 1722eb6

Please sign in to comment.