Skip to content

Commit ef7c2e6

Browse files
authored
Add parsing for InternalAdjacencyMatrix aggregation (#24700)
1 parent 059b23e commit ef7c2e6

File tree

4 files changed

+103
-4
lines changed

4 files changed

+103
-4
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* Licensed to Elasticsearch under one or more contributor
3+
* license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright
5+
* ownership. Elasticsearch licenses this file to you under
6+
* the Apache License, Version 2.0 (the "License"); you may
7+
* not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.elasticsearch.search.aggregations.bucket.adjacency;
21+
22+
import org.elasticsearch.common.xcontent.ObjectParser;
23+
import org.elasticsearch.common.xcontent.XContentParser;
24+
import org.elasticsearch.search.aggregations.ParsedMultiBucketAggregation;
25+
26+
import java.io.IOException;
27+
import java.util.HashMap;
28+
import java.util.List;
29+
import java.util.Map;
30+
31+
public class ParsedAdjacencyMatrix extends ParsedMultiBucketAggregation<ParsedAdjacencyMatrix.ParsedBucket> implements AdjacencyMatrix {
32+
33+
private Map<String, ParsedBucket> bucketMap;
34+
35+
@Override
36+
public String getType() {
37+
return AdjacencyMatrixAggregationBuilder.NAME;
38+
}
39+
40+
@Override
41+
public List<? extends AdjacencyMatrix.Bucket> getBuckets() {
42+
return buckets;
43+
}
44+
45+
@Override
46+
public ParsedBucket getBucketByKey(String key) {
47+
if (bucketMap == null) {
48+
bucketMap = new HashMap<>(buckets.size());
49+
for (ParsedBucket bucket : buckets) {
50+
bucketMap.put(bucket.getKey(), bucket);
51+
}
52+
}
53+
return bucketMap.get(key);
54+
}
55+
56+
private static ObjectParser<ParsedAdjacencyMatrix, Void> PARSER =
57+
new ObjectParser<>(ParsedAdjacencyMatrix.class.getSimpleName(), true, ParsedAdjacencyMatrix::new);
58+
static {
59+
declareMultiBucketAggregationFields(PARSER,
60+
parser -> ParsedBucket.fromXContent(parser),
61+
parser -> ParsedBucket.fromXContent(parser));
62+
}
63+
64+
public static ParsedAdjacencyMatrix fromXContent(XContentParser parser, String name) throws IOException {
65+
ParsedAdjacencyMatrix aggregation = PARSER.parse(parser, null);
66+
aggregation.setName(name);
67+
return aggregation;
68+
}
69+
70+
public static class ParsedBucket extends ParsedMultiBucketAggregation.ParsedBucket implements AdjacencyMatrix.Bucket {
71+
72+
private String key;
73+
74+
@Override
75+
public String getKey() {
76+
return key;
77+
}
78+
79+
@Override
80+
public String getKeyAsString() {
81+
return key;
82+
}
83+
84+
static ParsedBucket fromXContent(XContentParser parser) throws IOException {
85+
return parseXContent(parser, false, ParsedBucket::new, (p, bucket) -> bucket.key = p.text());
86+
}
87+
}
88+
}

core/src/test/java/org/elasticsearch/search/aggregations/AggregationsTests.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.elasticsearch.common.xcontent.XContentParser;
2727
import org.elasticsearch.common.xcontent.XContentType;
2828
import org.elasticsearch.rest.action.search.RestSearchAction;
29+
import org.elasticsearch.search.aggregations.bucket.adjacency.InternalAdjacencyMatrixTests;
2930
import org.elasticsearch.search.aggregations.bucket.filter.InternalFilterTests;
3031
import org.elasticsearch.search.aggregations.bucket.filters.InternalFiltersTests;
3132
import org.elasticsearch.search.aggregations.bucket.geogrid.InternalGeoHashGridTests;
@@ -124,6 +125,7 @@ private static List<InternalAggregationTestCase> getAggsTests() {
124125
aggsTests.add(new InternalDateRangeTests());
125126
aggsTests.add(new InternalGeoDistanceTests());
126127
aggsTests.add(new InternalFiltersTests());
128+
aggsTests.add(new InternalAdjacencyMatrixTests());
127129
return Collections.unmodifiableList(aggsTests);
128130
}
129131

core/src/test/java/org/elasticsearch/search/aggregations/bucket/adjacency/InternalAdjacencyMatrixTests.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,17 @@
2121

2222
import org.elasticsearch.common.io.stream.Writeable.Reader;
2323
import org.elasticsearch.search.aggregations.InternalAggregations;
24+
import org.elasticsearch.search.aggregations.InternalMultiBucketAggregationTestCase;
25+
import org.elasticsearch.search.aggregations.ParsedMultiBucketAggregation;
2426
import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator;
25-
import org.elasticsearch.test.InternalAggregationTestCase;
2627
import org.junit.Before;
2728

2829
import java.util.ArrayList;
2930
import java.util.List;
3031
import java.util.Map;
3132
import java.util.TreeMap;
3233

33-
public class InternalAdjacencyMatrixTests extends InternalAggregationTestCase<InternalAdjacencyMatrix> {
34+
public class InternalAdjacencyMatrixTests extends InternalMultiBucketAggregationTestCase<InternalAdjacencyMatrix> {
3435

3536
private List<String> keys;
3637

@@ -58,12 +59,12 @@ public void setUp() throws Exception {
5859

5960
@Override
6061
protected InternalAdjacencyMatrix createTestInstance(String name, List<PipelineAggregator> pipelineAggregators,
61-
Map<String, Object> metaData) {
62+
Map<String, Object> metaData, InternalAggregations aggregations) {
6263
final List<InternalAdjacencyMatrix.InternalBucket> buckets = new ArrayList<>();
6364
for (int i = 0; i < keys.size(); ++i) {
6465
String key = keys.get(i);
6566
int docCount = randomIntBetween(0, 1000);
66-
buckets.add(new InternalAdjacencyMatrix.InternalBucket(key, docCount, InternalAggregations.EMPTY));
67+
buckets.add(new InternalAdjacencyMatrix.InternalBucket(key, docCount, aggregations));
6768
}
6869
return new InternalAdjacencyMatrix(name, buckets, pipelineAggregators, metaData);
6970
}
@@ -89,4 +90,9 @@ protected void assertReduced(InternalAdjacencyMatrix reduced, List<InternalAdjac
8990
protected Reader<InternalAdjacencyMatrix> instanceReader() {
9091
return InternalAdjacencyMatrix::new;
9192
}
93+
94+
@Override
95+
protected Class<? extends ParsedMultiBucketAggregation> implementationClass() {
96+
return ParsedAdjacencyMatrix.class;
97+
}
9298
}

test/framework/src/main/java/org/elasticsearch/test/InternalAggregationTestCase.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
import org.elasticsearch.search.aggregations.Aggregation;
3939
import org.elasticsearch.search.aggregations.InternalAggregation;
4040
import org.elasticsearch.search.aggregations.ParsedAggregation;
41+
import org.elasticsearch.search.aggregations.bucket.adjacency.AdjacencyMatrixAggregationBuilder;
42+
import org.elasticsearch.search.aggregations.bucket.adjacency.ParsedAdjacencyMatrix;
4143
import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder;
4244
import org.elasticsearch.search.aggregations.bucket.filter.ParsedFilter;
4345
import org.elasticsearch.search.aggregations.bucket.filters.FiltersAggregationBuilder;
@@ -173,6 +175,7 @@ public abstract class InternalAggregationTestCase<T extends InternalAggregation>
173175
map.put(DateRangeAggregationBuilder.NAME, (p, c) -> ParsedDateRange.fromXContent(p, (String) c));
174176
map.put(GeoDistanceAggregationBuilder.NAME, (p, c) -> ParsedGeoDistance.fromXContent(p, (String) c));
175177
map.put(FiltersAggregationBuilder.NAME, (p, c) -> ParsedFilters.fromXContent(p, (String) c));
178+
map.put(AdjacencyMatrixAggregationBuilder.NAME, (p, c) -> ParsedAdjacencyMatrix.fromXContent(p, (String) c));
176179

177180
namedXContents = map.entrySet().stream()
178181
.map(entry -> new NamedXContentRegistry.Entry(Aggregation.class, new ParseField(entry.getKey()), entry.getValue()))

0 commit comments

Comments
 (0)