Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c3533a9

Browse files
committed
geo bounds support
1 parent 63cb84a commit c3533a9

File tree

4 files changed

+78
-11
lines changed

4 files changed

+78
-11
lines changed

src/main/java/org/elasticsearch/plugin/nlpcn/executors/CSVResultRestExecutor.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,14 @@ public class CSVResultRestExecutor implements RestExecutor {
1818
@Override
1919
public void execute(Client client, Map<String, String> params, QueryAction queryAction, RestChannel channel) throws Exception {
2020
Object queryResult = QueryActionElasticExecutor.executeAnyAction(client, queryAction);
21-
boolean flat = false;
22-
if(params.containsKey("flat")){
23-
flat = Boolean.parseBoolean(params.get("flat"));
24-
}
21+
22+
boolean flat = getBooleanOrDefault(params,"flat",false);
2523
String separator = ",";
2624
if(params.containsKey("separator")){
2725
separator = params.get("separator");
2826
}
29-
boolean includeScore = Boolean.getBoolean(params.getOrDefault("_score", "false"));
30-
boolean includeType = Boolean.getBoolean(params.getOrDefault("_type", "false"));
27+
boolean includeScore = getBooleanOrDefault(params,"_score",false);
28+
boolean includeType = getBooleanOrDefault(params,"_type",false);
3129
CSVResult result = new CSVResultsExtractor(includeScore,includeType).extractResults(queryResult,flat,separator);
3230
String newLine = "\n";
3331
if(params.containsKey("newLine")){
@@ -38,6 +36,14 @@ public void execute(Client client, Map<String, String> params, QueryAction query
3836
channel.sendResponse(bytesRestResponse);
3937
}
4038

39+
private boolean getBooleanOrDefault(Map<String, String> params, String param, boolean defaultValue) {
40+
boolean flat = defaultValue;
41+
if(params.containsKey(param)){
42+
flat = Boolean.parseBoolean(params.get(param));
43+
}
44+
return flat;
45+
}
46+
4147
private String buildString(String separator, CSVResult result, String newLine) {
4248
StringBuilder csv = new StringBuilder();
4349
csv.append(Joiner.on(separator).join(result.getHeaders()));

src/main/java/org/elasticsearch/plugin/nlpcn/executors/CSVResultsExtractor.java

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
import org.elasticsearch.search.aggregations.bucket.geogrid.GeoHashGrid;
1515
import org.elasticsearch.search.aggregations.metrics.MetricsAggregator;
1616
import org.elasticsearch.search.aggregations.metrics.NumericMetricsAggregation;
17+
import org.elasticsearch.search.aggregations.metrics.geobounds.GeoBounds;
1718
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile;
1819
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentiles;
1920
import org.elasticsearch.search.aggregations.metrics.scripted.ScriptedMetric;
2021
import org.elasticsearch.search.aggregations.metrics.stats.Stats;
2122
import org.elasticsearch.search.aggregations.metrics.stats.extended.ExtendedStats;
23+
import org.elasticsearch.search.aggregations.metrics.tophits.TopHits;
2224
import org.nlpcn.es4sql.Util;
2325

2426
import java.util.*;
@@ -59,8 +61,6 @@ public CSVResult extractResults(Object queryResult, boolean flat, String separat
5961
//todo: need to handle more options for aggregations:
6062
//Aggregations that inhrit from base
6163
//ScriptedMetric
62-
//TopHits
63-
//GeoBounds
6464

6565
return new CSVResult(headers,csvLines);
6666

@@ -82,13 +82,22 @@ private void handleAggregations(Aggregations aggregations, List<String> headers
8282
//we want to skip singleBucketAggregations (nested,reverse_nested,filters)
8383
if(aggregation instanceof SingleBucketAggregation){
8484
Aggregations singleBucketAggs = ((SingleBucketAggregation) aggregation).getAggregations();
85-
handleAggregations(singleBucketAggs,headers,lines);
85+
handleAggregations(singleBucketAggs, headers, lines);
8686
return;
8787
}
8888
if(aggregation instanceof NumericMetricsAggregation){
89-
handleNumericMetricAggregation(headers,lines.get(currentLineIndex),aggregation);
89+
handleNumericMetricAggregation(headers, lines.get(currentLineIndex), aggregation);
9090
return;
9191
}
92+
if(aggregation instanceof GeoBounds){
93+
handleGeoBoundsAggregation(headers, lines, (GeoBounds) aggregation);
94+
return;
95+
}
96+
if(aggregation instanceof TopHits){
97+
//todo: handle this . it returns hits... maby back to normal?
98+
//todo: read about this usages
99+
// TopHits topHitsAggregation = (TopHits) aggregation;
100+
}
92101
if(aggregation instanceof MultiBucketsAggregation){
93102
MultiBucketsAggregation bucketsAggregation = (MultiBucketsAggregation) aggregation;
94103
String name = bucketsAggregation.getName();
@@ -123,6 +132,20 @@ private void handleAggregations(Aggregations aggregations, List<String> headers
123132

124133
}
125134

135+
private void handleGeoBoundsAggregation(List<String> headers, List<List<String>> lines, GeoBounds geoBoundsAggregation) {
136+
String geoBoundAggName = geoBoundsAggregation.getName();
137+
headers.add(geoBoundAggName+".topLeft.lon");
138+
headers.add(geoBoundAggName+".topLeft.lat");
139+
headers.add(geoBoundAggName+".bottomRight.lon");
140+
headers.add(geoBoundAggName+".bottomRight.lat");
141+
List<String> line = lines.get(this.currentLineIndex);
142+
line.add(String.valueOf(geoBoundsAggregation.topLeft().getLon()));
143+
line.add(String.valueOf(geoBoundsAggregation.topLeft().getLat()));
144+
line.add(String.valueOf(geoBoundsAggregation.bottomRight().getLon()));
145+
line.add(String.valueOf(geoBoundsAggregation.bottomRight().getLat()));
146+
lines.add(line);
147+
}
148+
126149
private List<String> fillHeaderAndCreateLineForNumericAggregations(Aggregations aggregations, List<String> header) throws CsvExtractorException {
127150
List<String> line = new ArrayList<>();
128151
List<Aggregation> aggregationList = aggregations.asList();
@@ -241,7 +264,7 @@ private List<String> createHeadersAndFillDocsMap(boolean flat, SearchHit[] hits,
241264
}
242265
mergeHeaders(csvHeaders, doc, flat);
243266
if(this.includeScore){
244-
doc.put("_score",hit.score());
267+
doc.put("_score", hit.score());
245268
}
246269
if(this.includeType){
247270
doc.put("_type",hit.type());

src/main/java/org/nlpcn/es4sql/query/maker/AggMaker.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
2222
import org.elasticsearch.search.aggregations.metrics.MetricsAggregationBuilder;
2323
import org.elasticsearch.search.aggregations.metrics.ValuesSourceMetricsAggregationBuilder;
24+
import org.elasticsearch.search.aggregations.metrics.geobounds.GeoBoundsBuilder;
2425
import org.elasticsearch.search.aggregations.metrics.scripted.ScriptedMetricBuilder;
2526
import org.elasticsearch.search.aggregations.metrics.tophits.TopHitsBuilder;
2627
import org.elasticsearch.search.sort.SortOrder;
@@ -159,6 +160,8 @@ private AggregationBuilder<?> makeRangeGroup(MethodField field) throws SqlParseE
159160
aggregationBuilder = histogram(field);break;
160161
case "geohash_grid":
161162
aggregationBuilder = geohashGrid(field);break;
163+
case "geo_bounds":
164+
aggregationBuilder = geoBounds(field);break;
162165
case "terms":
163166
aggregationBuilder = termsAgg(field);break;
164167
default:
@@ -168,6 +171,30 @@ private AggregationBuilder<?> makeRangeGroup(MethodField field) throws SqlParseE
168171

169172
}
170173

174+
private AggregationBuilder<?> geoBounds(MethodField field) throws SqlParseException {
175+
String aggName = gettAggNameFromParamsOrAlias(field);
176+
GeoBoundsBuilder boundsBuilder = AggregationBuilders.geoBounds(aggName);
177+
String value = null;
178+
for (KVValue kv : field.getParams()) {
179+
value = kv.value.toString();
180+
switch (kv.key.toLowerCase()) {
181+
case "field":
182+
boundsBuilder.field(value);
183+
break;
184+
case "wrap_longitude":
185+
boundsBuilder.wrapLongitude(Boolean.getBoolean(value));
186+
break;
187+
case "alias":
188+
case "nested":
189+
case "reverse_nested":
190+
break;
191+
default:
192+
throw new SqlParseException("geo_bounds err or not define field " + kv.toString());
193+
}
194+
}
195+
return boundsBuilder;
196+
}
197+
171198
private AggregationBuilder<?> termsAgg(MethodField field) throws SqlParseException {
172199
String aggName = gettAggNameFromParamsOrAlias(field);
173200
TermsBuilder terms = AggregationBuilders.terms(aggName);

src/test/java/org/nlpcn/es4sql/AggregationTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.elasticsearch.search.aggregations.bucket.nested.InternalReverseNested;
1818
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
1919
import org.elasticsearch.search.aggregations.metrics.avg.Avg;
20+
import org.elasticsearch.search.aggregations.metrics.geobounds.InternalGeoBounds;
2021
import org.elasticsearch.search.aggregations.metrics.max.Max;
2122
import org.elasticsearch.search.aggregations.metrics.min.Min;
2223
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentiles;
@@ -439,6 +440,16 @@ public void geoHashGrid() throws SQLFeatureNotSupportedException, SqlParseExcept
439440
}
440441
}
441442

443+
@Test
444+
public void geoBounds() throws SQLFeatureNotSupportedException, SqlParseException {
445+
Aggregations result = query(String.format("SELECT * FROM %s/location GROUP BY geo_bounds(field='center',alias='bounds') ", TEST_INDEX));
446+
InternalGeoBounds bounds = result.get("bounds");
447+
Assert.assertEquals(0.5,bounds.bottomRight().getLat(),0.001);
448+
Assert.assertEquals(105.0,bounds.bottomRight().getLon(),0.001);
449+
Assert.assertEquals(5.0,bounds.topLeft().getLat(),0.001);
450+
Assert.assertEquals(100.5,bounds.topLeft().getLon(),0.001);
451+
}
452+
442453
@Test
443454
public void groupByOnNestedFieldTest() throws Exception {
444455
Aggregations result = query(String.format("SELECT COUNT(*) FROM %s/nestedType GROUP BY nested(message.info)", TEST_INDEX));

0 commit comments

Comments
 (0)