77
88package org .elasticsearch .xpack .esql .optimizer ;
99
10- import com .carrotsearch .randomizedtesting .annotations .ParametersFactory ;
11-
1210import org .apache .lucene .search .IndexSearcher ;
1311import org .elasticsearch .common .network .NetworkAddress ;
14- import org .elasticsearch .common .settings .Settings ;
1512import org .elasticsearch .common .unit .Fuzziness ;
16- import org .elasticsearch .core .Tuple ;
1713import org .elasticsearch .index .IndexMode ;
1814import org .elasticsearch .index .mapper .MapperService ;
19- import org .elasticsearch .index .mapper .MapperServiceTestCase ;
2015import org .elasticsearch .index .mapper .ParsedDocument ;
2116import org .elasticsearch .index .query .BoolQueryBuilder ;
2217import org .elasticsearch .index .query .MatchQueryBuilder ;
2621import org .elasticsearch .index .query .QueryStringQueryBuilder ;
2722import org .elasticsearch .index .query .RangeQueryBuilder ;
2823import org .elasticsearch .index .query .SearchExecutionContext ;
29- import org .elasticsearch .license .XPackLicenseState ;
3024import org .elasticsearch .search .vectors .KnnVectorQueryBuilder ;
3125import org .elasticsearch .search .vectors .RescoreVectorBuilder ;
3226import org .elasticsearch .test .VersionUtils ;
33- import org .elasticsearch .xpack .core .enrich .EnrichPolicy ;
3427import org .elasticsearch .xpack .esql .EsqlTestUtils ;
3528import org .elasticsearch .xpack .esql .EsqlTestUtils .TestSearchStats ;
3629import org .elasticsearch .xpack .esql .VerificationException ;
3730import org .elasticsearch .xpack .esql .action .EsqlCapabilities ;
3831import 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 ;
4232import org .elasticsearch .xpack .esql .core .expression .Alias ;
4333import org .elasticsearch .xpack .esql .core .expression .Attribute ;
4434import org .elasticsearch .xpack .esql .core .expression .Expression ;
5040import org .elasticsearch .xpack .esql .core .expression .ReferenceAttribute ;
5141import org .elasticsearch .xpack .esql .core .tree .Source ;
5242import org .elasticsearch .xpack .esql .core .type .DataType ;
53- import org .elasticsearch .xpack .esql .core .type .EsField ;
5443import org .elasticsearch .xpack .esql .core .type .MultiTypeEsField ;
5544import org .elasticsearch .xpack .esql .core .util .Holder ;
56- import org .elasticsearch .xpack .esql .enrich .ResolvedEnrichPolicy ;
5745import org .elasticsearch .xpack .esql .expression .Order ;
58- import org .elasticsearch .xpack .esql .expression .function .EsqlFunctionRegistry ;
5946import org .elasticsearch .xpack .esql .expression .function .UnsupportedAttribute ;
6047import org .elasticsearch .xpack .esql .expression .function .aggregate .Count ;
6148import org .elasticsearch .xpack .esql .expression .function .aggregate .Min ;
6956import org .elasticsearch .xpack .esql .expression .predicate .logical .Or ;
7057import org .elasticsearch .xpack .esql .expression .predicate .operator .comparison .GreaterThan ;
7158import org .elasticsearch .xpack .esql .expression .predicate .operator .comparison .GreaterThanOrEqual ;
72- import org .elasticsearch .xpack .esql .index .EsIndex ;
7359import org .elasticsearch .xpack .esql .index .IndexResolution ;
7460import org .elasticsearch .xpack .esql .optimizer .rules .logical .ExtractAggregateCommonFilter ;
7561import org .elasticsearch .xpack .esql .parser .ParsingException ;
76- import org .elasticsearch .xpack .esql .plan .logical .Enrich ;
7762import org .elasticsearch .xpack .esql .plan .logical .EsRelation ;
7863import org .elasticsearch .xpack .esql .plan .logical .LogicalPlan ;
7964import org .elasticsearch .xpack .esql .plan .physical .AggregateExec ;
9580import org .elasticsearch .xpack .esql .plan .physical .PhysicalPlan ;
9681import org .elasticsearch .xpack .esql .plan .physical .ProjectExec ;
9782import org .elasticsearch .xpack .esql .plan .physical .TopNExec ;
98- import org .elasticsearch .xpack .esql .planner .FilterTests ;
9983import org .elasticsearch .xpack .esql .plugin .EsqlFlags ;
100- import org .elasticsearch .xpack .esql .plugin .QueryPragmas ;
10184import org .elasticsearch .xpack .esql .querydsl .query .SingleValueQuery ;
10285import org .elasticsearch .xpack .esql .rule .Rule ;
10386import org .elasticsearch .xpack .esql .rule .RuleExecutor ;
10487import org .elasticsearch .xpack .esql .session .Configuration ;
10588import org .elasticsearch .xpack .esql .stats .SearchContextStats ;
10689import org .elasticsearch .xpack .esql .stats .SearchStats ;
107- import org .elasticsearch .xpack .esql .telemetry .Metrics ;
10890import org .elasticsearch .xpack .esql .type .EsqlDataTypeConverter ;
10991import org .elasticsearch .xpack .kql .query .KqlQueryBuilder ;
110- import org .junit .Before ;
11192
11293import java .io .IOException ;
11394import java .util .ArrayList ;
120101import java .util .function .BiFunction ;
121102import java .util .function .Function ;
122103
123- import static java .util .Arrays .asList ;
124104import static org .elasticsearch .compute .aggregation .AggregatorMode .FINAL ;
125105import static org .elasticsearch .index .query .QueryBuilders .boolQuery ;
126106import static org .elasticsearch .index .query .QueryBuilders .existsQuery ;
129109import static org .elasticsearch .index .query .QueryBuilders .termQuery ;
130110import static org .elasticsearch .index .query .QueryBuilders .termsQuery ;
131111import static org .elasticsearch .xpack .esql .EsqlTestUtils .TEST_PLANNER_SETTINGS ;
132- import static org .elasticsearch .xpack .esql .EsqlTestUtils .TEST_VERIFIER ;
133112import 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 ;
137113import 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 ;
140114import static org .elasticsearch .xpack .esql .analysis .AnalyzerTestUtils .indexWithDateDateNanosUnionType ;
141115import static org .elasticsearch .xpack .esql .core .querydsl .query .Query .unscore ;
142116import static org .elasticsearch .xpack .esql .core .type .DataType .DATE_NANOS ;
153127import static org .hamcrest .Matchers .nullValue ;
154128
155129//@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 {
157131
158132 public static final List <DataType > UNNECESSARY_CASTING_DATA_TYPES = List .of (
159133 DataType .BOOLEAN ,
@@ -163,7 +137,6 @@ public class LocalPhysicalPlanOptimizerTests extends MapperServiceTestCase {
163137 DataType .KEYWORD ,
164138 DataType .TEXT
165139 );
166- private static final String PARAM_FORMATTING = "%1$s" ;
167140
168141 /**
169142 * Estimated size of a keyword field in bytes.
@@ -172,11 +145,6 @@ public class LocalPhysicalPlanOptimizerTests extends MapperServiceTestCase {
172145 public static final String MATCH_OPERATOR_QUERY = "from test | where %s:%s" ;
173146 public static final String MATCH_FUNCTION_QUERY = "from test | where match(%s, %s)" ;
174147
175- protected TestPlannerOptimizer plannerOptimizer ;
176- private TestPlannerOptimizer plannerOptimizerDateDateNanosUnionTypes ;
177- private Analyzer timeSeriesAnalyzer ;
178- protected TestPlannerOptimizer plannerOptimizerTimeSeries ;
179- private final Configuration config ;
180148 private final SearchStats IS_SV_STATS = new TestSearchStats () {
181149 @ Override
182150 public boolean isSingleValue (FieldAttribute .FieldName field ) {
@@ -196,82 +164,8 @@ public String constantValue(FieldAttribute.FieldName name) {
196164 }
197165 };
198166
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-
211167 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 );
275169 }
276170
277171 /**
@@ -2560,10 +2454,6 @@ private boolean isMultiTypeEsField(Expression e) {
25602454 return e instanceof FieldAttribute fa && fa .field () instanceof MultiTypeEsField ;
25612455 }
25622456
2563- protected static QueryBuilder wrapWithSingleQuery (String query , QueryBuilder inner , String fieldName , Source source ) {
2564- return FilterTests .singleValueQuery (query , inner , fieldName , source );
2565- }
2566-
25672457 private Stat queryStatsFor (PhysicalPlan plan ) {
25682458 var limit = as (plan , LimitExec .class );
25692459 var agg = as (limit .child (), AggregateExec .class );
@@ -2575,11 +2465,6 @@ private Stat queryStatsFor(PhysicalPlan plan) {
25752465 return stat ;
25762466 }
25772467
2578- @ Override
2579- protected List <String > filteredWarnings () {
2580- return withDefaultLimitWarning (super .filteredWarnings ());
2581- }
2582-
25832468 private static KqlQueryBuilder kqlQueryBuilder (String query ) {
25842469 return new KqlQueryBuilder (query );
25852470 }
0 commit comments