15
15
import org .elasticsearch .search .aggregations .bucket .histogram .DateHistogramBuilder ;
16
16
import org .elasticsearch .search .aggregations .bucket .histogram .Histogram ;
17
17
import org .elasticsearch .search .aggregations .bucket .histogram .HistogramBuilder ;
18
+ import org .elasticsearch .search .aggregations .bucket .nested .NestedBuilder ;
18
19
import org .elasticsearch .search .aggregations .bucket .range .RangeBuilder ;
19
20
import org .elasticsearch .search .aggregations .bucket .range .date .DateRangeBuilder ;
20
21
import org .elasticsearch .search .aggregations .bucket .terms .TermsBuilder ;
29
30
import org .nlpcn .es4sql .domain .MethodField ;
30
31
import org .nlpcn .es4sql .domain .Where ;
31
32
import org .nlpcn .es4sql .exception .SqlParseException ;
33
+ import org .nlpcn .es4sql .parse .NestedType ;
34
+ import org .nlpcn .es4sql .query .join .NestedLoopsElasticRequestBuilder ;
32
35
33
36
public class AggMaker {
34
37
@@ -74,32 +77,25 @@ public AbstractAggregationBuilder makeFieldAgg(MethodField field, AbstractAggreg
74
77
switch (field .getName ().toUpperCase ()) {
75
78
case "SUM" :
76
79
builder = AggregationBuilders .sum (field .getAlias ());
77
- addFieldOrScriptToAggregation (field , builder );
78
- return builder ;
80
+ return addFieldOrScriptToAggregation (field , builder );
79
81
case "MAX" :
80
82
builder = AggregationBuilders .max (field .getAlias ());
81
- addFieldOrScriptToAggregation (field , builder );
82
- return builder ;
83
+ return addFieldOrScriptToAggregation (field , builder );
83
84
case "MIN" :
84
85
builder = AggregationBuilders .min (field .getAlias ());
85
- addFieldOrScriptToAggregation (field , builder );
86
- return builder ;
86
+ return addFieldOrScriptToAggregation (field , builder );
87
87
case "AVG" :
88
88
builder = AggregationBuilders .avg (field .getAlias ());
89
- addFieldOrScriptToAggregation (field , builder );
90
- return builder ;
89
+ return addFieldOrScriptToAggregation (field , builder );
91
90
case "STATS" :
92
91
builder = AggregationBuilders .stats (field .getAlias ());
93
- addFieldOrScriptToAggregation (field , builder );
94
- return builder ;
92
+ return addFieldOrScriptToAggregation (field , builder );
95
93
case "EXTENDED_STATS" :
96
94
builder = AggregationBuilders .extendedStats (field .getAlias ());
97
- addFieldOrScriptToAggregation (field , builder );
98
- return builder ;
95
+ return addFieldOrScriptToAggregation (field , builder );
99
96
case "PERCENTILES" :
100
97
builder = AggregationBuilders .percentiles (field .getAlias ());
101
- addFieldOrScriptToAggregation (field , builder );
102
- return builder ;
98
+ return addFieldOrScriptToAggregation (field , builder );
103
99
case "TOPHITS" :
104
100
return makeTopHitsAgg (field );
105
101
case "SCRIPTED_METRIC" :
@@ -117,34 +113,40 @@ private String fixAlias(String alias) {
117
113
return alias .replaceAll ("\\ [" ,"(" ).replaceAll ("\\ ]" ,")" );
118
114
}
119
115
120
- private void addFieldOrScriptToAggregation (MethodField field , ValuesSourceMetricsAggregationBuilder builder ) {
116
+ private AbstractAggregationBuilder addFieldOrScriptToAggregation (MethodField field , ValuesSourceMetricsAggregationBuilder builder ) {
121
117
KVValue kvValue = field .getParams ().get (0 );
122
- if (kvValue .key ==null || !kvValue .key .equals ("script" ) )
123
- builder .field (kvValue .toString ());
124
- else
125
- {
118
+ if (kvValue .key !=null && kvValue .key .equals ("script" ) ){
126
119
//todo: support different lang script
127
- builder .script (((MethodField )kvValue .value ).getParams ().get (1 ).toString ());
120
+ return builder .script (((MethodField )kvValue .value ).getParams ().get (1 ).toString ());
128
121
}
122
+ else if (kvValue .key !=null && kvValue .key .equals ("nested" )){
123
+ NestedType nestedType = (NestedType ) kvValue .value ;
124
+ builder .field (nestedType .field );
125
+ return AggregationBuilders .nested (nestedType .field +"@NESTED" ).path (nestedType .path ).subAggregation (builder );
126
+ }
127
+ return builder .field (kvValue .toString ());
129
128
}
130
129
131
130
private AggregationBuilder <?> makeRangeGroup (MethodField field ) throws SqlParseException {
131
+
132
+ AggregationBuilder <?> aggregationBuilder ;
132
133
switch (field .getName ().toLowerCase ()) {
133
134
case "range" :
134
- return rangeBuilder (field );
135
+ aggregationBuilder = rangeBuilder (field ); break ;
135
136
case "date_histogram" :
136
- return dateHistogram (field );
137
+ aggregationBuilder = dateHistogram (field ); break ;
137
138
case "date_range" :
138
- return dateRange (field );
139
+ aggregationBuilder = dateRange (field ); break ;
139
140
case "month" :
140
- return dateRange (field );
141
+ aggregationBuilder = dateRange (field ); break ;
141
142
case "histogram" :
142
- return histogram (field );
143
+ aggregationBuilder = histogram (field ); break ;
143
144
case "geohash_grid" :
144
- return geohashGrid (field );
145
+ aggregationBuilder = geohashGrid (field ); break ;
145
146
default :
146
147
throw new SqlParseException ("can define this method " + field );
147
148
}
149
+ return aggregationBuilder ;
148
150
149
151
}
150
152
@@ -207,6 +209,7 @@ private AbstractAggregationBuilder scriptedMetric(MethodField field) throws SqlP
207
209
scriptedMetricBuilder .reduceScriptFile (paramValue );
208
210
break ;
209
211
case "alias" :
212
+ case "nested" :
210
213
break ;
211
214
default :
212
215
throw new SqlParseException ("scripted_metric err or not define field " + param .getKey ());
@@ -242,6 +245,7 @@ private AggregationBuilder<?> geohashGrid(MethodField field) throws SqlParseExce
242
245
geoHashGrid .shardSize (Integer .parseInt (value ));
243
246
break ;
244
247
case "alias" :
248
+ case "nested" :
245
249
break ;
246
250
default :
247
251
throw new SqlParseException ("geohash grid err or not define field " + kv .toString ());
@@ -323,6 +327,7 @@ private DateHistogramBuilder dateHistogram(MethodField field) throws SqlParseExc
323
327
dateHistogram .preOffset (value );
324
328
break ;
325
329
case "alias" :
330
+ case "nested" :
326
331
break ;
327
332
default :
328
333
throw new SqlParseException ("date range err or not define field " + kv .toString ());
@@ -362,6 +367,7 @@ private HistogramBuilder histogram(MethodField field) throws SqlParseException {
362
367
histogram .extendedBounds (Long .valueOf (bounds [0 ]), Long .valueOf (bounds [1 ]));
363
368
break ;
364
369
case "alias" :
370
+ case "nested" :
365
371
break ;
366
372
case "order" :
367
373
Histogram .Order order = null ;
@@ -455,7 +461,8 @@ private AbstractAggregationBuilder makeTopHitsAgg(MethodField field) {
455
461
topHits .setSize ((int ) kv .value );
456
462
break ;
457
463
case "alias" :
458
- break ;
464
+ case "nested" :
465
+ break ;
459
466
default :
460
467
topHits .addSort (kv .key , SortOrder .valueOf (kv .value .toString ().toUpperCase ()));
461
468
break ;
0 commit comments