public IterativeOptimizer(RuleStatsRecorder stats, StatsCalculator statsCalculator, CostCalculator costCalculator, List<PlanOptimizer> legacyRules, Set<Rule<?>> newRules) { this.stats = requireNonNull(stats, "stats is null"); this.statsCalculator = requireNonNull(statsCalculator, "statsCalculator is null"); this.costCalculator = requireNonNull(costCalculator, "costCalculator is null"); this.legacyRules = ImmutableList.copyOf(legacyRules); this.ruleIndex = RuleIndex.builder() .register(newRules) .build(); stats.registerAll(newRules); }
@Test public void testWithPlanNodeHierarchy() { Rule projectRule1 = new NoOpRule(Pattern.typeOf(ProjectNode.class)); Rule projectRule2 = new NoOpRule(Pattern.typeOf(ProjectNode.class)); Rule filterRule = new NoOpRule(Pattern.typeOf(FilterNode.class)); Rule anyRule = new NoOpRule(Pattern.any()); RuleIndex ruleIndex = RuleIndex.builder() .register(projectRule1) .register(projectRule2) .register(filterRule) .register(anyRule) .build(); ProjectNode projectNode = planBuilder.project(Assignments.of(), planBuilder.values()); FilterNode filterNode = planBuilder.filter(BooleanLiteral.TRUE_LITERAL, planBuilder.values()); ValuesNode valuesNode = planBuilder.values(); assertEquals( ruleIndex.getCandidates(projectNode).collect(toSet()), ImmutableSet.of(projectRule1, projectRule2, anyRule)); assertEquals( ruleIndex.getCandidates(filterNode).collect(toSet()), ImmutableSet.of(filterRule, anyRule)); assertEquals( ruleIndex.getCandidates(valuesNode).collect(toSet()), ImmutableSet.of(anyRule)); }
@Test public void testInterfacesHierarchy() { Rule a = new NoOpRule(Pattern.typeOf(A.class)); Rule b = new NoOpRule(Pattern.typeOf(B.class)); Rule ab = new NoOpRule(Pattern.typeOf(AB.class)); RuleIndex ruleIndex = RuleIndex.builder() .register(a) .register(b) .register(ab) .build(); assertEquals( ruleIndex.getCandidates(new A() {}).collect(toSet()), ImmutableSet.of(a)); assertEquals( ruleIndex.getCandidates(new B() {}).collect(toSet()), ImmutableSet.of(b)); assertEquals( ruleIndex.getCandidates(new AB()).collect(toSet()), ImmutableSet.of(ab, a, b)); }
public static Builder builder() { return new Builder(); }
public Builder register(Rule<?> rule) { Pattern pattern = getFirstPattern(rule.getPattern()); if (pattern instanceof TypeOfPattern<?>) { rulesByRootType.put(((TypeOfPattern<?>) pattern).expectedClass(), rule); } else { throw new IllegalArgumentException("Unexpected Pattern: " + pattern); } return this; }