Skip to content

Commit c07d276

Browse files
committed
Make inlinestats "transparent" to EsqlSession.fieldNames
1 parent dbedc51 commit c07d276

File tree

6 files changed

+124
-42
lines changed

6 files changed

+124
-42
lines changed

x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/MultiClusterSpecIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ protected void shouldSkipTest(String testName) throws IOException {
127127
assumeFalse("INLINESTATS not yet supported in CCS", testCase.requiredCapabilities.contains(INLINESTATS.capabilityName()));
128128
assumeFalse("INLINESTATS not yet supported in CCS", testCase.requiredCapabilities.contains(INLINESTATS_V2.capabilityName()));
129129
assumeFalse("INLINESTATS not yet supported in CCS", testCase.requiredCapabilities.contains(JOIN_PLANNING_V1.capabilityName()));
130-
assumeFalse("INLINESTATS not yet supported in CCS", testCase.requiredCapabilities.contains(INLINESTATS_V5.capabilityName()));
130+
assumeFalse("INLINESTATS not yet supported in CCS", testCase.requiredCapabilities.contains(INLINESTATS_V7.capabilityName()));
131131
assumeFalse("LOOKUP JOIN not yet supported in CCS", testCase.requiredCapabilities.contains(JOIN_LOOKUP_V12.capabilityName()));
132132
// Unmapped fields require a coorect capability response from every cluster, which isn't currently implemented.
133133
assumeFalse("UNMAPPED FIELDS not yet supported in CCS", testCase.requiredCapabilities.contains(UNMAPPED_FIELDS.capabilityName()));

x-pack/plugin/esql/qa/testFixtures/src/main/resources/inlinestats.csv-spec

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
//
44

55
maxOfInt
6-
required_capability: inlinestats_v5
6+
required_capability: inlinestats_v7
77
// tag::max-languages[]
88
FROM employees
99
| KEEP emp_no, languages
@@ -25,7 +25,7 @@ emp_no:integer | languages:integer | max_lang:integer
2525
;
2626

2727
maxOfIntByKeyword
28-
required_capability: inlinestats_v5
28+
required_capability: inlinestats_v7
2929

3030
FROM employees
3131
| KEEP emp_no, languages, gender
@@ -43,7 +43,7 @@ emp_no:integer | languages:integer | max_lang:integer | gender:keyword
4343
;
4444

4545
maxOfLongByKeyword
46-
required_capability: inlinestats_v5
46+
required_capability: inlinestats_v7
4747

4848
FROM employees
4949
| KEEP emp_no, avg_worked_seconds, gender
@@ -58,7 +58,7 @@ emp_no:integer | avg_worked_seconds:long | max_avg_worked_seconds:long | gender:
5858
;
5959

6060
maxOfLong
61-
required_capability: inlinestats_v5
61+
required_capability: inlinestats_v7
6262

6363
FROM employees
6464
| KEEP emp_no, avg_worked_seconds, gender
@@ -71,7 +71,7 @@ emp_no:integer | avg_worked_seconds:long | gender:keyword | max_avg_worked_secon
7171
;
7272

7373
maxOfLongByCalculatedKeyword
74-
required_capability: inlinestats_v5
74+
required_capability: inlinestats_v7
7575

7676
// tag::longest-tenured-by-first[]
7777
FROM employees
@@ -94,7 +94,7 @@ emp_no:integer | avg_worked_seconds:long | last_name:keyword | max_avg_worked_se
9494
;
9595

9696
maxOfLongByCalculatedNamedKeyword
97-
required_capability: inlinestats_v5
97+
required_capability: inlinestats_v7
9898

9999
FROM employees
100100
| KEEP emp_no, avg_worked_seconds, last_name
@@ -113,7 +113,7 @@ emp_no:integer | avg_worked_seconds:long | last_name:keyword | max_avg_worked_se
113113
;
114114

115115
maxOfLongByCalculatedDroppedKeyword
116-
required_capability: inlinestats_v5
116+
required_capability: inlinestats_v7
117117

118118
FROM employees
119119
| INLINESTATS max_avg_worked_seconds = MAX(avg_worked_seconds) BY l = SUBSTRING(last_name, 0, 1)
@@ -132,7 +132,7 @@ emp_no:integer | avg_worked_seconds:long | last_name:keyword | max_avg_worked_se
132132
;
133133

134134
maxOfLongByEvaledKeyword
135-
required_capability: inlinestats_v5
135+
required_capability: inlinestats_v7
136136

137137
FROM employees
138138
| EVAL l = SUBSTRING(last_name, 0, 1)
@@ -152,7 +152,7 @@ emp_no:integer | avg_worked_seconds:long | max_avg_worked_seconds:long | l:keywo
152152
;
153153

154154
maxOfLongByInt
155-
required_capability: inlinestats_v5
155+
required_capability: inlinestats_v7
156156

157157
FROM employees
158158
| KEEP emp_no, avg_worked_seconds, languages
@@ -170,7 +170,7 @@ emp_no:integer | avg_worked_seconds:long | max_avg_worked_seconds:long | languag
170170
;
171171

172172
maxOfLongByIntDouble
173-
required_capability: inlinestats_v5
173+
required_capability: inlinestats_v7
174174

175175
FROM employees
176176
| KEEP emp_no, avg_worked_seconds, languages, height
@@ -244,7 +244,7 @@ abbrev:keyword | type:keyword | scalerank:integer | min_scalerank:integer
244244
;
245245

246246
byMvExpand
247-
required_capability: inlinestats_v5
247+
required_capability: inlinestats_v7
248248

249249
// tag::extreme-airports[]
250250
FROM airports
@@ -308,7 +308,7 @@ count:long | country:keyword | avg:double
308308
;
309309

310310
afterWhere
311-
required_capability: inlinestats_v5
311+
required_capability: inlinestats_v7
312312

313313
FROM airports
314314
| WHERE country != "United States"
@@ -346,8 +346,10 @@ abbrev:keyword | scalerank:keyword
346346
ACA | four
347347
;
348348

349-
afterEnrich-Ignore
349+
afterEnrich
350350
required_capability: join_planning_v1
351+
required_capability: inlinestats_v7
352+
required_capability: enrich_load
351353

352354
FROM airports
353355
| KEEP abbrev, city
@@ -360,14 +362,14 @@ FROM airports
360362
| LIMIT 3
361363
;
362364

363-
abbrev:keyword | city:keyword | region:text | "COUNT(*)":long
364-
ALA | Almaty | Жетісу ауданы | 2
365-
BXJ | Almaty | Жетісу ауданы | 2
366-
FUK | Fukuoka | 中央区 | 2
365+
abbrev:keyword | city:keyword | "COUNT(*)":long | region:text
366+
ALA | Almaty | 2 | Жетісу ауданы
367+
BXJ | Almaty | 2 | Жетісу ауданы
368+
FUK | Fukuoka | 2 | 中央区
367369
;
368370

369371
beforeStats
370-
required_capability: inlinestats_v5
372+
required_capability: inlinestats_v7
371373

372374
FROM airports
373375
| EVAL lat = ST_Y(location)
@@ -380,7 +382,7 @@ northern:long | southern:long
380382
;
381383

382384
beforeKeepSort
383-
required_capability: inlinestats_v5
385+
required_capability: inlinestats_v7
384386

385387
FROM employees
386388
| INLINESTATS max_salary = MAX(salary) by languages
@@ -427,6 +429,7 @@ abbrev:keyword | type:keyword | city:keyword | "COUNT(*)":long | region:te
427429

428430
beforeAndAfterEnrich-Ignore
429431
required_capability: join_planning_v1
432+
// does not fail, but it returns null for all values of count_region
430433

431434
FROM airports
432435
| KEEP abbrev, type, city
@@ -438,13 +441,12 @@ FROM airports
438441
| LIMIT 3
439442
;
440443

441-
abbrev:keyword | type:keyword | city:keyword | "COUNT(*)":long | region:text | count_region:long
442-
ABJ | mid | Abidjan | 499 | Abidjan | 1
443-
ABV | major | Abuja | 385 | Municipal Area Council | 1
444-
ACA | major | Acapulco de Juárez | 385 | Acapulco de Juárez | 1
444+
abbrev:keyword | city:keyword |"COUNT(*)":long | type:keyword | count_region:long | region:text
445+
ABJ |Abidjan |499 |mid | 1 |Abidjan
446+
ABV |Abuja |385 |major | 1 |Municipal Area Council
447+
ACA |Acapulco de Juárez|385 |major | 1 |Acapulco de Juárez
445448
;
446449

447-
448450
shadowing-Ignore
449451
required_capability: join_planning_v1
450452

@@ -501,7 +503,7 @@ Zürich | Zürich
501503
;
502504

503505
byConstant
504-
required_capability: inlinestats_v5
506+
required_capability: inlinestats_v7
505507

506508
FROM employees
507509
| KEEP emp_no, languages
@@ -520,7 +522,7 @@ emp_no:integer | languages:integer | max_lang:integer | y:integer
520522
;
521523

522524
aggConstant
523-
required_capability: inlinestats_v5
525+
required_capability: inlinestats_v7
524526

525527
FROM employees
526528
| KEEP emp_no
@@ -538,7 +540,7 @@ one:integer | emp_no:integer
538540
;
539541

540542
percentile
541-
required_capability: inlinestats_v5
543+
required_capability: inlinestats_v7
542544

543545
FROM employees
544546
| KEEP emp_no, salary
@@ -557,7 +559,7 @@ emp_no:integer | salary:integer | ninety_fifth_salary:double
557559
;
558560

559561
byTwoCalculated
560-
required_capability: inlinestats_v5
562+
required_capability: inlinestats_v7
561563

562564
FROM airports
563565
| WHERE abbrev IS NOT NULL
@@ -642,7 +644,7 @@ abbrev:keyword | scalerank:integer | location:geo_point
642644
;
643645

644646
groupShadowsField
645-
required_capability: inlinestats_v5
647+
required_capability: inlinestats_v7
646648

647649
FROM employees
648650
| KEEP emp_no, salary, hire_date
@@ -661,7 +663,7 @@ emp_no:integer | salary:integer | avg_salary:double | hire_date:datetime
661663
;
662664

663665
groupByExpression_And_ExistentField
664-
required_capability: inlinestats_v5
666+
required_capability: inlinestats_v7
665667
FROM employees
666668
| KEEP emp_no, languages, gender
667669
| EVAL x = "ABC"
@@ -679,7 +681,7 @@ emp_no:integer | languages:integer | x:keyword | max_lang:integer | y:keyword |
679681
;
680682

681683
groupByRenamedColumn
682-
required_capability: inlinestats_v5
684+
required_capability: inlinestats_v7
683685
FROM employees
684686
| KEEP emp_no, languages, gender
685687
| INLINESTATS max_lang = MAX(languages) BY y = gender
@@ -787,7 +789,7 @@ emp_no:integer | languages:integer | gender:keyword|max_lang:integer| y:keyword
787789
;
788790

789791
twoAggregatesGroupedBy_AField_And_AnExpression
790-
required_capability: inlinestats_v5
792+
required_capability: inlinestats_v7
791793

792794
FROM employees
793795
| KEEP emp_no, languages, gender, last_name
@@ -809,7 +811,7 @@ emp_no:integer |languages:integer|last_name:keyword|max_lang:integer|min_lang:in
809811
;
810812

811813
groupByMultipleRenamedColumns_InversedOrder
812-
required_capability: inlinestats_v5
814+
required_capability: inlinestats_v7
813815

814816
FROM employees
815817
| KEEP emp_no, languages, still_hired, gender
@@ -827,7 +829,7 @@ emp_no:integer |languages:integer|still_hired:boolean| gender:keyword|max_lang:i
827829
;
828830

829831
groupByMultipleRenamedColumns_InversedOrder_ComplexEval
830-
required_capability: inlinestats_v5
832+
required_capability: inlinestats_v7
831833

832834
FROM employees
833835
| KEEP emp_no, languages, still_hired, gender
@@ -846,7 +848,7 @@ emp_no:integer |languages:integer|still_hired:boolean| gender:keyword|multilingu
846848
;
847849

848850
groupByMultipleRenamedColumns_AndComplexEval
849-
required_capability: inlinestats_v5
851+
required_capability: inlinestats_v7
850852

851853
FROM employees
852854
| KEEP emp_no, languages, still_hired, gender
@@ -888,7 +890,7 @@ emp_no:integer |languages:integer|gender:keyword |first_name:keyword | x:keyw
888890
;
889891

890892
groupByRenamedExpression
891-
required_capability: inlinestats_v5
893+
required_capability: inlinestats_v7
892894

893895
FROM employees
894896
| KEEP emp_no, languages, gender, last_name

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -873,7 +873,7 @@ public enum Cap {
873873
* Fixes a series of issues with inlinestats which had an incomplete implementation after lookup and inlinestats
874874
* were refactored.
875875
*/
876-
INLINESTATS_V5(EsqlPlugin.INLINESTATS_FEATURE_FLAG),
876+
INLINESTATS_V7(EsqlPlugin.INLINESTATS_FEATURE_FLAG),
877877

878878
/**
879879
* Support partial_results

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlSession.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494

9595
import java.util.ArrayList;
9696
import java.util.HashMap;
97+
import java.util.HashSet;
9798
import java.util.Iterator;
9899
import java.util.List;
99100
import java.util.Map;
@@ -569,8 +570,18 @@ private void resolveInferences(
569570
}
570571

571572
static PreAnalysisResult fieldNames(LogicalPlan parsed, Set<String> enrichPolicyMatchFields, PreAnalysisResult result) {
572-
if (false == parsed.anyMatch(plan -> plan instanceof Aggregate || plan instanceof Project)) {
573+
List<LogicalPlan> inlinestats = parsed.collect(InlineStats.class::isInstance);
574+
Set<Aggregate> inlinestatsAggs = new HashSet<>();
575+
for (var i : inlinestats) {
576+
inlinestatsAggs.add(((InlineStats) i).aggregate());
577+
}
578+
579+
if (false == parsed.anyMatch(
580+
plan -> plan instanceof Project
581+
|| (plan instanceof Aggregate agg && (inlinestatsAggs.isEmpty() || inlinestatsAggs.contains(agg) == false))
582+
)) {
573583
// no explicit columns selection, for example "from employees"
584+
// also, inlinestats only adds columns to the existent output, its Aggregate shouldn't interfere with potentially using "*"
574585
return result.withFieldNames(IndexResolver.ALL_FIELDS);
575586
}
576587

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PropagateInlineEvalsTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public static void init() {
8383
* \_StubRelation[[emp_no{f}#11, languages{f}#14, gender{f}#13, y{r}#10]]
8484
*/
8585
public void testGroupingAliasingMoved_To_LeftSideOfJoin() {
86-
assumeTrue("Requires INLINESTATS", EsqlCapabilities.Cap.INLINESTATS_V5.isEnabled());
86+
assumeTrue("Requires INLINESTATS", EsqlCapabilities.Cap.INLINESTATS_V7.isEnabled());
8787
var plan = plan("""
8888
from test
8989
| keep emp_no, languages, gender
@@ -126,7 +126,7 @@ public void testGroupingAliasingMoved_To_LeftSideOfJoin() {
126126
* {r}#21]]
127127
*/
128128
public void testGroupingAliasingMoved_To_LeftSideOfJoin_WithExpression() {
129-
assumeTrue("Requires INLINESTATS", EsqlCapabilities.Cap.INLINESTATS_V5.isEnabled());
129+
assumeTrue("Requires INLINESTATS", EsqlCapabilities.Cap.INLINESTATS_V7.isEnabled());
130130
var plan = plan("""
131131
from test
132132
| keep emp_no, languages, gender, last_name, first_name

0 commit comments

Comments
 (0)