Skip to content

Commit 3a66990

Browse files
committed
better support for termsbuilder aggregation
1 parent 32cb792 commit 3a66990

File tree

4 files changed

+56
-4
lines changed

4 files changed

+56
-4
lines changed

src/main/java/org/nlpcn/es4sql/query/AggregationQueryAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public SqlElasticSearchRequestBuilder explain() throws SqlParseException {
8181
for (int i = 1; i < groupBy.size(); i++) {
8282
field = groupBy.get(i);
8383
AggregationBuilder<?> subAgg = aggMaker.makeGroupAgg(field);
84-
if (subAgg instanceof TermsBuilder) {
84+
if (subAgg instanceof TermsBuilder && !(field instanceof MethodField ) ) {
8585
((TermsBuilder) subAgg).size(0);
8686
}
8787

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,42 @@ private AggregationBuilder<?> makeRangeGroup(MethodField field) throws SqlParseE
159159
aggregationBuilder = histogram(field);break;
160160
case "geohash_grid":
161161
aggregationBuilder = geohashGrid(field);break;
162+
case "terms":
163+
aggregationBuilder = termsAgg(field);break;
162164
default:
163165
throw new SqlParseException("can define this method " + field);
164166
}
165167
return aggregationBuilder;
166168

167169
}
168170

171+
private AggregationBuilder<?> termsAgg(MethodField field) throws SqlParseException {
172+
String aggName = gettAggNameFromParamsOrAlias(field);
173+
TermsBuilder terms = AggregationBuilders.terms(aggName);
174+
String value = null;
175+
for (KVValue kv : field.getParams()) {
176+
value = kv.value.toString();
177+
switch (kv.key.toLowerCase()) {
178+
case "field":
179+
terms.field(value);
180+
break;
181+
case "size":
182+
terms.size(Integer.parseInt(value));
183+
break;
184+
case "shard_size":
185+
terms.shardSize(Integer.parseInt(value));
186+
break;
187+
case "alias":
188+
case "nested":
189+
case "reverse_nested":
190+
break;
191+
default:
192+
throw new SqlParseException("terms aggregation err or not define field " + kv.toString());
193+
}
194+
}
195+
return terms;
196+
}
197+
169198
private AbstractAggregationBuilder scriptedMetric(MethodField field) throws SqlParseException {
170199
String aggName = gettAggNameFromParamsOrAlias(field);
171200
ScriptedMetricBuilder scriptedMetricBuilder = AggregationBuilders.scriptedMetric(aggName);

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,30 @@ public void multipleGroupByTest() throws Exception {
224224
Assert.assertEquals(expectedAges, buckets.get("f"));
225225
}
226226

227+
@Test
228+
public void multipleGroupBysWithSize() throws Exception {
229+
Set expectedAges = new HashSet<Integer>(ContiguousSet.create(Range.closed(20, 40), DiscreteDomain.integers()));
227230

228-
@Test
231+
Map<String, Set<Integer>> buckets = new HashMap<>();
232+
233+
Aggregations result = query(String.format("SELECT COUNT(*) FROM %s/account GROUP BY gender, terms('alias'='ageAgg','field'='age','size'=3)", TEST_INDEX));
234+
Terms gender = result.get("gender");
235+
Assert.assertEquals(2,gender.getBuckets().size());
236+
for(Terms.Bucket genderBucket : gender.getBuckets()) {
237+
238+
String genderKey = genderBucket.getKey();
239+
buckets.put(genderKey, new HashSet<Integer>());
240+
Terms ageBuckets = genderBucket.getAggregations().get("ageAgg");
241+
Assert.assertEquals(3,ageBuckets.getBuckets().size());
242+
243+
}
244+
245+
246+
}
247+
248+
249+
250+
@Test
229251
public void orderByAscTest() throws IOException, SqlParseException, SQLFeatureNotSupportedException {
230252
ArrayList<Long> agesCount = new ArrayList<>();
231253

@@ -345,7 +367,8 @@ private SqlElasticSearchRequestBuilder getSearchRequestBuilder(String query) thr
345367
@Test
346368
public void testSubAggregations() throws Exception {
347369
Set expectedAges = new HashSet<>(ContiguousSet.create(Range.closed(20, 40), DiscreteDomain.integers()));
348-
final String query = String.format("SELECT /*! DOCS_WITH_AGGREGATION(10) */ * FROM %s/account GROUP BY (gender, age), (state) LIMIT 0,10", TEST_INDEX);
370+
final String query = String.format("SELECT /*! DOCS_WITH_AGGREGATION(10) */" +
371+
" * FROM %s/account GROUP BY (gender, age), (state) LIMIT 0,10", TEST_INDEX);
349372

350373
Map<String, Set<Integer>> buckets = new HashMap<>();
351374

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ public void fieldsAsNumbersOnWhere() throws SqlParseException {
768768
Where where = wheres.get(0);
769769
Assert.assertEquals(Condition.class,where.getClass());
770770
Condition condition = (Condition) where;
771-
int i=1;
771+
Assert.assertEquals("3", condition.getName());
772772
}
773773

774774
private SQLExpr queryToExpr(String query) {

0 commit comments

Comments
 (0)