@@ -61,7 +61,7 @@ Optimizer::Optimizer () {
61
61
// //////////////////////////////////////////////////////////////////////////////
62
62
63
63
bool Optimizer::addPlan (ExecutionPlan* plan,
64
- int level,
64
+ RuleLevel level,
65
65
bool wasModified) {
66
66
TRI_ASSERT (plan != nullptr );
67
67
@@ -303,11 +303,15 @@ void Optimizer::setupRules () {
303
303
304
304
// move calculations up the dependency chain (to pull them out of
305
305
// inner loops etc.)
306
- registerRule (" move-calculations-up" , moveCalculationsUpRule, 10 );
306
+ registerRule (" move-calculations-up" ,
307
+ moveCalculationsUpRule,
308
+ moveCalculationsUpRule_pass1);
307
309
308
310
// move filters up the dependency chain (to make result sets as small
309
311
// as possible as early as possible)
310
- registerRule (" move-filters-up" , moveFiltersUpRule, 20 );
312
+ registerRule (" move-filters-up" ,
313
+ moveFiltersUpRule,
314
+ moveFiltersUpRule_pass1);
311
315
312
316
// ////////////////////////////////////////////////////////////////////////////
313
317
// / "Pass 2": try to remove redundant or unnecessary nodes
@@ -317,14 +321,19 @@ void Optimizer::setupRules () {
317
321
// remove filters from the query that are not necessary at all
318
322
// filters that are always true will be removed entirely
319
323
// filters that are always false will be replaced with a NoResults node
320
- registerRule (" remove-unnecessary-filters" , removeUnnecessaryFiltersRule, 110 );
324
+ registerRule (" remove-unnecessary-filters" ,
325
+ removeUnnecessaryFiltersRule,
326
+ removeUnnecessaryFiltersRule_pass2);
321
327
322
328
// remove calculations that are never necessary
323
329
registerRule (" remove-unnecessary-calculations" ,
324
- removeUnnecessaryCalculationsRule, 120 );
330
+ removeUnnecessaryCalculationsRule,
331
+ removeUnnecessaryCalculationsRule_pass2);
325
332
326
333
// remove redundant sort blocks
327
- registerRule (" remove-redundant-sorts" , removeRedundantSorts, 130 );
334
+ registerRule (" remove-redundant-sorts" ,
335
+ removeRedundantSorts,
336
+ removeRedundantSorts_pass2);
328
337
329
338
// ////////////////////////////////////////////////////////////////////////////
330
339
// / "Pass 3": interchange EnumerateCollection nodes in all possible ways
@@ -333,7 +342,8 @@ void Optimizer::setupRules () {
333
342
// ////////////////////////////////////////////////////////////////////////////
334
343
335
344
registerRule (" interchange-adjacent-enumerations" ,
336
- interchangeAdjacentEnumerations, 500 );
345
+ interchangeAdjacentEnumerations,
346
+ interchangeAdjacentEnumerations_pass3);
337
347
338
348
// ////////////////////////////////////////////////////////////////////////////
339
349
// "Pass 4": moving nodes "up" (potentially outside loops) (second try):
@@ -342,11 +352,15 @@ void Optimizer::setupRules () {
342
352
343
353
// move calculations up the dependency chain (to pull them out of
344
354
// inner loops etc.)
345
- registerRule (" move-calculations-up-2" , moveCalculationsUpRule, 510 );
355
+ registerRule (" move-calculations-up-2" ,
356
+ moveCalculationsUpRule,
357
+ moveCalculationsUpRule_pass4);
346
358
347
359
// move filters up the dependency chain (to make result sets as small
348
360
// as possible as early as possible)
349
- registerRule (" move-filters-up-2" , moveFiltersUpRule, 520 );
361
+ registerRule (" move-filters-up-2" ,
362
+ moveFiltersUpRule,
363
+ moveFiltersUpRule_pass4);
350
364
351
365
// ////////////////////////////////////////////////////////////////////////////
352
366
// / "Pass 5": try to remove redundant or unnecessary nodes (second try)
@@ -356,26 +370,36 @@ void Optimizer::setupRules () {
356
370
// remove filters from the query that are not necessary at all
357
371
// filters that are always true will be removed entirely
358
372
// filters that are always false will be replaced with a NoResults node
359
- registerRule (" remove-unnecessary-filters-2" , removeUnnecessaryFiltersRule, 610 );
373
+ registerRule (" remove-unnecessary-filters-2" ,
374
+ removeUnnecessaryFiltersRule,
375
+ removeUnnecessaryFiltersRule_pass5);
360
376
361
377
// remove calculations that are never necessary
362
378
registerRule (" remove-unnecessary-calculations-2" ,
363
- removeUnnecessaryCalculationsRule, 620 );
379
+ removeUnnecessaryCalculationsRule,
380
+ removeUnnecessaryCalculationsRule_pass5);
364
381
365
382
// remove redundant sort blocks
366
- registerRule (" remove-redundant-sorts-2" , removeRedundantSorts, 630 );
383
+ registerRule (" remove-redundant-sorts-2" ,
384
+ removeRedundantSorts,
385
+ removeRedundantSorts_pass5);
367
386
368
387
// ////////////////////////////////////////////////////////////////////////////
369
388
// / "Pass 6": use indexes if possible for FILTER and/or SORT nodes
370
389
// / use levels between 701 and 799 for this
371
390
// ////////////////////////////////////////////////////////////////////////////
372
391
373
392
// try to find a filter after an enumerate collection and find an index . . .
374
- registerRule (" use-index-range" , useIndexRange, 710 );
393
+ registerRule (" use-index-range" ,
394
+ useIndexRange,
395
+ useIndexRange_pass6);
375
396
376
397
// try to find sort blocks which are superseeded by indexes
377
- registerRule (" use-index-for-sort" , useIndexForSort, 720 );
378
-
398
+ registerRule (" use-index-for-sort" ,
399
+ useIndexForSort,
400
+ useIndexForSort_pass6);
401
+
402
+
379
403
// ////////////////////////////////////////////////////////////////////////////
380
404
// / END OF OPTIMISATIONS
381
405
// ////////////////////////////////////////////////////////////////////////////
0 commit comments