@@ -1132,6 +1132,85 @@ public void testAllCountVariantsWithHavingGenerateCorrectAggregations() {
1132
1132
+ "\" gap_policy\" :\" skip\" }}}}}" ));
1133
1133
}
1134
1134
1135
+ public void testGroupSelection () {
1136
+ {
1137
+ PhysicalPlan p = optimizeAndPlan ("SELECT EXTRACT(MINUTE FROM CONVERT(date, SQL_TIMESTAMP)) x FROM test GROUP BY x" );
1138
+ assertEquals (EsQueryExec .class , p .getClass ());
1139
+ assertEquals (1 , p .output ().size ());
1140
+ assertEquals ("x" , p .output ().get (0 ).qualifiedName ());
1141
+ assertEquals (DataType .INTEGER , p .output ().get (0 ).dataType ());
1142
+ assertThat (
1143
+ ((EsQueryExec ) p ).queryContainer ().aggs ().asAggBuilder ().toString ()
1144
+ .replaceAll ("\\ s+" , "" ),
1145
+ endsWith ("{\" source\" :\" InternalSqlScriptUtils.dateTimeChrono(" +
1146
+ "InternalSqlScriptUtils.docValue(doc,params.v0),params.v1,params.v2)\" ,\" lang\" :\" painless\" ," +
1147
+ "\" params\" :{\" v0\" :\" date\" ,\" v1\" :\" Z\" ,\" v2\" :\" MINUTE_OF_HOUR\" }}," +
1148
+ "\" missing_bucket\" :true,\" value_type\" :\" long\" ,\" order\" :\" asc\" }}}]}}}" )
1149
+ );
1150
+ }
1151
+ {
1152
+ PhysicalPlan p = optimizeAndPlan ("SELECT EXTRACT(HOUR FROM CONVERT(date, SQL_TIMESTAMP)) FROM test GROUP BY " +
1153
+ "EXTRACT(HOUR FROM CONVERT(date, SQL_TIMESTAMP))" );
1154
+ assertEquals (EsQueryExec .class , p .getClass ());
1155
+ assertEquals (1 , p .output ().size ());
1156
+ assertEquals ("EXTRACT(HOUR FROM CONVERT(date, SQL_TIMESTAMP))" , p .output ().get (0 ).qualifiedName ());
1157
+ assertEquals (DataType .INTEGER , p .output ().get (0 ).dataType ());
1158
+ assertThat (
1159
+ ((EsQueryExec ) p ).queryContainer ().aggs ().asAggBuilder ().toString ()
1160
+ .replaceAll ("\\ s+" , "" ),
1161
+ endsWith ("{\" source\" :\" InternalSqlScriptUtils.dateTimeChrono(" +
1162
+ "InternalSqlScriptUtils.docValue(doc,params.v0),params.v1,params.v2)\" ,\" lang\" :\" painless\" ," +
1163
+ "\" params\" :{\" v0\" :\" date\" ,\" v1\" :\" Z\" ,\" v2\" :\" HOUR_OF_DAY\" }},\" missing_bucket\" :true," +
1164
+ "\" value_type\" :\" long\" ,\" order\" :\" asc\" }}}]}}}" )
1165
+ );
1166
+ }
1167
+ {
1168
+ PhysicalPlan p = optimizeAndPlan ("SELECT PI() * int FROM test GROUP BY 1" );
1169
+ assertEquals (EsQueryExec .class , p .getClass ());
1170
+ assertEquals (1 , p .output ().size ());
1171
+ assertEquals ("PI() * int" , p .output ().get (0 ).qualifiedName ());
1172
+ assertEquals (DataType .DOUBLE , p .output ().get (0 ).dataType ());
1173
+ assertThat (
1174
+ ((EsQueryExec ) p ).queryContainer ().aggs ().asAggBuilder ().toString ()
1175
+ .replaceAll ("\\ s+" , "" ),
1176
+ endsWith ("{\" source\" :\" InternalSqlScriptUtils.mul(params.v0,InternalSqlScriptUtils.docValue(doc,params.v1))\" ," +
1177
+ "\" lang\" :\" painless\" ,\" params\" :{\" v0\" :3.141592653589793,\" v1\" :\" int\" }}," +
1178
+ "\" missing_bucket\" :true,\" value_type\" :\" double\" ,\" order\" :\" asc\" }}}]}}}" )
1179
+ );
1180
+ }
1181
+ {
1182
+ PhysicalPlan p = optimizeAndPlan ("SELECT date + 1 * INTERVAL '1' DAY FROM test GROUP BY 1" );
1183
+ assertEquals (EsQueryExec .class , p .getClass ());
1184
+ assertEquals (1 , p .output ().size ());
1185
+ assertEquals ("date + 1 * INTERVAL '1' DAY" , p .output ().get (0 ).qualifiedName ());
1186
+ assertEquals (DataType .DATETIME , p .output ().get (0 ).dataType ());
1187
+ assertThat (
1188
+ ((EsQueryExec ) p ).queryContainer ().aggs ().asAggBuilder ().toString ()
1189
+ .replaceAll ("\\ s+" , "" ),
1190
+ endsWith ("{\" source\" :\" InternalSqlScriptUtils.add(InternalSqlScriptUtils.docValue(doc,params.v0)," +
1191
+ "InternalSqlScriptUtils.intervalDayTime(params.v1,params.v2))\" ," +
1192
+ "\" lang\" :\" painless\" ,\" params\" :{\" v0\" :\" date\" ,\" v1\" :\" PT24H\" ,\" v2\" :\" INTERVAL_DAY\" }}," +
1193
+ "\" missing_bucket\" :true,\" value_type\" :\" long\" ,\" order\" :\" asc\" }}}]}}}" )
1194
+ );
1195
+ }
1196
+ {
1197
+ PhysicalPlan p = optimizeAndPlan ("select (3 < int) as multi_language, count(*) from test group by multi_language" );
1198
+ assertEquals (EsQueryExec .class , p .getClass ());
1199
+ assertEquals (2 , p .output ().size ());
1200
+ assertEquals ("multi_language" , p .output ().get (0 ).qualifiedName ());
1201
+ assertEquals (DataType .BOOLEAN , p .output ().get (0 ).dataType ());
1202
+ assertEquals ("count(*)" , p .output ().get (1 ).qualifiedName ());
1203
+ assertEquals (DataType .LONG , p .output ().get (1 ).dataType ());
1204
+ assertThat (
1205
+ ((EsQueryExec ) p ).queryContainer ().aggs ().asAggBuilder ().toString ()
1206
+ .replaceAll ("\\ s+" , "" ),
1207
+ endsWith ("{\" source\" :\" InternalSqlScriptUtils.gt(InternalSqlScriptUtils.docValue(doc,params.v0),params.v1)\" ," +
1208
+ "\" lang\" :\" painless\" ,\" params\" :{\" v0\" :\" int\" ,\" v1\" :3}}," +
1209
+ "\" missing_bucket\" :true,\" value_type\" :\" boolean\" ,\" order\" :\" asc\" }}}]}}}" )
1210
+ );
1211
+ }
1212
+ }
1213
+
1135
1214
public void testTopHitsAggregationWithOneArg () {
1136
1215
{
1137
1216
PhysicalPlan p = optimizeAndPlan ("SELECT FIRST(keyword) FROM test" );
0 commit comments