Add parsing for InternalAdjacencyMatrix aggregation (#24700)

This commit is contained in:
Christoph Büscher 2017-05-16 14:35:49 +02:00 committed by GitHub
parent 059b23e92e
commit ef7c2e62c3
4 changed files with 103 additions and 4 deletions

View File

@ -0,0 +1,88 @@
/*
* 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.adjacency;
import org.elasticsearch.common.xcontent.ObjectParser;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.search.aggregations.ParsedMultiBucketAggregation;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ParsedAdjacencyMatrix extends ParsedMultiBucketAggregation<ParsedAdjacencyMatrix.ParsedBucket> implements AdjacencyMatrix {
private Map<String, ParsedBucket> bucketMap;
@Override
public String getType() {
return AdjacencyMatrixAggregationBuilder.NAME;
}
@Override
public List<? extends AdjacencyMatrix.Bucket> getBuckets() {
return buckets;
}
@Override
public ParsedBucket getBucketByKey(String key) {
if (bucketMap == null) {
bucketMap = new HashMap<>(buckets.size());
for (ParsedBucket bucket : buckets) {
bucketMap.put(bucket.getKey(), bucket);
}
}
return bucketMap.get(key);
}
private static ObjectParser<ParsedAdjacencyMatrix, Void> PARSER =
new ObjectParser<>(ParsedAdjacencyMatrix.class.getSimpleName(), true, ParsedAdjacencyMatrix::new);
static {
declareMultiBucketAggregationFields(PARSER,
parser -> ParsedBucket.fromXContent(parser),
parser -> ParsedBucket.fromXContent(parser));
}
public static ParsedAdjacencyMatrix fromXContent(XContentParser parser, String name) throws IOException {
ParsedAdjacencyMatrix aggregation = PARSER.parse(parser, null);
aggregation.setName(name);
return aggregation;
}
public static class ParsedBucket extends ParsedMultiBucketAggregation.ParsedBucket implements AdjacencyMatrix.Bucket {
private String key;
@Override
public String getKey() {
return key;
}
@Override
public String getKeyAsString() {
return key;
}
static ParsedBucket fromXContent(XContentParser parser) throws IOException {
return parseXContent(parser, false, ParsedBucket::new, (p, bucket) -> bucket.key = p.text());
}
}
}

View File

@ -26,6 +26,7 @@ import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentParser; 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.adjacency.InternalAdjacencyMatrixTests;
import org.elasticsearch.search.aggregations.bucket.filter.InternalFilterTests; import org.elasticsearch.search.aggregations.bucket.filter.InternalFilterTests;
import org.elasticsearch.search.aggregations.bucket.filters.InternalFiltersTests; import org.elasticsearch.search.aggregations.bucket.filters.InternalFiltersTests;
import org.elasticsearch.search.aggregations.bucket.geogrid.InternalGeoHashGridTests; import org.elasticsearch.search.aggregations.bucket.geogrid.InternalGeoHashGridTests;
@ -124,6 +125,7 @@ public class AggregationsTests extends ESTestCase {
aggsTests.add(new InternalDateRangeTests()); aggsTests.add(new InternalDateRangeTests());
aggsTests.add(new InternalGeoDistanceTests()); aggsTests.add(new InternalGeoDistanceTests());
aggsTests.add(new InternalFiltersTests()); aggsTests.add(new InternalFiltersTests());
aggsTests.add(new InternalAdjacencyMatrixTests());
return Collections.unmodifiableList(aggsTests); return Collections.unmodifiableList(aggsTests);
} }

View File

@ -21,8 +21,9 @@ package org.elasticsearch.search.aggregations.bucket.adjacency;
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.InternalMultiBucketAggregationTestCase;
import org.elasticsearch.search.aggregations.ParsedMultiBucketAggregation;
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator; import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
import org.elasticsearch.test.InternalAggregationTestCase;
import org.junit.Before; import org.junit.Before;
import java.util.ArrayList; import java.util.ArrayList;
@ -30,7 +31,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
public class InternalAdjacencyMatrixTests extends InternalAggregationTestCase<InternalAdjacencyMatrix> { public class InternalAdjacencyMatrixTests extends InternalMultiBucketAggregationTestCase<InternalAdjacencyMatrix> {
private List<String> keys; private List<String> keys;
@ -58,12 +59,12 @@ public class InternalAdjacencyMatrixTests extends InternalAggregationTestCase<In
@Override @Override
protected InternalAdjacencyMatrix createTestInstance(String name, List<PipelineAggregator> pipelineAggregators, protected InternalAdjacencyMatrix createTestInstance(String name, List<PipelineAggregator> pipelineAggregators,
Map<String, Object> metaData) { Map<String, Object> metaData, InternalAggregations aggregations) {
final List<InternalAdjacencyMatrix.InternalBucket> buckets = new ArrayList<>(); final List<InternalAdjacencyMatrix.InternalBucket> buckets = new ArrayList<>();
for (int i = 0; i < keys.size(); ++i) { for (int i = 0; i < keys.size(); ++i) {
String key = keys.get(i); String key = keys.get(i);
int docCount = randomIntBetween(0, 1000); int docCount = randomIntBetween(0, 1000);
buckets.add(new InternalAdjacencyMatrix.InternalBucket(key, docCount, InternalAggregations.EMPTY)); buckets.add(new InternalAdjacencyMatrix.InternalBucket(key, docCount, aggregations));
} }
return new InternalAdjacencyMatrix(name, buckets, pipelineAggregators, metaData); return new InternalAdjacencyMatrix(name, buckets, pipelineAggregators, metaData);
} }
@ -89,4 +90,9 @@ public class InternalAdjacencyMatrixTests extends InternalAggregationTestCase<In
protected Reader<InternalAdjacencyMatrix> instanceReader() { protected Reader<InternalAdjacencyMatrix> instanceReader() {
return InternalAdjacencyMatrix::new; return InternalAdjacencyMatrix::new;
} }
@Override
protected Class<? extends ParsedMultiBucketAggregation> implementationClass() {
return ParsedAdjacencyMatrix.class;
}
} }

View File

@ -38,6 +38,8 @@ 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.adjacency.AdjacencyMatrixAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.adjacency.ParsedAdjacencyMatrix;
import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.filter.ParsedFilter; import org.elasticsearch.search.aggregations.bucket.filter.ParsedFilter;
import org.elasticsearch.search.aggregations.bucket.filters.FiltersAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.filters.FiltersAggregationBuilder;
@ -173,6 +175,7 @@ public abstract class InternalAggregationTestCase<T extends InternalAggregation>
map.put(DateRangeAggregationBuilder.NAME, (p, c) -> ParsedDateRange.fromXContent(p, (String) c)); map.put(DateRangeAggregationBuilder.NAME, (p, c) -> ParsedDateRange.fromXContent(p, (String) c));
map.put(GeoDistanceAggregationBuilder.NAME, (p, c) -> ParsedGeoDistance.fromXContent(p, (String) c)); map.put(GeoDistanceAggregationBuilder.NAME, (p, c) -> ParsedGeoDistance.fromXContent(p, (String) c));
map.put(FiltersAggregationBuilder.NAME, (p, c) -> ParsedFilters.fromXContent(p, (String) c)); map.put(FiltersAggregationBuilder.NAME, (p, c) -> ParsedFilters.fromXContent(p, (String) c));
map.put(AdjacencyMatrixAggregationBuilder.NAME, (p, c) -> ParsedAdjacencyMatrix.fromXContent(p, (String) c));
namedXContents = map.entrySet().stream() namedXContents = map.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()))