Skip to content

Commit 079f403

Browse files
add telemetry for subquery in from command
1 parent 83353fb commit 079f403

File tree

4 files changed

+81
-0
lines changed

4 files changed

+81
-0
lines changed

x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/TelemetryIT.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,18 @@ public static Iterable<Object[]> parameters() {
190190
? Map.ofEntries(Map.entry("MAX", 1), Map.entry("TO_IP", 1), Map.entry("TO_STRING", 2))
191191
: Collections.emptyMap(),
192192
EsqlCapabilities.Cap.INLINE_STATS.isEnabled()
193+
) },
194+
new Object[] {
195+
new Test(
196+
"""
197+
FROM idx, (FROM idx | WHERE host =="127.0.0.1")
198+
| WHERE id > 10
199+
""",
200+
EsqlCapabilities.Cap.SUBQUERY_IN_FROM_COMMAND.isEnabled() ?
201+
Map.of("FROM", 2, "UNIONALL", 1, "WHERE", 2) :
202+
Collections.emptyMap(),
203+
Collections.emptyMap(),
204+
EsqlCapabilities.Cap.SUBQUERY_IN_FROM_COMMAND.isEnabled()
193205
) }
194206
);
195207
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,9 +376,14 @@ private LogicalPlan visitRelation(Source source, IndexMode indexMode, EsqlBasePa
376376
}
377377
}
378378

379+
if (remainingSubqueries.isEmpty()) {
380+
return unresolvedRelation;
381+
}
382+
379383
List<LogicalPlan> mainQueryAndSubqueries = new ArrayList<>(remainingSubqueries.size() + 1);
380384
if (table.indexPattern().isEmpty() == false) {
381385
mainQueryAndSubqueries.add(unresolvedRelation);
386+
telemetryAccounting(unresolvedRelation);
382387
}
383388
mainQueryAndSubqueries.addAll(remainingSubqueries);
384389

@@ -413,6 +418,7 @@ private List<Subquery> visitSubqueriesInFromCommand(List<EsqlBaseParser.Subquery
413418
List<Subquery> subqueries = new ArrayList<>();
414419
for (EsqlBaseParser.SubqueryContext ctx : ctxs) {
415420
LogicalPlan plan = visitSubquery(ctx);
421+
telemetryAccounting(plan);
416422
subqueries.add(new Subquery(source(ctx), plan));
417423
}
418424
return subqueries;
@@ -429,6 +435,7 @@ public LogicalPlan visitSubquery(EsqlBaseParser.SubqueryContext ctx) {
429435
LogicalPlan parent = from;
430436
for (PlanFactory processingCommand : processingCommands) {
431437
parent = processingCommand.apply(child);
438+
telemetryAccounting(child);
432439
child = parent;
433440
}
434441
return parent;

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/telemetry/VerifierMetricsTests.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public void testDissectQuery() {
7171
assertEquals(0, lookupJoinOnFields(c));
7272
assertEquals(0, lookupJoinOnExpression(c));
7373
assertEquals(0, inlineStats(c));
74+
assertEquals(0, subqueryInFromCommand(c));
7475
assertEquals(1, function("concat", c));
7576
}
7677

@@ -95,6 +96,7 @@ public void testEvalQuery() {
9596
assertEquals(0, lookupJoinOnFields(c));
9697
assertEquals(0, lookupJoinOnExpression(c));
9798
assertEquals(0, inlineStats(c));
99+
assertEquals(0, subqueryInFromCommand(c));
98100
assertEquals(1, function("length", c));
99101
}
100102

@@ -119,6 +121,7 @@ public void testGrokQuery() {
119121
assertEquals(0, lookupJoinOnFields(c));
120122
assertEquals(0, lookupJoinOnExpression(c));
121123
assertEquals(0, inlineStats(c));
124+
assertEquals(0, subqueryInFromCommand(c));
122125
assertEquals(1, function("concat", c));
123126
}
124127

@@ -143,6 +146,7 @@ public void testLimitQuery() {
143146
assertEquals(0, lookupJoinOnFields(c));
144147
assertEquals(0, lookupJoinOnExpression(c));
145148
assertEquals(0, inlineStats(c));
149+
assertEquals(0, subqueryInFromCommand(c));
146150
}
147151

148152
public void testSortQuery() {
@@ -166,6 +170,7 @@ public void testSortQuery() {
166170
assertEquals(0, lookupJoinOnFields(c));
167171
assertEquals(0, lookupJoinOnExpression(c));
168172
assertEquals(0, inlineStats(c));
173+
assertEquals(0, subqueryInFromCommand(c));
169174
}
170175

171176
public void testStatsQuery() {
@@ -189,6 +194,7 @@ public void testStatsQuery() {
189194
assertEquals(0, lookupJoinOnFields(c));
190195
assertEquals(0, lookupJoinOnExpression(c));
191196
assertEquals(0, inlineStats(c));
197+
assertEquals(0, subqueryInFromCommand(c));
192198
assertEquals(1, function("max", c));
193199
}
194200

@@ -213,6 +219,7 @@ public void testWhereQuery() {
213219
assertEquals(0, lookupJoinOnFields(c));
214220
assertEquals(0, lookupJoinOnExpression(c));
215221
assertEquals(0, inlineStats(c));
222+
assertEquals(0, subqueryInFromCommand(c));
216223
}
217224

218225
public void testTwoWhereQuery() {
@@ -236,6 +243,7 @@ public void testTwoWhereQuery() {
236243
assertEquals(0, lookupJoinOnFields(c));
237244
assertEquals(0, lookupJoinOnExpression(c));
238245
assertEquals(0, inlineStats(c));
246+
assertEquals(0, subqueryInFromCommand(c));
239247
}
240248

241249
public void testTwoQueriesExecuted() {
@@ -279,6 +287,7 @@ public void testTwoQueriesExecuted() {
279287
assertEquals(0, lookupJoinOnFields(c));
280288
assertEquals(0, lookupJoinOnExpression(c));
281289
assertEquals(0, inlineStats(c));
290+
assertEquals(0, subqueryInFromCommand(c));
282291

283292
assertEquals(1, function("length", c));
284293
assertEquals(1, function("concat", c));
@@ -366,6 +375,7 @@ public void testEnrich() {
366375
assertEquals(0, inlineStats(c));
367376
assertEquals(0, lookupJoinOnFields(c));
368377
assertEquals(0, lookupJoinOnExpression(c));
378+
assertEquals(0, subqueryInFromCommand(c));
369379
assertEquals(1, function("to_string", c));
370380
}
371381

@@ -399,6 +409,7 @@ public void testMvExpand() {
399409
assertEquals(0, inlineStats(c));
400410
assertEquals(0, lookupJoinOnFields(c));
401411
assertEquals(0, lookupJoinOnExpression(c));
412+
assertEquals(0, subqueryInFromCommand(c));
402413
}
403414

404415
public void testShowInfo() {
@@ -422,6 +433,7 @@ public void testShowInfo() {
422433
assertEquals(0, inlineStats(c));
423434
assertEquals(0, lookupJoinOnFields(c));
424435
assertEquals(0, lookupJoinOnExpression(c));
436+
assertEquals(0, subqueryInFromCommand(c));
425437
assertEquals(1, function("count", c));
426438
}
427439

@@ -446,6 +458,7 @@ public void testRow() {
446458
assertEquals(0, inlineStats(c));
447459
assertEquals(0, lookupJoinOnFields(c));
448460
assertEquals(0, lookupJoinOnExpression(c));
461+
assertEquals(0, subqueryInFromCommand(c));
449462
}
450463

451464
public void testDropAndRename() {
@@ -469,6 +482,7 @@ public void testDropAndRename() {
469482
assertEquals(0, inlineStats(c));
470483
assertEquals(0, lookupJoinOnFields(c));
471484
assertEquals(0, lookupJoinOnExpression(c));
485+
assertEquals(0, subqueryInFromCommand(c));
472486
assertEquals(1, function("count", c));
473487
}
474488

@@ -498,6 +512,7 @@ public void testKeep() {
498512
assertEquals(0, inlineStats(c));
499513
assertEquals(0, lookupJoinOnFields(c));
500514
assertEquals(0, lookupJoinOnExpression(c));
515+
assertEquals(0, subqueryInFromCommand(c));
501516
}
502517

503518
public void testCategorize() {
@@ -525,6 +540,7 @@ public void testCategorize() {
525540
assertEquals(0, inlineStats(c));
526541
assertEquals(0, lookupJoinOnFields(c));
527542
assertEquals(0, lookupJoinOnExpression(c));
543+
assertEquals(0, subqueryInFromCommand(c));
528544
assertEquals(1, function("count", c));
529545
assertEquals(1, function("categorize", c));
530546
}
@@ -554,6 +570,7 @@ public void testInlineStatsStandalone() {
554570
assertEquals(1L, inlineStats(c));
555571
assertEquals(0, lookupJoinOnFields(c));
556572
assertEquals(0, lookupJoinOnExpression(c));
573+
assertEquals(0, subqueryInFromCommand(c));
557574
assertEquals(1, function("max", c));
558575
}
559576

@@ -583,6 +600,7 @@ public void testInlineStatsWithOtherStats() {
583600
assertEquals(1L, inlineStats(c));
584601
assertEquals(0, lookupJoinOnFields(c));
585602
assertEquals(0, lookupJoinOnExpression(c));
603+
assertEquals(0, subqueryInFromCommand(c));
586604
assertEquals(1, function("max", c));
587605
}
588606

@@ -611,6 +629,7 @@ public void testBinaryPlanAfterStats() {
611629
assertEquals(0, inlineStats(c));
612630
assertEquals(1L, lookupJoinOnFields(c));
613631
assertEquals(0, lookupJoinOnExpression(c));
632+
assertEquals(0, subqueryInFromCommand(c));
614633
assertEquals(1, function("max", c));
615634
}
616635

@@ -644,6 +663,7 @@ public void testBinaryPlanAfterStatsExpressionJoin() {
644663
assertEquals(0, inlineStats(c));
645664
assertEquals(0, lookupJoinOnFields(c));
646665
assertEquals(1L, lookupJoinOnExpression(c));
666+
assertEquals(0, subqueryInFromCommand(c));
647667
assertEquals(1, function("max", c));
648668
}
649669

@@ -673,6 +693,7 @@ public void testBinaryPlanAfterInlineStats() {
673693
assertEquals(1L, inlineStats(c));
674694
assertEquals(1L, lookupJoinOnFields(c));
675695
assertEquals(0, lookupJoinOnExpression(c));
696+
assertEquals(0, subqueryInFromCommand(c));
676697
assertEquals(1, function("max", c));
677698
}
678699

@@ -700,6 +721,7 @@ public void testTimeSeriesAggregate() {
700721
assertEquals(0, inlineStats(c));
701722
assertEquals(0, lookupJoinOnFields(c));
702723
assertEquals(0, lookupJoinOnExpression(c));
724+
assertEquals(0, subqueryInFromCommand(c));
703725
assertEquals(1, function("sum", c));
704726
assertEquals(1, function("avg_over_time", c));
705727
}
@@ -728,6 +750,40 @@ public void testTimeSeriesNoAggregate() {
728750
assertEquals(0, inlineStats(c));
729751
assertEquals(0, lookupJoinOnFields(c));
730752
assertEquals(0, lookupJoinOnExpression(c));
753+
assertEquals(0, subqueryInFromCommand(c));
754+
}
755+
756+
public void testBinaryPlanAfterSubqueryInFromCommand() {
757+
assumeTrue("requires SUBQUERY IN FROM capability", EsqlCapabilities.Cap.SUBQUERY_IN_FROM_COMMAND.isEnabled());
758+
759+
Counters c = esql("""
760+
from employees
761+
, (from employees | stats max = max(salary) by languages)
762+
, (from employees | stats min = min(salary) by languages)
763+
| where min > 0 and max < 100000
764+
""");
765+
assertEquals(0, dissect(c));
766+
assertEquals(1L, eval(c));
767+
assertEquals(0, grok(c));
768+
assertEquals(0, limit(c));
769+
assertEquals(0, sort(c));
770+
assertEquals(1L, stats(c));
771+
assertEquals(1L, where(c));
772+
assertEquals(0, enrich(c));
773+
assertEquals(0, mvExpand(c));
774+
assertEquals(0, show(c));
775+
assertEquals(0, row(c));
776+
assertEquals(1L, from(c));
777+
assertEquals(0, ts(c));
778+
assertEquals(0, drop(c));
779+
assertEquals(0, keep(c));
780+
assertEquals(0, rename(c));
781+
assertEquals(0, inlineStats(c));
782+
assertEquals(0, lookupJoinOnFields(c));
783+
assertEquals(0, lookupJoinOnExpression(c));
784+
assertEquals(1L, subqueryInFromCommand(c));
785+
assertEquals(1L, function("max", c));
786+
assertEquals(1L, function("min", c));
731787
}
732788

733789
private long dissect(Counters c) {
@@ -806,6 +862,10 @@ private long lookupJoinOnExpression(Counters c) {
806862
return c.get(FEATURES_PREFIX + LOOKUP_JOIN_ON_EXPRESSION);
807863
}
808864

865+
private long subqueryInFromCommand(Counters c) {
866+
return c.get(FEATURES_PREFIX + FeatureMetric.SUBQUERY);
867+
}
868+
809869
private long function(String function, Counters c) {
810870
return c.get(FUNC_PREFIX + function);
811871
}

x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/60_usage.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ setup:
9696
- set: { esql.features.fuse: fuse_counter }
9797
- set: { esql.features.completion: completion_counter }
9898
- set: { esql.features.sample: sample_counter }
99+
- set: { esql.features.subquery: subquery_counter }
99100
- length: { esql.queries: 3 }
100101
- set: { esql.queries.rest.total: rest_total_counter }
101102
- set: { esql.queries.rest.failed: rest_failed_counter }
@@ -251,6 +252,7 @@ setup:
251252
- set: { esql.features.fuse: fuse_counter }
252253
- set: { esql.features.completion: completion_counter }
253254
- set: { esql.features.sample: sample_counter }
255+
- set: { esql.features.subquery: subquery_counter }
254256
- length: { esql.queries: 3 }
255257
- set: { esql.queries.rest.total: rest_total_counter }
256258
- set: { esql.queries.rest.failed: rest_failed_counter }

0 commit comments

Comments
 (0)