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

Skip to content

Commit cad5767

Browse files
committed
Add children support to aggregations.
1 parent d8af909 commit cad5767

File tree

5 files changed

+103
-7
lines changed

5 files changed

+103
-7
lines changed

src/main/java/org/nlpcn/es4sql/domain/MethodField.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,17 @@ public String getNestedPath() {
8181
}
8282
return this.getParamsAsMap().get("nested").toString();
8383
}
84+
85+
@Override
86+
public boolean isChildren() {
87+
Map<String, Object> paramsAsMap = this.getParamsAsMap();
88+
return paramsAsMap.containsKey("children");
89+
}
90+
91+
@Override
92+
public String getChildType() {
93+
if(!this.isChildren()) return null;
94+
95+
return this.getParamsAsMap().get("children").toString();
96+
}
8497
}

src/main/java/org/nlpcn/es4sql/parse/FieldMaker.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,21 @@ public static Field makeField(SQLExpr expr, String alias,String tableAlias) thro
3131
} else if (expr instanceof SQLAllColumnExpr) {
3232
} else if (expr instanceof SQLMethodInvokeExpr) {
3333
SQLMethodInvokeExpr mExpr = (SQLMethodInvokeExpr) expr;
34+
3435
String methodName = mExpr.getMethodName();
36+
3537
if(methodName.toLowerCase().equals("nested") ||methodName.toLowerCase().equals("reverse_nested") ){
3638
NestedType nestedType = new NestedType();
3739
if(nestedType.tryFillFromExpr(mExpr)){
3840
return handleIdentifier(nestedType, alias, tableAlias);
3941
}
4042
}
43+
if(methodName.toLowerCase().equals("children")){
44+
ChildrenType childrenType = new ChildrenType();
45+
if(childrenType.tryFillFromExpr(mExpr)){
46+
return handleIdentifier(childrenType, alias, tableAlias);
47+
}
48+
}
4149
else if (methodName.toLowerCase().equals("filter")){
4250
return makeFilterMethodField(mExpr,alias);
4351
}
@@ -83,9 +91,18 @@ private static Field makeFilterMethodField(SQLMethodInvokeExpr filterMethod,Stri
8391
private static Field handleIdentifier(NestedType nestedType, String alias, String tableAlias) {
8492
Field field = handleIdentifier(new SQLIdentifierExpr(nestedType.field), alias, tableAlias);
8593
field.setNested(nestedType);
94+
field.setChildren(null);
8695
return field;
8796
}
8897

98+
private static Field handleIdentifier(ChildrenType childrenType, String alias, String tableAlias) {
99+
Field field = handleIdentifier(new SQLIdentifierExpr(childrenType.field), alias, tableAlias);
100+
field.setNested(null);
101+
field.setChildren(childrenType);
102+
return field;
103+
}
104+
105+
89106
private static Field makeScriptMethodField(SQLBinaryOpExpr binaryExpr, String alias) throws SqlParseException {
90107
List<SQLExpr> params = new ArrayList<>();
91108

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

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import org.elasticsearch.action.search.SearchType;
99
import org.elasticsearch.client.Client;
1010
import org.elasticsearch.index.query.QueryBuilder;
11-
import org.elasticsearch.index.query.QueryBuilders;
1211
import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
1312
import org.elasticsearch.search.aggregations.AggregationBuilder;
1413
import org.elasticsearch.search.aggregations.AggregationBuilders;
@@ -62,15 +61,26 @@ public SqlElasticSearchRequestBuilder explain() throws SqlParseException {
6261
}
6362

6463
if(field.isNested()){
65-
6664
AggregationBuilder nestedBuilder = createNestedAggregation(field);
65+
6766
if(insertFilterIfExistsAfter(lastAgg, groupBy, nestedBuilder,1)){
6867
groupBy.remove(1);
6968
}
7069
else {
7170
nestedBuilder.subAggregation(lastAgg);
7271
}
72+
7373
request.addAggregation(wrapNestedIfNeeded(nestedBuilder,field.isReverseNested()));
74+
} else if(field.isChildren()) {
75+
AggregationBuilder childrenBuilder = createChildrenAggregation(field);
76+
77+
if(insertFilterIfExistsAfter(lastAgg, groupBy, childrenBuilder, 1)){
78+
groupBy.remove(1);
79+
}
80+
else {
81+
childrenBuilder.subAggregation(lastAgg);
82+
}
83+
request.addAggregation(wrapNestedIfNeeded(childrenBuilder, field.isChildren()));
7484
}
7585
else {
7686
request.addAggregation(lastAgg);
@@ -155,18 +165,33 @@ private AbstractAggregationBuilder wrapNestedIfNeeded(AggregationBuilder nestedB
155165

156166
private AggregationBuilder createNestedAggregation(Field field) {
157167
AggregationBuilder nestedBuilder;
168+
158169
String nestedPath = field.getNestedPath();
170+
159171
if(field.isReverseNested() ) {
160172
if(nestedPath == null || !nestedPath.startsWith("~"))
161173
return AggregationBuilders.reverseNested(getNestedAggName(field)).path(nestedPath);
162174
nestedPath = nestedPath.substring(1);
163175
}
176+
164177
nestedBuilder = AggregationBuilders.nested(getNestedAggName(field)).path(nestedPath);
178+
165179
return nestedBuilder;
166180
}
167181

182+
private AggregationBuilder createChildrenAggregation(Field field) {
183+
AggregationBuilder childrenBuilder;
184+
185+
String childType = field.getChildType();
186+
187+
childrenBuilder = AggregationBuilders.children(getChildrenAggName(field)).childType(childType);
188+
189+
return childrenBuilder;
190+
}
191+
168192
private String getNestedAggName(Field field) {
169193
String prefix;
194+
170195
if(field instanceof MethodField){
171196
String nestedPath = field.getNestedPath();
172197
if(nestedPath != null){
@@ -182,6 +207,25 @@ private String getNestedAggName(Field field) {
182207
return prefix + "@NESTED";
183208
}
184209

210+
private String getChildrenAggName(Field field) {
211+
String prefix;
212+
213+
if(field instanceof MethodField){
214+
String childType = field.getChildType();
215+
216+
if(childType != null){
217+
prefix = childType;
218+
}
219+
else {
220+
prefix = field.getAlias();
221+
}
222+
}
223+
else {
224+
prefix = field.getName();
225+
}
226+
227+
return prefix + "@CHILDREN";
228+
}
185229

186230
private boolean insertFilterIfExistsAfter(AggregationBuilder<?> agg, List<Field> groupBy, AggregationBuilder builder, int nextPosition) throws SqlParseException {
187231
if(groupBy.size() <= nextPosition) return false;

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@
2020
public abstract class QueryAction {
2121

2222
protected org.nlpcn.es4sql.domain.Query query;
23-
2423
protected Client client;
2524

26-
2725
public QueryAction(Client client, Query query) {
2826
this.client = client;
2927
this.query = query;
@@ -46,7 +44,6 @@ protected void updateRequestWithIndexAndRoutingOptions(Select select, SearchRequ
4644
}
4745
}
4846

49-
5047
protected void updateRequestWithHighlight(Select select, SearchRequestBuilder request) {
5148

5249
for(Hint hint : select.getHints()){
@@ -140,5 +137,4 @@ private char[] fromArrayListToCharArray(ArrayList arrayList){
140137
* @throws SqlParseException
141138
*/
142139
public abstract SqlElasticRequestBuilder explain() throws SqlParseException;
143-
144140
}

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

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.nlpcn.es4sql.domain.MethodField;
3535
import org.nlpcn.es4sql.domain.Where;
3636
import org.nlpcn.es4sql.exception.SqlParseException;
37+
import org.nlpcn.es4sql.parse.ChildrenType;
3738
import org.nlpcn.es4sql.parse.NestedType;
3839

3940
public class AggMaker {
@@ -144,9 +145,13 @@ private AbstractAggregationBuilder addFieldToAgg(MethodField field, ValuesSource
144145
}
145146
else if (kvValue.key!=null && ( kvValue.key.equals("nested") || kvValue.key.equals("reverse_nested")) ) {
146147
NestedType nestedType = (NestedType) kvValue.value;
148+
147149
builder.field(nestedType.field);
150+
148151
AggregationBuilder nestedBuilder;
152+
149153
String nestedAggName = nestedType.field + "@NESTED";
154+
150155
if (nestedType.isReverse()) {
151156
if (nestedType.path != null && nestedType.path.startsWith("~")) {
152157
String realPath = nestedType.path.substring(1);
@@ -159,8 +164,22 @@ else if (kvValue.key!=null && ( kvValue.key.equals("nested") || kvValue.key.equ
159164
} else {
160165
nestedBuilder = AggregationBuilders.nested(nestedAggName).path(nestedType.path);
161166
}
167+
162168
return nestedBuilder.subAggregation(builder);
163169
}
170+
else if (kvValue.key!=null && ( kvValue.key.equals("children"))) {
171+
ChildrenType childrenType = (ChildrenType) kvValue.value;
172+
173+
builder.field(childrenType.field);
174+
175+
AggregationBuilder childrenBuilder;
176+
177+
String childrenAggName = childrenType.field + "@CHILDREN";
178+
179+
childrenBuilder = AggregationBuilders.children(childrenAggName).childType(childrenType.childType);
180+
181+
return childrenBuilder;
182+
}
164183

165184
return builder.field(kvValue.toString());
166185
}
@@ -205,6 +224,7 @@ private AggregationBuilder<?> geoBounds(MethodField field) throws SqlParseExcept
205224
case "alias":
206225
case "nested":
207226
case "reverse_nested":
227+
case "children":
208228
break;
209229
default:
210230
throw new SqlParseException("geo_bounds err or not define field " + kv.toString());
@@ -235,6 +255,7 @@ private AggregationBuilder<?> termsAgg(MethodField field) throws SqlParseExcepti
235255
case "alias":
236256
case "nested":
237257
case "reverse_nested":
258+
case "children":
238259
break;
239260
default:
240261
throw new SqlParseException("terms aggregation err or not define field " + kv.toString());
@@ -305,6 +326,7 @@ private AbstractAggregationBuilder scriptedMetric(MethodField field) throws SqlP
305326
case "alias":
306327
case "nested":
307328
case "reverse_nested":
329+
case "children":
308330
break;
309331
default:
310332
throw new SqlParseException("scripted_metric err or not define field " + param.getKey());
@@ -340,6 +362,7 @@ private AggregationBuilder<?> geohashGrid(MethodField field) throws SqlParseExce
340362
case "alias":
341363
case "nested":
342364
case "reverse_nested":
365+
case "children":
343366
break;
344367
default:
345368
throw new SqlParseException("geohash grid err or not define field " + kv.toString());
@@ -370,7 +393,7 @@ private ValuesSourceAggregationBuilder<?> dateRange(MethodField field) {
370393
} else if ("to".equals(kv.key)) {
371394
dateRange.addUnboundedTo(kv.value);
372395
continue;
373-
} else if ("alias".equals(kv.key) || "nested".equals(kv.key)){
396+
} else if ("alias".equals(kv.key) || "nested".equals(kv.key) || "children".equals(kv.key)){
374397
continue;
375398
} else {
376399
ranges.add(value);
@@ -414,6 +437,7 @@ private DateHistogramBuilder dateHistogram(MethodField field) throws SqlParseExc
414437
case "alias":
415438
case "nested":
416439
case "reverse_nested":
440+
case "children":
417441
break;
418442
default:
419443
throw new SqlParseException("date range err or not define field " + kv.toString());
@@ -455,6 +479,7 @@ private HistogramBuilder histogram(MethodField field) throws SqlParseException {
455479
case "alias":
456480
case "nested":
457481
case "reverse_nested":
482+
case "children":
458483
break;
459484
case "order":
460485
Histogram.Order order = null;
@@ -551,6 +576,7 @@ private AbstractAggregationBuilder makeTopHitsAgg(MethodField field) {
551576
case "alias":
552577
case "nested":
553578
case "reverse_nested":
579+
case "children":
554580
break;
555581
default:
556582
topHits.addSort(kv.key, SortOrder.valueOf(kv.value.toString().toUpperCase()));

0 commit comments

Comments
 (0)