7
7
8
8
package org .elasticsearch .xpack .esql .optimizer ;
9
9
10
- import com .carrotsearch .randomizedtesting .annotations .ParametersFactory ;
11
-
12
10
import org .apache .lucene .search .IndexSearcher ;
13
11
import org .elasticsearch .common .network .NetworkAddress ;
14
- import org .elasticsearch .common .settings .Settings ;
15
12
import org .elasticsearch .common .unit .Fuzziness ;
16
- import org .elasticsearch .core .Tuple ;
17
13
import org .elasticsearch .index .IndexMode ;
18
14
import org .elasticsearch .index .mapper .MapperService ;
19
- import org .elasticsearch .index .mapper .MapperServiceTestCase ;
20
15
import org .elasticsearch .index .mapper .ParsedDocument ;
21
16
import org .elasticsearch .index .query .BoolQueryBuilder ;
22
17
import org .elasticsearch .index .query .MatchQueryBuilder ;
26
21
import org .elasticsearch .index .query .QueryStringQueryBuilder ;
27
22
import org .elasticsearch .index .query .RangeQueryBuilder ;
28
23
import org .elasticsearch .index .query .SearchExecutionContext ;
29
- import org .elasticsearch .license .XPackLicenseState ;
30
24
import org .elasticsearch .search .vectors .KnnVectorQueryBuilder ;
31
25
import org .elasticsearch .search .vectors .RescoreVectorBuilder ;
32
26
import org .elasticsearch .test .VersionUtils ;
33
- import org .elasticsearch .xpack .core .enrich .EnrichPolicy ;
34
27
import org .elasticsearch .xpack .esql .EsqlTestUtils ;
35
28
import org .elasticsearch .xpack .esql .EsqlTestUtils .TestSearchStats ;
36
29
import org .elasticsearch .xpack .esql .VerificationException ;
37
30
import org .elasticsearch .xpack .esql .action .EsqlCapabilities ;
38
31
import org .elasticsearch .xpack .esql .analysis .Analyzer ;
39
- import org .elasticsearch .xpack .esql .analysis .AnalyzerContext ;
40
- import org .elasticsearch .xpack .esql .analysis .EnrichResolution ;
41
- import org .elasticsearch .xpack .esql .analysis .Verifier ;
42
32
import org .elasticsearch .xpack .esql .core .expression .Alias ;
43
33
import org .elasticsearch .xpack .esql .core .expression .Attribute ;
44
34
import org .elasticsearch .xpack .esql .core .expression .Expression ;
50
40
import org .elasticsearch .xpack .esql .core .expression .ReferenceAttribute ;
51
41
import org .elasticsearch .xpack .esql .core .tree .Source ;
52
42
import org .elasticsearch .xpack .esql .core .type .DataType ;
53
- import org .elasticsearch .xpack .esql .core .type .EsField ;
54
43
import org .elasticsearch .xpack .esql .core .type .MultiTypeEsField ;
55
44
import org .elasticsearch .xpack .esql .core .util .Holder ;
56
- import org .elasticsearch .xpack .esql .enrich .ResolvedEnrichPolicy ;
57
45
import org .elasticsearch .xpack .esql .expression .Order ;
58
- import org .elasticsearch .xpack .esql .expression .function .EsqlFunctionRegistry ;
59
46
import org .elasticsearch .xpack .esql .expression .function .UnsupportedAttribute ;
60
47
import org .elasticsearch .xpack .esql .expression .function .aggregate .Count ;
61
48
import org .elasticsearch .xpack .esql .expression .function .aggregate .Min ;
69
56
import org .elasticsearch .xpack .esql .expression .predicate .logical .Or ;
70
57
import org .elasticsearch .xpack .esql .expression .predicate .operator .comparison .GreaterThan ;
71
58
import org .elasticsearch .xpack .esql .expression .predicate .operator .comparison .GreaterThanOrEqual ;
72
- import org .elasticsearch .xpack .esql .index .EsIndex ;
73
59
import org .elasticsearch .xpack .esql .index .IndexResolution ;
74
60
import org .elasticsearch .xpack .esql .optimizer .rules .logical .ExtractAggregateCommonFilter ;
75
61
import org .elasticsearch .xpack .esql .parser .ParsingException ;
76
- import org .elasticsearch .xpack .esql .plan .logical .Enrich ;
77
62
import org .elasticsearch .xpack .esql .plan .logical .EsRelation ;
78
63
import org .elasticsearch .xpack .esql .plan .logical .LogicalPlan ;
79
64
import org .elasticsearch .xpack .esql .plan .physical .AggregateExec ;
95
80
import org .elasticsearch .xpack .esql .plan .physical .PhysicalPlan ;
96
81
import org .elasticsearch .xpack .esql .plan .physical .ProjectExec ;
97
82
import org .elasticsearch .xpack .esql .plan .physical .TopNExec ;
98
- import org .elasticsearch .xpack .esql .planner .FilterTests ;
99
83
import org .elasticsearch .xpack .esql .plugin .EsqlFlags ;
100
- import org .elasticsearch .xpack .esql .plugin .QueryPragmas ;
101
84
import org .elasticsearch .xpack .esql .querydsl .query .SingleValueQuery ;
102
85
import org .elasticsearch .xpack .esql .rule .Rule ;
103
86
import org .elasticsearch .xpack .esql .rule .RuleExecutor ;
104
87
import org .elasticsearch .xpack .esql .session .Configuration ;
105
88
import org .elasticsearch .xpack .esql .stats .SearchContextStats ;
106
89
import org .elasticsearch .xpack .esql .stats .SearchStats ;
107
- import org .elasticsearch .xpack .esql .telemetry .Metrics ;
108
90
import org .elasticsearch .xpack .esql .type .EsqlDataTypeConverter ;
109
91
import org .elasticsearch .xpack .kql .query .KqlQueryBuilder ;
110
- import org .junit .Before ;
111
92
112
93
import java .io .IOException ;
113
94
import java .util .ArrayList ;
120
101
import java .util .function .BiFunction ;
121
102
import java .util .function .Function ;
122
103
123
- import static java .util .Arrays .asList ;
124
104
import static org .elasticsearch .compute .aggregation .AggregatorMode .FINAL ;
125
105
import static org .elasticsearch .index .query .QueryBuilders .boolQuery ;
126
106
import static org .elasticsearch .index .query .QueryBuilders .existsQuery ;
129
109
import static org .elasticsearch .index .query .QueryBuilders .termQuery ;
130
110
import static org .elasticsearch .index .query .QueryBuilders .termsQuery ;
131
111
import static org .elasticsearch .xpack .esql .EsqlTestUtils .TEST_PLANNER_SETTINGS ;
132
- import static org .elasticsearch .xpack .esql .EsqlTestUtils .TEST_VERIFIER ;
133
112
import static org .elasticsearch .xpack .esql .EsqlTestUtils .as ;
134
- import static org .elasticsearch .xpack .esql .EsqlTestUtils .configuration ;
135
- import static org .elasticsearch .xpack .esql .EsqlTestUtils .emptyInferenceResolution ;
136
- import static org .elasticsearch .xpack .esql .EsqlTestUtils .loadMapping ;
137
113
import static org .elasticsearch .xpack .esql .EsqlTestUtils .unboundLogicalOptimizerContext ;
138
- import static org .elasticsearch .xpack .esql .EsqlTestUtils .withDefaultLimitWarning ;
139
- import static org .elasticsearch .xpack .esql .analysis .AnalyzerTestUtils .defaultLookupResolution ;
140
114
import static org .elasticsearch .xpack .esql .analysis .AnalyzerTestUtils .indexWithDateDateNanosUnionType ;
141
115
import static org .elasticsearch .xpack .esql .core .querydsl .query .Query .unscore ;
142
116
import static org .elasticsearch .xpack .esql .core .type .DataType .DATE_NANOS ;
153
127
import static org .hamcrest .Matchers .nullValue ;
154
128
155
129
//@TestLogging(value = "org.elasticsearch.xpack.esql:TRACE,org.elasticsearch.compute:TRACE", reason = "debug")
156
- public class LocalPhysicalPlanOptimizerTests extends MapperServiceTestCase {
130
+ public class LocalPhysicalPlanOptimizerTests extends AbstractLocalPhysicalPlanOptimizerTests {
157
131
158
132
public static final List <DataType > UNNECESSARY_CASTING_DATA_TYPES = List .of (
159
133
DataType .BOOLEAN ,
@@ -163,7 +137,6 @@ public class LocalPhysicalPlanOptimizerTests extends MapperServiceTestCase {
163
137
DataType .KEYWORD ,
164
138
DataType .TEXT
165
139
);
166
- private static final String PARAM_FORMATTING = "%1$s" ;
167
140
168
141
/**
169
142
* Estimated size of a keyword field in bytes.
@@ -172,11 +145,6 @@ public class LocalPhysicalPlanOptimizerTests extends MapperServiceTestCase {
172
145
public static final String MATCH_OPERATOR_QUERY = "from test | where %s:%s" ;
173
146
public static final String MATCH_FUNCTION_QUERY = "from test | where match(%s, %s)" ;
174
147
175
- protected TestPlannerOptimizer plannerOptimizer ;
176
- private TestPlannerOptimizer plannerOptimizerDateDateNanosUnionTypes ;
177
- private Analyzer timeSeriesAnalyzer ;
178
- protected TestPlannerOptimizer plannerOptimizerTimeSeries ;
179
- private final Configuration config ;
180
148
private final SearchStats IS_SV_STATS = new TestSearchStats () {
181
149
@ Override
182
150
public boolean isSingleValue (FieldAttribute .FieldName field ) {
@@ -196,82 +164,8 @@ public String constantValue(FieldAttribute.FieldName name) {
196
164
}
197
165
};
198
166
199
- @ ParametersFactory (argumentFormatting = PARAM_FORMATTING )
200
- public static List <Object []> readScriptSpec () {
201
- return settings ().stream ().map (t -> {
202
- var settings = Settings .builder ().loadFromMap (t .v2 ()).build ();
203
- return new Object [] { t .v1 (), configuration (new QueryPragmas (settings )) };
204
- }).toList ();
205
- }
206
-
207
- private static List <Tuple <String , Map <String , Object >>> settings () {
208
- return asList (new Tuple <>("default" , Map .of ()));
209
- }
210
-
211
167
public LocalPhysicalPlanOptimizerTests (String name , Configuration config ) {
212
- this .config = config ;
213
- }
214
-
215
- @ Before
216
- public void init () {
217
- EnrichResolution enrichResolution = new EnrichResolution ();
218
- enrichResolution .addResolvedPolicy (
219
- "foo" ,
220
- Enrich .Mode .ANY ,
221
- new ResolvedEnrichPolicy (
222
- "fld" ,
223
- EnrichPolicy .MATCH_TYPE ,
224
- List .of ("a" , "b" ),
225
- Map .of ("" , "idx" ),
226
- Map .ofEntries (
227
- Map .entry ("a" , new EsField ("a" , DataType .INTEGER , Map .of (), true , EsField .TimeSeriesFieldType .NONE )),
228
- Map .entry ("b" , new EsField ("b" , DataType .LONG , Map .of (), true , EsField .TimeSeriesFieldType .NONE ))
229
- )
230
- )
231
- );
232
- plannerOptimizer = new TestPlannerOptimizer (config , makeAnalyzer ("mapping-basic.json" , enrichResolution ));
233
- var timeSeriesMapping = loadMapping ("k8s-mappings.json" );
234
- var timeSeriesIndex = IndexResolution .valid (new EsIndex ("k8s" , timeSeriesMapping , Map .of ("k8s" , IndexMode .TIME_SERIES )));
235
- timeSeriesAnalyzer = new Analyzer (
236
- new AnalyzerContext (
237
- EsqlTestUtils .TEST_CFG ,
238
- new EsqlFunctionRegistry (),
239
- timeSeriesIndex ,
240
- enrichResolution ,
241
- emptyInferenceResolution ()
242
- ),
243
- TEST_VERIFIER
244
- );
245
- plannerOptimizerTimeSeries = new TestPlannerOptimizer (config , timeSeriesAnalyzer );
246
- }
247
-
248
- private Analyzer makeAnalyzer (String mappingFileName , EnrichResolution enrichResolution ) {
249
- var mapping = loadMapping (mappingFileName );
250
- EsIndex test = new EsIndex ("test" , mapping , Map .of ("test" , IndexMode .STANDARD ));
251
- IndexResolution getIndexResult = IndexResolution .valid (test );
252
-
253
- return new Analyzer (
254
- new AnalyzerContext (
255
- config ,
256
- new EsqlFunctionRegistry (),
257
- getIndexResult ,
258
- defaultLookupResolution (),
259
- enrichResolution ,
260
- emptyInferenceResolution ()
261
- ),
262
- new Verifier (new Metrics (new EsqlFunctionRegistry ()), new XPackLicenseState (() -> 0L ))
263
- );
264
- }
265
-
266
- protected Analyzer makeAnalyzer (String mappingFileName ) {
267
- return makeAnalyzer (mappingFileName , new EnrichResolution ());
268
- }
269
-
270
- private Analyzer makeAnalyzer (IndexResolution indexResolution ) {
271
- return new Analyzer (
272
- new AnalyzerContext (config , new EsqlFunctionRegistry (), indexResolution , new EnrichResolution (), emptyInferenceResolution ()),
273
- new Verifier (new Metrics (new EsqlFunctionRegistry ()), new XPackLicenseState (() -> 0L ))
274
- );
168
+ super (name , config );
275
169
}
276
170
277
171
/**
@@ -2560,10 +2454,6 @@ private boolean isMultiTypeEsField(Expression e) {
2560
2454
return e instanceof FieldAttribute fa && fa .field () instanceof MultiTypeEsField ;
2561
2455
}
2562
2456
2563
- protected static QueryBuilder wrapWithSingleQuery (String query , QueryBuilder inner , String fieldName , Source source ) {
2564
- return FilterTests .singleValueQuery (query , inner , fieldName , source );
2565
- }
2566
-
2567
2457
private Stat queryStatsFor (PhysicalPlan plan ) {
2568
2458
var limit = as (plan , LimitExec .class );
2569
2459
var agg = as (limit .child (), AggregateExec .class );
@@ -2575,11 +2465,6 @@ private Stat queryStatsFor(PhysicalPlan plan) {
2575
2465
return stat ;
2576
2466
}
2577
2467
2578
- @ Override
2579
- protected List <String > filteredWarnings () {
2580
- return withDefaultLimitWarning (super .filteredWarnings ());
2581
- }
2582
-
2583
2468
private static KqlQueryBuilder kqlQueryBuilder (String query ) {
2584
2469
return new KqlQueryBuilder (query );
2585
2470
}
0 commit comments