21
21
import org .elasticsearch .search .aggregations .bucket .range .RangeBuilder ;
22
22
import org .elasticsearch .search .aggregations .bucket .range .date .DateRangeBuilder ;
23
23
import org .elasticsearch .search .aggregations .bucket .terms .TermsBuilder ;
24
- import org .elasticsearch .search .aggregations .metrics .MetricsAggregationBuilder ;
25
24
import org .elasticsearch .search .aggregations .metrics .ValuesSourceMetricsAggregationBuilder ;
26
25
import org .elasticsearch .search .aggregations .metrics .scripted .ScriptedMetricBuilder ;
27
26
import org .elasticsearch .search .aggregations .metrics .tophits .TopHitsBuilder ;
32
31
import org .nlpcn .es4sql .domain .MethodField ;
33
32
import org .nlpcn .es4sql .domain .Where ;
34
33
import org .nlpcn .es4sql .exception .SqlParseException ;
34
+ import org .nlpcn .es4sql .parse .NestedType ;
35
35
36
36
public class AggMaker {
37
37
@@ -77,32 +77,25 @@ public AbstractAggregationBuilder makeFieldAgg(MethodField field, AbstractAggreg
77
77
switch (field .getName ().toUpperCase ()) {
78
78
case "SUM" :
79
79
builder = AggregationBuilders .sum (field .getAlias ());
80
- addFieldOrScriptToAggregation (field , builder );
81
- return builder ;
80
+ return addFieldToAgg (field , builder );
82
81
case "MAX" :
83
82
builder = AggregationBuilders .max (field .getAlias ());
84
- addFieldOrScriptToAggregation (field , builder );
85
- return builder ;
83
+ return addFieldToAgg (field , builder );
86
84
case "MIN" :
87
85
builder = AggregationBuilders .min (field .getAlias ());
88
- addFieldOrScriptToAggregation (field , builder );
89
- return builder ;
86
+ return addFieldToAgg (field , builder );
90
87
case "AVG" :
91
88
builder = AggregationBuilders .avg (field .getAlias ());
92
- addFieldOrScriptToAggregation (field , builder );
93
- return builder ;
89
+ return addFieldToAgg (field , builder );
94
90
case "STATS" :
95
91
builder = AggregationBuilders .stats (field .getAlias ());
96
- addFieldOrScriptToAggregation (field , builder );
97
- return builder ;
92
+ return addFieldToAgg (field , builder );
98
93
case "EXTENDED_STATS" :
99
94
builder = AggregationBuilders .extendedStats (field .getAlias ());
100
- addFieldOrScriptToAggregation (field , builder );
101
- return builder ;
95
+ return addFieldToAgg (field , builder );
102
96
case "PERCENTILES" :
103
97
builder = AggregationBuilders .percentiles (field .getAlias ());
104
- addFieldOrScriptToAggregation (field , builder );
105
- return builder ;
98
+ return addFieldToAgg (field , builder );
106
99
case "TOPHITS" :
107
100
return makeTopHitsAgg (field );
108
101
case "SCRIPTED_METRIC" :
@@ -120,15 +113,20 @@ private String fixAlias(String alias) {
120
113
return alias .replaceAll ("\\ [" ,"(" ).replaceAll ("\\ ]" ,")" );
121
114
}
122
115
123
- private void addFieldOrScriptToAggregation (MethodField field , ValuesSourceMetricsAggregationBuilder builder ) {
116
+ private AbstractAggregationBuilder addFieldToAgg (MethodField field , ValuesSourceMetricsAggregationBuilder builder ) {
124
117
KVValue kvValue = field .getParams ().get (0 );
125
- if (kvValue .key ==null || !kvValue .key .equals ("script" ) )
126
- builder .field (kvValue .toString ());
127
- else
118
+ if (kvValue .key != null && kvValue .key .equals ("script" )){
119
+ return builder .script (new Script (((MethodField ) kvValue .value ).getParams ().get (1 ).toString ()));
120
+ }
121
+ else if (kvValue .key != null && kvValue .key .equals ("nested" ))
128
122
{
129
- //todo: support different lang script
130
- builder .script (new Script (((MethodField )kvValue .value ).getParams ().get (1 ).toString ()));
123
+ NestedType nestedType = (NestedType ) kvValue .value ;
124
+ builder .field (nestedType .field );
125
+ return AggregationBuilders .nested (nestedType .field +"@NESTED" ).path (nestedType .path ).subAggregation (builder );
126
+
131
127
}
128
+
129
+ return builder .field (kvValue .toString ());
132
130
}
133
131
134
132
private AggregationBuilder <?> makeRangeGroup (MethodField field ) throws SqlParseException {
@@ -178,39 +176,40 @@ private AbstractAggregationBuilder scriptedMetric(MethodField field) throws SqlP
178
176
scriptedMetricBuilder .mapScript (new Script (paramValue ));
179
177
break ;
180
178
case "map_script_id" :
181
- scriptedMetricBuilder .mapScript (new Script (paramValue , ScriptService .ScriptType .INDEXED ,null ,null ));
179
+ scriptedMetricBuilder .mapScript (new Script (paramValue , ScriptService .ScriptType .INDEXED , null , null ));
182
180
break ;
183
181
case "map_script_file" :
184
- scriptedMetricBuilder .mapScript (new Script (paramValue , ScriptService .ScriptType .FILE ,null ,null ));
182
+ scriptedMetricBuilder .mapScript (new Script (paramValue , ScriptService .ScriptType .FILE , null , null ));
185
183
break ;
186
184
case "init_script" :
187
185
scriptedMetricBuilder .initScript (new Script (paramValue ));
188
186
break ;
189
187
case "init_script_id" :
190
- scriptedMetricBuilder .initScript (new Script (paramValue , ScriptService .ScriptType .INDEXED ,null ,null ));
188
+ scriptedMetricBuilder .initScript (new Script (paramValue , ScriptService .ScriptType .INDEXED , null , null ));
191
189
break ;
192
190
case "init_script_file" :
193
- scriptedMetricBuilder .initScript (new Script (paramValue , ScriptService .ScriptType .FILE ,null ,null ));
191
+ scriptedMetricBuilder .initScript (new Script (paramValue , ScriptService .ScriptType .FILE , null , null ));
194
192
break ;
195
193
case "combine_script" :
196
194
scriptedMetricBuilder .combineScript (new Script (paramValue ));
197
195
break ;
198
196
case "combine_script_id" :
199
- scriptedMetricBuilder .combineScript (new Script (paramValue , ScriptService .ScriptType .INDEXED ,null ,null ));
197
+ scriptedMetricBuilder .combineScript (new Script (paramValue , ScriptService .ScriptType .INDEXED , null , null ));
200
198
break ;
201
199
case "combine_script_file" :
202
- scriptedMetricBuilder .combineScript (new Script (paramValue , ScriptService .ScriptType .FILE ,null ,null ));
200
+ scriptedMetricBuilder .combineScript (new Script (paramValue , ScriptService .ScriptType .FILE , null , null ));
203
201
break ;
204
202
case "reduce_script" :
205
203
scriptedMetricBuilder .reduceScript (new Script (paramValue , ScriptService .ScriptType .INLINE ,null ,reduceScriptAdditionalParams ));
206
204
break ;
207
205
case "reduce_script_id" :
208
- scriptedMetricBuilder .reduceScript (new Script (paramValue , ScriptService .ScriptType .INDEXED ,null ,reduceScriptAdditionalParams ));
206
+ scriptedMetricBuilder .reduceScript (new Script (paramValue , ScriptService .ScriptType .INDEXED , null , reduceScriptAdditionalParams ));
209
207
break ;
210
208
case "reduce_script_file" :
211
- scriptedMetricBuilder .reduceScript (new Script (paramValue , ScriptService .ScriptType .FILE ,null ,reduceScriptAdditionalParams ));
209
+ scriptedMetricBuilder .reduceScript (new Script (paramValue , ScriptService .ScriptType .FILE , null , reduceScriptAdditionalParams ));
212
210
break ;
213
211
case "alias" :
212
+ case "nested" :
214
213
break ;
215
214
default :
216
215
throw new SqlParseException ("scripted_metric err or not define field " + param .getKey ());
@@ -244,6 +243,7 @@ private AggregationBuilder<?> geohashGrid(MethodField field) throws SqlParseExce
244
243
geoHashGrid .shardSize (Integer .parseInt (value ));
245
244
break ;
246
245
case "alias" :
246
+ case "nested" :
247
247
break ;
248
248
default :
249
249
throw new SqlParseException ("geohash grid err or not define field " + kv .toString ());
@@ -274,7 +274,7 @@ private ValuesSourceAggregationBuilder<?> dateRange(MethodField field) {
274
274
} else if ("to" .equals (kv .key )) {
275
275
dateRange .addUnboundedTo (kv .value );
276
276
continue ;
277
- } else if ("alias" .equals (kv .key )){
277
+ } else if ("alias" .equals (kv .key ) || "nested" . equals ( kv . key ) ){
278
278
continue ;
279
279
} else {
280
280
ranges .add (value );
@@ -316,6 +316,7 @@ private DateHistogramBuilder dateHistogram(MethodField field) throws SqlParseExc
316
316
break ;
317
317
318
318
case "alias" :
319
+ case "nested" :
319
320
break ;
320
321
default :
321
322
throw new SqlParseException ("date range err or not define field " + kv .toString ());
@@ -355,6 +356,7 @@ private HistogramBuilder histogram(MethodField field) throws SqlParseException {
355
356
histogram .extendedBounds (Long .valueOf (bounds [0 ]), Long .valueOf (bounds [1 ]));
356
357
break ;
357
358
case "alias" :
359
+ case "nested" :
358
360
break ;
359
361
case "order" :
360
362
Histogram .Order order = null ;
@@ -448,7 +450,8 @@ private AbstractAggregationBuilder makeTopHitsAgg(MethodField field) {
448
450
topHits .setSize ((int ) kv .value );
449
451
break ;
450
452
case "alias" :
451
- break ;
453
+ case "nested" :
454
+ break ;
452
455
default :
453
456
topHits .addSort (kv .key , SortOrder .valueOf (kv .value .toString ().toUpperCase ()));
454
457
break ;
0 commit comments