30
30
import static org .elasticsearch .xpack .sql .proto .Protocol .SQL_QUERY_REST_ENDPOINT ;
31
31
import static org .elasticsearch .xpack .sql .proto .Protocol .SQL_STATS_REST_ENDPOINT ;
32
32
import static org .elasticsearch .xpack .sql .proto .Protocol .SQL_TRANSLATE_REST_ENDPOINT ;
33
+ import static org .elasticsearch .xpack .sql .qa .rest .BaseRestSqlTestCase .toMap ;
33
34
import static org .elasticsearch .xpack .sql .qa .rest .RestSqlTestCase .query ;
34
35
35
36
public abstract class RestSqlUsageTestCase extends ESRestTestCase {
@@ -59,11 +60,14 @@ public String toString() {
59
60
60
61
private Map <String , Integer > baseMetrics = new HashMap <String , Integer >();
61
62
private Integer baseClientTypeTotalQueries = 0 ;
63
+ private Integer baseClientTypePagingQueries = 0 ;
62
64
private Integer baseClientTypeFailedQueries = 0 ;
63
65
private Integer baseAllTotalQueries = 0 ;
66
+ private Integer baseAllPagingQueries = 0 ;
64
67
private Integer baseAllFailedQueries = 0 ;
65
68
private Integer baseTranslateRequests = 0 ;
66
69
private String clientType ;
70
+ private String mode ;
67
71
private boolean ignoreClientType ;
68
72
69
73
/**
@@ -87,6 +91,16 @@ private void getBaseMetrics() throws UnsupportedOperationException, IOException
87
91
clientType = ClientType .REST .toString ();
88
92
}
89
93
94
+ if (clientType .equals (ClientType .JDBC .toString ())) {
95
+ mode = Mode .JDBC .toString ();
96
+ } else if (clientType .startsWith (ClientType .ODBC .toString ())) {
97
+ mode = Mode .ODBC .toString ();
98
+ } else if (clientType .equals (ClientType .CLI .toString ())) {
99
+ mode = Mode .CLI .toString ();
100
+ } else {
101
+ mode = Mode .PLAIN .toString ();
102
+ }
103
+
90
104
for (Map perNodeStats : nodesListStats ) {
91
105
Map featuresMetrics = (Map ) ((Map ) perNodeStats .get ("stats" )).get ("features" );
92
106
Map queriesMetrics = (Map ) ((Map ) perNodeStats .get ("stats" )).get ("queries" );
@@ -96,8 +110,10 @@ private void getBaseMetrics() throws UnsupportedOperationException, IOException
96
110
97
111
// initialize the "base" metric values with whatever values are already recorded on ES
98
112
baseClientTypeTotalQueries = ((Map <String , Integer >) queriesMetrics .get (clientType )).get ("total" );
113
+ baseClientTypePagingQueries = ((Map <String , Integer >) queriesMetrics .get (clientType )).get ("paging" );
99
114
baseClientTypeFailedQueries = ((Map <String , Integer >) queriesMetrics .get (clientType )).get ("failed" );
100
115
baseAllTotalQueries = ((Map <String , Integer >) queriesMetrics .get ("_all" )).get ("total" );
116
+ baseAllPagingQueries = ((Map <String , Integer >) queriesMetrics .get ("_all" )).get ("paging" );
101
117
baseAllFailedQueries = ((Map <String , Integer >) queriesMetrics .get ("_all" )).get ("failed" );
102
118
baseTranslateRequests = ((Map <String , Integer >) queriesMetrics .get ("translate" )).get ("count" );
103
119
}
@@ -224,6 +240,47 @@ public void testSqlRestUsage() throws IOException {
224
240
assertClientTypeAndAllQueryMetrics (clientTypeTotalQueries , allTotalQueries , responseAsMap );
225
241
}
226
242
243
+ public void testScrollUsage () throws IOException {
244
+ index (testData );
245
+
246
+ String cursor = runSql ("SELECT page_count, name FROM library ORDER BY page_count" , randomIntBetween (1 , testData .size ()));
247
+ int scrollRequests = 0 ;
248
+
249
+ while (cursor != null ) {
250
+ cursor = scroll (cursor );
251
+ scrollRequests ++;
252
+ }
253
+
254
+ Map <String , Object > responseAsMap = getStats ();
255
+ assertClientTypeQueryMetric (baseClientTypeTotalQueries + scrollRequests + 1 , responseAsMap , "total" );
256
+ assertClientTypeQueryMetric (baseClientTypePagingQueries + scrollRequests , responseAsMap , "paging" );
257
+
258
+ assertAllQueryMetric (baseAllTotalQueries + scrollRequests + 1 , responseAsMap , "total" );
259
+ assertAllQueryMetric (baseAllPagingQueries + scrollRequests , responseAsMap , "paging" );
260
+
261
+ assertFeatureMetric (baseMetrics .get ("orderby" ) + 1 , responseAsMap , "orderby" );
262
+ }
263
+
264
+ // test for bug https://github.com/elastic/elasticsearch/issues/81502
265
+ public void testUsageOfQuerySortedByAggregationResult () throws IOException {
266
+ index (testData );
267
+
268
+ String cursor = runSql ("SELECT SUM(page_count), name FROM library GROUP BY 2 ORDER BY 1" , 1 );
269
+
270
+ Map <String , Object > responseAsMap = getStats ();
271
+ assertClientTypeQueryMetric (baseClientTypeTotalQueries + 1 , responseAsMap , "total" );
272
+ assertClientTypeQueryMetric (baseClientTypePagingQueries , responseAsMap , "paging" );
273
+ assertAllQueryMetric (baseAllTotalQueries + 1 , responseAsMap , "total" );
274
+ assertAllQueryMetric (baseAllPagingQueries , responseAsMap , "paging" );
275
+
276
+ scroll (cursor );
277
+ responseAsMap = getStats ();
278
+ assertClientTypeQueryMetric (baseClientTypeTotalQueries + 2 , responseAsMap , "total" );
279
+ assertClientTypeQueryMetric (baseClientTypePagingQueries + 1 , responseAsMap , "paging" );
280
+ assertAllQueryMetric (baseAllTotalQueries + 2 , responseAsMap , "total" );
281
+ assertAllQueryMetric (baseAllPagingQueries + 1 , responseAsMap , "paging" );
282
+ }
283
+
227
284
private void assertClientTypeAndAllQueryMetrics (int clientTypeTotalQueries , int allTotalQueries , Map <String , Object > responseAsMap )
228
285
throws IOException {
229
286
assertClientTypeQueryMetric (clientTypeTotalQueries , responseAsMap , "total" );
@@ -277,17 +334,16 @@ private void runTranslate(String sql) throws IOException {
277
334
client ().performRequest (request );
278
335
}
279
336
280
- private void runSql (String sql ) throws IOException {
281
- Mode mode = Mode .PLAIN ;
282
- if (clientType .equals (ClientType .JDBC .toString ())) {
283
- mode = Mode .JDBC ;
284
- } else if (clientType .startsWith (ClientType .ODBC .toString ())) {
285
- mode = Mode .ODBC ;
286
- } else if (clientType .equals (ClientType .CLI .toString ())) {
287
- mode = Mode .CLI ;
288
- }
337
+ private String runSql (String sql ) throws IOException {
338
+ return runSql (sql , null );
339
+ }
289
340
290
- runSql (mode .toString (), clientType , sql );
341
+ private String scroll (String cursor ) throws IOException {
342
+ Request request = new Request ("POST" , SQL_QUERY_REST_ENDPOINT );
343
+ request .setEntity (
344
+ new StringEntity (RestSqlTestCase .cursor (cursor ).mode (mode ).clientId (clientType ).toString (), ContentType .APPLICATION_JSON )
345
+ );
346
+ return (String ) toMap (client ().performRequest (request ), mode ).get ("cursor" );
291
347
}
292
348
293
349
@ SuppressWarnings ({ "unchecked" , "rawtypes" })
@@ -302,7 +358,7 @@ private void assertTranslateQueryMetric(int expected, Map<String, Object> respon
302
358
assertEquals (expected , actualMetricValue );
303
359
}
304
360
305
- private void runSql (String mode , String restClient , String sql ) throws IOException {
361
+ private String runSql (String sql , Integer fetchSize ) throws IOException {
306
362
Request request = new Request ("POST" , SQL_QUERY_REST_ENDPOINT );
307
363
request .addParameter ("error_trace" , "true" ); // Helps with debugging in case something crazy happens on the server.
308
364
request .addParameter ("pretty" , "true" ); // Improves error reporting readability
@@ -318,11 +374,11 @@ private void runSql(String mode, String restClient, String sql) throws IOExcepti
318
374
}
319
375
request .setEntity (
320
376
new StringEntity (
321
- query (sql ).mode (mode ).clientId (ignoreClientType ? StringUtils .EMPTY : restClient ).toString (),
377
+ query (sql ).fetchSize ( fetchSize ). mode (mode ).clientId (ignoreClientType ? StringUtils .EMPTY : clientType ).toString (),
322
378
ContentType .APPLICATION_JSON
323
379
)
324
380
);
325
- client ().performRequest (request );
381
+ return ( String ) toMap ( client ().performRequest (request ), mode ). get ( "cursor" );
326
382
}
327
383
328
384
@ SuppressWarnings ({ "unchecked" , "rawtypes" })
0 commit comments