Add parsing for single bucket aggregations (#24564)
This adds parsing to all implementations of SingleBucketAggregations. They are mostly similar, so they share the common base class `ParsedSingleBucketAggregation` and the shared base test `InternalSingleBucketAggregationTestCase`.
This commit is contained in:
parent
570390ac36
commit
c4fc8edc03
|
@ -41,7 +41,7 @@ public abstract class ParsedAggregation implements Aggregation, ToXContent {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
Map<String, Object> metadata;
|
protected Map<String, Object> metadata;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final String getName() {
|
public final String getName() {
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch 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.
|
||||||
|
*/
|
||||||
|
package org.elasticsearch.search.aggregations.bucket;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParserUtils;
|
||||||
|
import org.elasticsearch.search.aggregations.Aggregation;
|
||||||
|
import org.elasticsearch.search.aggregations.Aggregations;
|
||||||
|
import org.elasticsearch.search.aggregations.ParsedAggregation;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A base class for all the single bucket aggregations.
|
||||||
|
*/
|
||||||
|
public abstract class ParsedSingleBucketAggregation extends ParsedAggregation implements SingleBucketAggregation {
|
||||||
|
|
||||||
|
private long docCount;
|
||||||
|
protected Aggregations aggregations = new Aggregations(Collections.emptyList());
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getDocCount() {
|
||||||
|
return docCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setDocCount(long docCount) {
|
||||||
|
this.docCount = docCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Aggregations getAggregations() {
|
||||||
|
return aggregations;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public XContentBuilder doXContentBody(XContentBuilder builder, Params params) throws IOException {
|
||||||
|
builder.field(CommonFields.DOC_COUNT.getPreferredName(), docCount);
|
||||||
|
aggregations.toXContentInternal(builder, params);
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static <T extends ParsedSingleBucketAggregation> T parseXContent(final XContentParser parser, T aggregation, String name)
|
||||||
|
throws IOException {
|
||||||
|
aggregation.setName(name);
|
||||||
|
XContentParser.Token token = parser.currentToken();
|
||||||
|
String currentFieldName = parser.currentName();
|
||||||
|
if (token == XContentParser.Token.FIELD_NAME) {
|
||||||
|
token = parser.nextToken();
|
||||||
|
}
|
||||||
|
ensureExpectedToken(XContentParser.Token.START_OBJECT, token, parser::getTokenLocation);
|
||||||
|
|
||||||
|
List<Aggregation> aggregations = new ArrayList<>();
|
||||||
|
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
|
||||||
|
if (token == XContentParser.Token.FIELD_NAME) {
|
||||||
|
currentFieldName = parser.currentName();
|
||||||
|
} else if (token.isValue()) {
|
||||||
|
if (CommonFields.DOC_COUNT.getPreferredName().equals(currentFieldName)) {
|
||||||
|
aggregation.setDocCount(parser.longValue());
|
||||||
|
}
|
||||||
|
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||||
|
if (CommonFields.META.getPreferredName().equals(currentFieldName)) {
|
||||||
|
aggregation.metadata = parser.map();
|
||||||
|
} else {
|
||||||
|
aggregations.add(XContentParserUtils.parseTypedKeysObject(parser, Aggregation.TYPED_KEYS_DELIMITER, Aggregation.class));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
aggregation.aggregations = new Aggregations(aggregations);
|
||||||
|
return aggregation;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch 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.
|
||||||
|
*/
|
||||||
|
package org.elasticsearch.search.aggregations.bucket.children;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ParsedChildren extends ParsedSingleBucketAggregation implements Children {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return ChildrenAggregationBuilder.NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ParsedChildren fromXContent(XContentParser parser, final String name) throws IOException {
|
||||||
|
return parseXContent(parser, new ParsedChildren(), name);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch 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.
|
||||||
|
*/
|
||||||
|
package org.elasticsearch.search.aggregations.bucket.filter;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ParsedFilter extends ParsedSingleBucketAggregation implements Filter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return FilterAggregationBuilder.NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ParsedFilter fromXContent(XContentParser parser, final String name) throws IOException {
|
||||||
|
return parseXContent(parser, new ParsedFilter(), name);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch 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.
|
||||||
|
*/
|
||||||
|
package org.elasticsearch.search.aggregations.bucket.global;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ParsedGlobal extends ParsedSingleBucketAggregation implements Global {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return GlobalAggregationBuilder.NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ParsedGlobal fromXContent(XContentParser parser, final String name) throws IOException {
|
||||||
|
return parseXContent(parser, new ParsedGlobal(), name);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch 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.
|
||||||
|
*/
|
||||||
|
package org.elasticsearch.search.aggregations.bucket.missing;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ParsedMissing extends ParsedSingleBucketAggregation implements Missing {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return MissingAggregationBuilder.NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ParsedMissing fromXContent(XContentParser parser, final String name) throws IOException {
|
||||||
|
return parseXContent(parser, new ParsedMissing(), name);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch 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.
|
||||||
|
*/
|
||||||
|
package org.elasticsearch.search.aggregations.bucket.nested;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ParsedNested extends ParsedSingleBucketAggregation implements Nested {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return NestedAggregationBuilder.NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ParsedNested fromXContent(XContentParser parser, final String name) throws IOException {
|
||||||
|
return parseXContent(parser, new ParsedNested(), name);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch 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.
|
||||||
|
*/
|
||||||
|
package org.elasticsearch.search.aggregations.bucket.nested;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ParsedReverseNested extends ParsedSingleBucketAggregation implements Nested {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return ReverseNestedAggregationBuilder.NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ParsedReverseNested fromXContent(XContentParser parser, final String name) throws IOException {
|
||||||
|
return parseXContent(parser, new ParsedReverseNested(), name);
|
||||||
|
}
|
||||||
|
}
|
|
@ -49,7 +49,7 @@ public class InternalSampler extends InternalSingleBucketAggregation implements
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getType() {
|
public String getType() {
|
||||||
return "sampler";
|
return NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch 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.
|
||||||
|
*/
|
||||||
|
package org.elasticsearch.search.aggregations.bucket.sampler;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ParsedSampler extends ParsedSingleBucketAggregation implements Sampler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return InternalSampler.NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ParsedSampler fromXContent(XContentParser parser, final String name) throws IOException {
|
||||||
|
return parseXContent(parser, new ParsedSampler(), name);
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,8 +27,15 @@ import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.common.xcontent.XContentType;
|
import org.elasticsearch.common.xcontent.XContentType;
|
||||||
import org.elasticsearch.rest.action.search.RestSearchAction;
|
import org.elasticsearch.rest.action.search.RestSearchAction;
|
||||||
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.children.InternalChildrenTests;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.filter.InternalFilterTests;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.global.InternalGlobalTests;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.InternalDateHistogramTests;
|
import org.elasticsearch.search.aggregations.bucket.histogram.InternalDateHistogramTests;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.InternalHistogramTests;
|
import org.elasticsearch.search.aggregations.bucket.histogram.InternalHistogramTests;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.missing.InternalMissingTests;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.nested.InternalNestedTests;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.nested.InternalReverseNestedTests;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.sampler.InternalSamplerTests;
|
||||||
import org.elasticsearch.search.aggregations.bucket.terms.DoubleTermsTests;
|
import org.elasticsearch.search.aggregations.bucket.terms.DoubleTermsTests;
|
||||||
import org.elasticsearch.search.aggregations.bucket.terms.LongTermsTests;
|
import org.elasticsearch.search.aggregations.bucket.terms.LongTermsTests;
|
||||||
import org.elasticsearch.search.aggregations.bucket.terms.StringTermsTests;
|
import org.elasticsearch.search.aggregations.bucket.terms.StringTermsTests;
|
||||||
|
@ -103,6 +110,13 @@ public class AggregationsTests extends ESTestCase {
|
||||||
aggsTests.add(new LongTermsTests());
|
aggsTests.add(new LongTermsTests());
|
||||||
aggsTests.add(new DoubleTermsTests());
|
aggsTests.add(new DoubleTermsTests());
|
||||||
aggsTests.add(new StringTermsTests());
|
aggsTests.add(new StringTermsTests());
|
||||||
|
aggsTests.add(new InternalMissingTests());
|
||||||
|
aggsTests.add(new InternalNestedTests());
|
||||||
|
aggsTests.add(new InternalReverseNestedTests());
|
||||||
|
aggsTests.add(new InternalChildrenTests());
|
||||||
|
aggsTests.add(new InternalGlobalTests());
|
||||||
|
aggsTests.add(new InternalFilterTests());
|
||||||
|
aggsTests.add(new InternalSamplerTests());
|
||||||
return Collections.unmodifiableList(aggsTests);
|
return Collections.unmodifiableList(aggsTests);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,32 +19,45 @@
|
||||||
|
|
||||||
package org.elasticsearch.search.aggregations.bucket;
|
package org.elasticsearch.search.aggregations.bucket;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.bytes.BytesReference;
|
||||||
|
import org.elasticsearch.common.xcontent.ToXContent;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentType;
|
||||||
|
import org.elasticsearch.rest.action.search.RestSearchAction;
|
||||||
|
import org.elasticsearch.search.aggregations.Aggregation;
|
||||||
import org.elasticsearch.search.aggregations.InternalAggregation;
|
import org.elasticsearch.search.aggregations.InternalAggregation;
|
||||||
import org.elasticsearch.search.aggregations.InternalAggregations;
|
import org.elasticsearch.search.aggregations.InternalAggregations;
|
||||||
|
import org.elasticsearch.search.aggregations.ParsedAggregation;
|
||||||
import org.elasticsearch.search.aggregations.metrics.max.InternalMax;
|
import org.elasticsearch.search.aggregations.metrics.max.InternalMax;
|
||||||
import org.elasticsearch.search.aggregations.metrics.min.InternalMin;
|
import org.elasticsearch.search.aggregations.metrics.min.InternalMin;
|
||||||
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
||||||
import org.elasticsearch.test.InternalAggregationTestCase;
|
import org.elasticsearch.test.InternalAggregationTestCase;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import static java.util.Collections.emptyList;
|
import static java.util.Collections.emptyList;
|
||||||
import static java.util.Collections.emptyMap;
|
import static java.util.Collections.emptyMap;
|
||||||
|
import static java.util.Collections.singletonMap;
|
||||||
|
import static org.elasticsearch.common.xcontent.XContentHelper.toXContent;
|
||||||
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertToXContentEquivalent;
|
||||||
|
|
||||||
public abstract class InternalSingleBucketAggregationTestCase<T extends InternalSingleBucketAggregation>
|
public abstract class InternalSingleBucketAggregationTestCase<T extends InternalSingleBucketAggregation>
|
||||||
extends InternalAggregationTestCase<T> {
|
extends InternalAggregationTestCase<T> {
|
||||||
|
|
||||||
private final boolean hasInternalMax = randomBoolean();
|
private boolean hasInternalMax;
|
||||||
private final boolean hasInternalMin = randomBoolean();
|
private boolean hasInternalMin;
|
||||||
|
|
||||||
public Supplier<InternalAggregations> subAggregationsSupplier;
|
public Supplier<InternalAggregations> subAggregationsSupplier;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
|
hasInternalMax = randomBoolean();
|
||||||
|
hasInternalMin = randomBoolean();
|
||||||
subAggregationsSupplier = () -> {
|
subAggregationsSupplier = () -> {
|
||||||
List<InternalAggregation> aggs = new ArrayList<>();
|
List<InternalAggregation> aggs = new ArrayList<>();
|
||||||
if (hasInternalMax) {
|
if (hasInternalMax) {
|
||||||
|
@ -89,4 +102,38 @@ public abstract class InternalSingleBucketAggregationTestCase<T extends Internal
|
||||||
}
|
}
|
||||||
extraAssertReduced(reduced, inputs);
|
extraAssertReduced(reduced, inputs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void assertFromXContent(T aggregation, ParsedAggregation parsedAggregation) throws IOException {
|
||||||
|
assertTrue(parsedAggregation instanceof ParsedSingleBucketAggregation);
|
||||||
|
ParsedSingleBucketAggregation parsed = (ParsedSingleBucketAggregation) parsedAggregation;
|
||||||
|
|
||||||
|
assertEquals(aggregation.getDocCount(), parsed.getDocCount());
|
||||||
|
InternalAggregations aggregations = aggregation.getAggregations();
|
||||||
|
Map<String, Aggregation> expectedAggregations = new HashMap<>();
|
||||||
|
int expectedNumberOfAggregations = 0;
|
||||||
|
for (Aggregation expectedAggregation : aggregations) {
|
||||||
|
// since we shuffle xContent, we cannot rely on the order of the original inner aggregations for comparison
|
||||||
|
assertTrue(expectedAggregation instanceof InternalAggregation);
|
||||||
|
expectedAggregations.put(expectedAggregation.getName(), expectedAggregation);
|
||||||
|
expectedNumberOfAggregations++;
|
||||||
|
}
|
||||||
|
int parsedNumberOfAggregations = 0;
|
||||||
|
for (Aggregation parsedAgg : parsed.getAggregations()) {
|
||||||
|
assertTrue(parsedAgg instanceof ParsedAggregation);
|
||||||
|
assertTrue(expectedAggregations.keySet().contains(parsedAgg.getName()));
|
||||||
|
Aggregation expectedInternalAggregation = expectedAggregations.get(parsedAgg.getName());
|
||||||
|
final XContentType xContentType = randomFrom(XContentType.values());
|
||||||
|
final ToXContent.Params params = new ToXContent.MapParams(singletonMap(RestSearchAction.TYPED_KEYS_PARAM, "true"));
|
||||||
|
BytesReference expectedBytes = toXContent(expectedInternalAggregation, xContentType, params, false);
|
||||||
|
BytesReference actualBytes = toXContent(parsedAgg, xContentType, params, false);
|
||||||
|
assertToXContentEquivalent(expectedBytes, actualBytes, xContentType);
|
||||||
|
parsedNumberOfAggregations++;
|
||||||
|
}
|
||||||
|
assertEquals(expectedNumberOfAggregations, parsedNumberOfAggregations);
|
||||||
|
Class<? extends ParsedSingleBucketAggregation> parsedClass = implementationClass();
|
||||||
|
assertTrue(parsedClass != null && parsedClass.isInstance(parsedAggregation));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract Class<? extends ParsedSingleBucketAggregation> implementationClass();
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ package org.elasticsearch.search.aggregations.bucket.children;
|
||||||
import org.elasticsearch.common.io.stream.Writeable.Reader;
|
import org.elasticsearch.common.io.stream.Writeable.Reader;
|
||||||
import org.elasticsearch.search.aggregations.InternalAggregations;
|
import org.elasticsearch.search.aggregations.InternalAggregations;
|
||||||
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -44,4 +45,8 @@ public class InternalChildrenTests extends InternalSingleBucketAggregationTestCa
|
||||||
return InternalChildren::new;
|
return InternalChildren::new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<? extends ParsedSingleBucketAggregation> implementationClass() {
|
||||||
|
return ParsedChildren.class;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ package org.elasticsearch.search.aggregations.bucket.filter;
|
||||||
import org.elasticsearch.common.io.stream.Writeable.Reader;
|
import org.elasticsearch.common.io.stream.Writeable.Reader;
|
||||||
import org.elasticsearch.search.aggregations.InternalAggregations;
|
import org.elasticsearch.search.aggregations.InternalAggregations;
|
||||||
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -43,4 +44,9 @@ public class InternalFilterTests extends InternalSingleBucketAggregationTestCase
|
||||||
protected Reader<InternalFilter> instanceReader() {
|
protected Reader<InternalFilter> instanceReader() {
|
||||||
return InternalFilter::new;
|
return InternalFilter::new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<? extends ParsedSingleBucketAggregation> implementationClass() {
|
||||||
|
return ParsedFilter.class;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ package org.elasticsearch.search.aggregations.bucket.global;
|
||||||
import org.elasticsearch.common.io.stream.Writeable.Reader;
|
import org.elasticsearch.common.io.stream.Writeable.Reader;
|
||||||
import org.elasticsearch.search.aggregations.InternalAggregations;
|
import org.elasticsearch.search.aggregations.InternalAggregations;
|
||||||
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -44,4 +45,8 @@ public class InternalGlobalTests extends InternalSingleBucketAggregationTestCase
|
||||||
return InternalGlobal::new;
|
return InternalGlobal::new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<? extends ParsedSingleBucketAggregation> implementationClass() {
|
||||||
|
return ParsedGlobal.class;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ package org.elasticsearch.search.aggregations.bucket.missing;
|
||||||
import org.elasticsearch.common.io.stream.Writeable.Reader;
|
import org.elasticsearch.common.io.stream.Writeable.Reader;
|
||||||
import org.elasticsearch.search.aggregations.InternalAggregations;
|
import org.elasticsearch.search.aggregations.InternalAggregations;
|
||||||
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -44,4 +45,8 @@ public class InternalMissingTests extends InternalSingleBucketAggregationTestCas
|
||||||
return InternalMissing::new;
|
return InternalMissing::new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<? extends ParsedSingleBucketAggregation> implementationClass() {
|
||||||
|
return ParsedMissing.class;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ package org.elasticsearch.search.aggregations.bucket.nested;
|
||||||
import org.elasticsearch.common.io.stream.Writeable.Reader;
|
import org.elasticsearch.common.io.stream.Writeable.Reader;
|
||||||
import org.elasticsearch.search.aggregations.InternalAggregations;
|
import org.elasticsearch.search.aggregations.InternalAggregations;
|
||||||
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -43,4 +44,9 @@ public class InternalNestedTests extends InternalSingleBucketAggregationTestCase
|
||||||
protected Reader<InternalNested> instanceReader() {
|
protected Reader<InternalNested> instanceReader() {
|
||||||
return InternalNested::new;
|
return InternalNested::new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<? extends ParsedSingleBucketAggregation> implementationClass() {
|
||||||
|
return ParsedNested.class;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ package org.elasticsearch.search.aggregations.bucket.nested;
|
||||||
import org.elasticsearch.common.io.stream.Writeable.Reader;
|
import org.elasticsearch.common.io.stream.Writeable.Reader;
|
||||||
import org.elasticsearch.search.aggregations.InternalAggregations;
|
import org.elasticsearch.search.aggregations.InternalAggregations;
|
||||||
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -43,4 +44,9 @@ public class InternalReverseNestedTests extends InternalSingleBucketAggregationT
|
||||||
protected Reader<InternalReverseNested> instanceReader() {
|
protected Reader<InternalReverseNested> instanceReader() {
|
||||||
return InternalReverseNested::new;
|
return InternalReverseNested::new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<? extends ParsedSingleBucketAggregation> implementationClass() {
|
||||||
|
return ParsedReverseNested.class;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ package org.elasticsearch.search.aggregations.bucket.sampler;
|
||||||
import org.elasticsearch.common.io.stream.Writeable;
|
import org.elasticsearch.common.io.stream.Writeable;
|
||||||
import org.elasticsearch.search.aggregations.InternalAggregations;
|
import org.elasticsearch.search.aggregations.InternalAggregations;
|
||||||
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregationTestCase;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.ParsedSingleBucketAggregation;
|
||||||
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -42,4 +43,9 @@ public class InternalSamplerTests extends InternalSingleBucketAggregationTestCas
|
||||||
protected Writeable.Reader<InternalSampler> instanceReader() {
|
protected Writeable.Reader<InternalSampler> instanceReader() {
|
||||||
return InternalSampler::new;
|
return InternalSampler::new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<? extends ParsedSingleBucketAggregation> implementationClass() {
|
||||||
|
return ParsedSampler.class;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -38,10 +38,24 @@ import org.elasticsearch.search.SearchModule;
|
||||||
import org.elasticsearch.search.aggregations.Aggregation;
|
import org.elasticsearch.search.aggregations.Aggregation;
|
||||||
import org.elasticsearch.search.aggregations.InternalAggregation;
|
import org.elasticsearch.search.aggregations.InternalAggregation;
|
||||||
import org.elasticsearch.search.aggregations.ParsedAggregation;
|
import org.elasticsearch.search.aggregations.ParsedAggregation;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.children.ChildrenAggregationBuilder;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.children.ParsedChildren;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.filter.ParsedFilter;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.global.GlobalAggregationBuilder;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.global.ParsedGlobal;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder;
|
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.HistogramAggregationBuilder;
|
import org.elasticsearch.search.aggregations.bucket.histogram.HistogramAggregationBuilder;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.ParsedDateHistogram;
|
import org.elasticsearch.search.aggregations.bucket.histogram.ParsedDateHistogram;
|
||||||
import org.elasticsearch.search.aggregations.bucket.histogram.ParsedHistogram;
|
import org.elasticsearch.search.aggregations.bucket.histogram.ParsedHistogram;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.missing.MissingAggregationBuilder;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.missing.ParsedMissing;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.nested.NestedAggregationBuilder;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.nested.ParsedNested;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.nested.ParsedReverseNested;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.nested.ReverseNestedAggregationBuilder;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.sampler.InternalSampler;
|
||||||
|
import org.elasticsearch.search.aggregations.bucket.sampler.ParsedSampler;
|
||||||
import org.elasticsearch.search.aggregations.bucket.terms.DoubleTerms;
|
import org.elasticsearch.search.aggregations.bucket.terms.DoubleTerms;
|
||||||
import org.elasticsearch.search.aggregations.bucket.terms.LongTerms;
|
import org.elasticsearch.search.aggregations.bucket.terms.LongTerms;
|
||||||
import org.elasticsearch.search.aggregations.bucket.terms.ParsedDoubleTerms;
|
import org.elasticsearch.search.aggregations.bucket.terms.ParsedDoubleTerms;
|
||||||
|
@ -139,6 +153,13 @@ public abstract class InternalAggregationTestCase<T extends InternalAggregation>
|
||||||
namedXContents.put(StringTerms.NAME, (p, c) -> ParsedStringTerms.fromXContent(p, (String) c));
|
namedXContents.put(StringTerms.NAME, (p, c) -> ParsedStringTerms.fromXContent(p, (String) c));
|
||||||
namedXContents.put(LongTerms.NAME, (p, c) -> ParsedLongTerms.fromXContent(p, (String) c));
|
namedXContents.put(LongTerms.NAME, (p, c) -> ParsedLongTerms.fromXContent(p, (String) c));
|
||||||
namedXContents.put(DoubleTerms.NAME, (p, c) -> ParsedDoubleTerms.fromXContent(p, (String) c));
|
namedXContents.put(DoubleTerms.NAME, (p, c) -> ParsedDoubleTerms.fromXContent(p, (String) c));
|
||||||
|
namedXContents.put(MissingAggregationBuilder.NAME, (p, c) -> ParsedMissing.fromXContent(p, (String) c));
|
||||||
|
namedXContents.put(NestedAggregationBuilder.NAME, (p, c) -> ParsedNested.fromXContent(p, (String) c));
|
||||||
|
namedXContents.put(ReverseNestedAggregationBuilder.NAME, (p, c) -> ParsedReverseNested.fromXContent(p, (String) c));
|
||||||
|
namedXContents.put(ChildrenAggregationBuilder.NAME, (p, c) -> ParsedChildren.fromXContent(p, (String) c));
|
||||||
|
namedXContents.put(GlobalAggregationBuilder.NAME, (p, c) -> ParsedGlobal.fromXContent(p, (String) c));
|
||||||
|
namedXContents.put(FilterAggregationBuilder.NAME, (p, c) -> ParsedFilter.fromXContent(p, (String) c));
|
||||||
|
namedXContents.put(InternalSampler.NAME, (p, c) -> ParsedSampler.fromXContent(p, (String) c));
|
||||||
|
|
||||||
return namedXContents.entrySet().stream()
|
return namedXContents.entrySet().stream()
|
||||||
.map(entry -> new NamedXContentRegistry.Entry(Aggregation.class, new ParseField(entry.getKey()), entry.getValue()))
|
.map(entry -> new NamedXContentRegistry.Entry(Aggregation.class, new ParseField(entry.getKey()), entry.getValue()))
|
||||||
|
@ -248,7 +269,7 @@ public abstract class InternalAggregationTestCase<T extends InternalAggregation>
|
||||||
}
|
}
|
||||||
|
|
||||||
//norelease TODO make abstract
|
//norelease TODO make abstract
|
||||||
protected void assertFromXContent(T aggregation, ParsedAggregation parsedAggregation) {
|
protected void assertFromXContent(T aggregation, ParsedAggregation parsedAggregation) throws IOException {
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
|
Loading…
Reference in New Issue