summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTanguy Leroux <tlrx.dev@gmail.com>2017-05-12 15:44:39 +0200
committerGitHub <noreply@github.com>2017-05-12 15:44:39 +0200
commit29a5694bb7ad9f5520be7299aec44f2d85269956 (patch)
tree6ef01a44f7496c3a10f8517d0bf82dcd842ee8d7
parentee1303a9fc4ead821ff591525eb65f9704a8fdd1 (diff)
Add parsing method to GeoHashGrid aggregation (#24589)
-rw-r--r--core/src/main/java/org/elasticsearch/search/aggregations/bucket/geogrid/ParsedGeoHashGrid.java78
-rw-r--r--core/src/test/java/org/elasticsearch/search/aggregations/AggregationsTests.java2
-rw-r--r--core/src/test/java/org/elasticsearch/search/aggregations/bucket/geogrid/InternalGeoHashGridTests.java25
-rw-r--r--test/framework/src/main/java/org/elasticsearch/test/InternalAggregationTestCase.java4
4 files changed, 102 insertions, 7 deletions
diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/geogrid/ParsedGeoHashGrid.java b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/geogrid/ParsedGeoHashGrid.java
new file mode 100644
index 0000000000..4551523e0f
--- /dev/null
+++ b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/geogrid/ParsedGeoHashGrid.java
@@ -0,0 +1,78 @@
+/*
+ * 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.geogrid;
+
+import org.elasticsearch.common.geo.GeoPoint;
+import org.elasticsearch.common.xcontent.ObjectParser;
+import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.elasticsearch.common.xcontent.XContentParser;
+import org.elasticsearch.search.aggregations.ParsedMultiBucketAggregation;
+
+import java.io.IOException;
+import java.util.List;
+
+public class ParsedGeoHashGrid extends ParsedMultiBucketAggregation<ParsedGeoHashGrid.ParsedBucket> implements GeoHashGrid {
+
+ @Override
+ public String getType() {
+ return GeoGridAggregationBuilder.NAME;
+ }
+
+ @Override
+ public List<? extends GeoHashGrid.Bucket> getBuckets() {
+ return buckets;
+ }
+
+ private static ObjectParser<ParsedGeoHashGrid, Void> PARSER =
+ new ObjectParser<>(ParsedGeoHashGrid.class.getSimpleName(), true, ParsedGeoHashGrid::new);
+ static {
+ declareMultiBucketAggregationFields(PARSER, ParsedBucket::fromXContent, ParsedBucket::fromXContent);
+ }
+
+ public static ParsedGeoHashGrid fromXContent(XContentParser parser, String name) throws IOException {
+ ParsedGeoHashGrid aggregation = PARSER.parse(parser, null);
+ aggregation.setName(name);
+ return aggregation;
+ }
+
+ public static class ParsedBucket extends ParsedMultiBucketAggregation.ParsedBucket implements GeoHashGrid.Bucket {
+
+ private String geohashAsString;
+
+ @Override
+ public GeoPoint getKey() {
+ return GeoPoint.fromGeohash(geohashAsString);
+ }
+
+ @Override
+ public String getKeyAsString() {
+ return geohashAsString;
+ }
+
+ @Override
+ protected XContentBuilder keyToXContent(XContentBuilder builder) throws IOException {
+ return builder.field(CommonFields.KEY.getPreferredName(), geohashAsString);
+ }
+
+ static ParsedBucket fromXContent(XContentParser parser) throws IOException {
+ return parseXContent(parser, false, ParsedBucket::new, (p, bucket) -> bucket.geohashAsString = p.textOrNull());
+ }
+ }
+}
diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/AggregationsTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/AggregationsTests.java
index a338c8ec9a..d741240e15 100644
--- a/core/src/test/java/org/elasticsearch/search/aggregations/AggregationsTests.java
+++ b/core/src/test/java/org/elasticsearch/search/aggregations/AggregationsTests.java
@@ -30,6 +30,7 @@ import org.elasticsearch.search.aggregations.bucket.InternalSingleBucketAggregat
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.geogrid.InternalGeoHashGridTests;
import org.elasticsearch.search.aggregations.bucket.histogram.InternalDateHistogramTests;
import org.elasticsearch.search.aggregations.bucket.histogram.InternalHistogramTests;
import org.elasticsearch.search.aggregations.bucket.missing.InternalMissingTests;
@@ -117,6 +118,7 @@ public class AggregationsTests extends ESTestCase {
aggsTests.add(new InternalGlobalTests());
aggsTests.add(new InternalFilterTests());
aggsTests.add(new InternalSamplerTests());
+ aggsTests.add(new InternalGeoHashGridTests());
return Collections.unmodifiableList(aggsTests);
}
diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/geogrid/InternalGeoHashGridTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/geogrid/InternalGeoHashGridTests.java
index a27b47946f..afa9defc78 100644
--- a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/geogrid/InternalGeoHashGridTests.java
+++ b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/geogrid/InternalGeoHashGridTests.java
@@ -22,24 +22,30 @@ import org.apache.lucene.index.IndexWriter;
import org.elasticsearch.common.geo.GeoHashUtils;
import org.elasticsearch.common.io.stream.Writeable;
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.test.InternalAggregationTestCase;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-public class InternalGeoHashGridTests extends InternalAggregationTestCase<InternalGeoHashGrid> {
+public class InternalGeoHashGridTests extends InternalMultiBucketAggregationTestCase<InternalGeoHashGrid> {
@Override
- protected InternalGeoHashGrid createTestInstance(String name, List<PipelineAggregator> pipelineAggregators,
- Map<String, Object> metaData) {
- int size = randomIntBetween(1, 100);
+ protected InternalGeoHashGrid createTestInstance(String name,
+ List<PipelineAggregator> pipelineAggregators,
+ Map<String, Object> metaData,
+ InternalAggregations aggregations) {
+ int size = randomIntBetween(1, 3);
List<InternalGeoHashGrid.Bucket> buckets = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
- long geoHashAsLong = GeoHashUtils.longEncode(randomInt(90), randomInt(90), 4);
- buckets.add(new InternalGeoHashGrid.Bucket(geoHashAsLong, randomInt(IndexWriter.MAX_DOCS), InternalAggregations.EMPTY));
+ double latitude = randomDoubleBetween(-90.0, 90.0, false);
+ double longitude = randomDoubleBetween(-180.0, 180.0, false);
+
+ long geoHashAsLong = GeoHashUtils.longEncode(longitude, latitude, 4);
+ buckets.add(new InternalGeoHashGrid.Bucket(geoHashAsLong, randomInt(IndexWriter.MAX_DOCS), aggregations));
}
return new InternalGeoHashGrid(name, size, buckets, pipelineAggregators, metaData);
}
@@ -87,4 +93,9 @@ public class InternalGeoHashGridTests extends InternalAggregationTestCase<Intern
assertEquals(expected.getKey(), actual.getKey());
}
}
+
+ @Override
+ protected Class<? extends ParsedMultiBucketAggregation> implementationClass() {
+ return ParsedGeoHashGrid.class;
+ }
}
diff --git a/test/framework/src/main/java/org/elasticsearch/test/InternalAggregationTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/InternalAggregationTestCase.java
index 99cf71f65e..da7ac647c5 100644
--- a/test/framework/src/main/java/org/elasticsearch/test/InternalAggregationTestCase.java
+++ b/test/framework/src/main/java/org/elasticsearch/test/InternalAggregationTestCase.java
@@ -19,6 +19,7 @@
package org.elasticsearch.test;
+import com.carrotsearch.randomizedtesting.annotations.Repeat;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
@@ -44,6 +45,8 @@ import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuil
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.geogrid.GeoGridAggregationBuilder;
+import org.elasticsearch.search.aggregations.bucket.geogrid.ParsedGeoHashGrid;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.histogram.HistogramAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.histogram.ParsedDateHistogram;
@@ -160,6 +163,7 @@ public abstract class InternalAggregationTestCase<T extends InternalAggregation>
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));
+ namedXContents.put(GeoGridAggregationBuilder.NAME, (p, c) -> ParsedGeoHashGrid.fromXContent(p, (String) c));
return namedXContents.entrySet().stream()
.map(entry -> new NamedXContentRegistry.Entry(Aggregation.class, new ParseField(entry.getKey()), entry.getValue()))