| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.drill.exec.planner; |
| |
| import org.apache.calcite.plan.RelOptRule; |
| import org.apache.calcite.plan.RelOptRuleCall; |
| import org.apache.calcite.plan.volcano.AbstractConverter; |
| import org.apache.calcite.rel.core.Aggregate; |
| import org.apache.calcite.rel.core.Join; |
| import org.apache.calcite.rel.core.Project; |
| import org.apache.calcite.rel.logical.LogicalAggregate; |
| import org.apache.calcite.rel.logical.LogicalCalc; |
| import org.apache.calcite.rel.logical.LogicalJoin; |
| import org.apache.calcite.rel.logical.LogicalProject; |
| import org.apache.calcite.rel.logical.LogicalUnion; |
| import org.apache.calcite.rel.rules.AggregateExpandDistinctAggregatesRule; |
| import org.apache.calcite.rel.rules.AggregateRemoveRule; |
| import org.apache.calcite.rel.rules.FilterCorrelateRule; |
| import org.apache.calcite.rel.rules.FilterMergeRule; |
| import org.apache.calcite.rel.rules.FilterRemoveIsNotDistinctFromRule; |
| import org.apache.calcite.rel.rules.FilterSetOpTransposeRule; |
| import org.apache.calcite.rel.rules.JoinPushExpressionsRule; |
| import org.apache.calcite.rel.rules.JoinPushThroughJoinRule; |
| import org.apache.calcite.rel.rules.JoinPushTransitivePredicatesRule; |
| import org.apache.calcite.rel.rules.ProjectRemoveRule; |
| import org.apache.calcite.rel.rules.ProjectSetOpTransposeRule; |
| import org.apache.calcite.rel.rules.ProjectToWindowRule; |
| import org.apache.calcite.rel.rules.ProjectWindowTransposeRule; |
| import org.apache.calcite.rel.rules.ReduceExpressionsRule; |
| import org.apache.calcite.rel.rules.SemiJoinRule; |
| import org.apache.calcite.rel.rules.SortRemoveRule; |
| import org.apache.calcite.rel.rules.SubQueryRemoveRule; |
| import org.apache.calcite.rel.rules.UnionToDistinctRule; |
| import org.apache.drill.exec.planner.logical.DrillConditions; |
| import org.apache.drill.exec.planner.logical.DrillRelFactories; |
| import org.apache.drill.shaded.guava.com.google.common.base.Preconditions; |
| |
| /** |
| * Contains rule instances which use custom RelBuilder. |
| */ |
| public interface RuleInstance { |
| |
| ReduceExpressionsRule PROJECT_INSTANCE = |
| new ReduceExpressionsRule.ProjectReduceExpressionsRule(LogicalProject.class, true, |
| DrillRelFactories.LOGICAL_BUILDER); |
| |
| UnionToDistinctRule UNION_TO_DISTINCT_RULE = |
| new UnionToDistinctRule(LogicalUnion.class, |
| DrillRelFactories.LOGICAL_BUILDER); |
| |
| SemiJoinRule SEMI_JOIN_PROJECT_RULE = new SemiJoinRule.ProjectToSemiJoinRule(Project.class, Join.class, Aggregate.class, |
| DrillRelFactories.LOGICAL_BUILDER, "DrillSemiJoinRule:project") { |
| public boolean matches(RelOptRuleCall call) { |
| Preconditions.checkArgument(call.rel(1) instanceof Join); |
| Join join = call.rel(1); |
| return !(join.getCondition().isAlwaysTrue() || join.getCondition().isAlwaysFalse()); |
| } |
| }; |
| |
| SemiJoinRule JOIN_TO_SEMI_JOIN_RULE = new SemiJoinRule.JoinToSemiJoinRule(Join.class, Aggregate.class, |
| DrillRelFactories.LOGICAL_BUILDER, "DrillJoinToSemiJoinRule") { |
| public boolean matches(RelOptRuleCall call) { |
| Join join = call.rel(0); |
| return !(join.getCondition().isAlwaysTrue() || join.getCondition().isAlwaysFalse()); |
| } |
| }; |
| |
| JoinPushExpressionsRule JOIN_PUSH_EXPRESSIONS_RULE = |
| new JoinPushExpressionsRule(Join.class, |
| DrillRelFactories.LOGICAL_BUILDER); |
| |
| FilterMergeRule FILTER_MERGE_RULE = |
| new FilterMergeRule(DrillRelFactories.LOGICAL_BUILDER); |
| |
| FilterMergeRule DRILL_FILTER_MERGE_RULE = |
| new FilterMergeRule(DrillRelBuilder.proto(DrillRelFactories.DRILL_LOGICAL_FILTER_FACTORY)); |
| |
| FilterCorrelateRule FILTER_CORRELATE_RULE = |
| new FilterCorrelateRule(DrillRelFactories.LOGICAL_BUILDER); |
| |
| AggregateRemoveRule AGGREGATE_REMOVE_RULE = |
| new AggregateRemoveRule(LogicalAggregate.class, DrillRelFactories.LOGICAL_BUILDER); |
| |
| AggregateExpandDistinctAggregatesRule AGGREGATE_EXPAND_DISTINCT_AGGREGATES_RULE = |
| new AggregateExpandDistinctAggregatesRule(LogicalAggregate.class, false, |
| DrillRelFactories.LOGICAL_BUILDER); |
| |
| /** |
| * Instance of the rule that works on logical joins only, and pushes to the |
| * right. |
| */ |
| RelOptRule JOIN_PUSH_THROUGH_JOIN_RULE_RIGHT = |
| new JoinPushThroughJoinRule("JoinPushThroughJoinRule:right", true, |
| LogicalJoin.class, DrillRelFactories.LOGICAL_BUILDER); |
| |
| /** |
| * Instance of the rule that works on logical joins only, and pushes to the |
| * left. |
| */ |
| RelOptRule JOIN_PUSH_THROUGH_JOIN_RULE_LEFT = |
| new JoinPushThroughJoinRule("JoinPushThroughJoinRule:left", false, |
| LogicalJoin.class, DrillRelFactories.LOGICAL_BUILDER); |
| |
| ReduceExpressionsRule CALC_INSTANCE = |
| new ReduceExpressionsRule.CalcReduceExpressionsRule(LogicalCalc.class, true, |
| DrillRelFactories.LOGICAL_BUILDER); |
| |
| FilterSetOpTransposeRule FILTER_SET_OP_TRANSPOSE_RULE = |
| new FilterSetOpTransposeRule(DrillRelFactories.LOGICAL_BUILDER); |
| |
| ProjectSetOpTransposeRule PROJECT_SET_OP_TRANSPOSE_RULE = |
| new ProjectSetOpTransposeRule(DrillConditions.PRESERVE_ITEM, DrillRelFactories.LOGICAL_BUILDER); |
| |
| ProjectRemoveRule PROJECT_REMOVE_RULE = |
| new ProjectRemoveRule(DrillRelFactories.LOGICAL_BUILDER); |
| |
| ProjectToWindowRule PROJECT_TO_LOGICAL_PROJECT_AND_WINDOW_RULE = |
| new ProjectToWindowRule.ProjectToLogicalProjectAndWindowRule(DrillRelFactories.LOGICAL_BUILDER); |
| |
| SortRemoveRule SORT_REMOVE_RULE = |
| new SortRemoveRule(DrillRelFactories.LOGICAL_BUILDER); |
| |
| ProjectWindowTransposeRule PROJECT_WINDOW_TRANSPOSE_RULE = |
| new ProjectWindowTransposeRule(DrillRelFactories.LOGICAL_BUILDER); |
| |
| AbstractConverter.ExpandConversionRule EXPAND_CONVERSION_RULE = |
| new AbstractConverter.ExpandConversionRule(DrillRelFactories.LOGICAL_BUILDER); |
| |
| /** |
| * Instance of the rule that infers predicates from on a |
| * {@link org.apache.calcite.rel.core.Join} and creates |
| * {@link org.apache.calcite.rel.core.Filter}s if those predicates can be pushed |
| * to its inputs. |
| */ |
| JoinPushTransitivePredicatesRule DRILL_JOIN_PUSH_TRANSITIVE_PREDICATES_RULE = |
| new JoinPushTransitivePredicatesRule(Join.class, DrillRelBuilder.proto( |
| DrillRelFactories.DRILL_LOGICAL_JOIN_FACTORY, DrillRelFactories.DRILL_LOGICAL_FILTER_FACTORY)); |
| |
| FilterRemoveIsNotDistinctFromRule REMOVE_IS_NOT_DISTINCT_FROM_RULE = |
| new FilterRemoveIsNotDistinctFromRule(DrillRelBuilder.proto(DrillRelFactories.DRILL_LOGICAL_FILTER_FACTORY)); |
| |
| SubQueryRemoveRule SUB_QUERY_FILTER_REMOVE_RULE = |
| new SubQueryRemoveRule.SubQueryFilterRemoveRule(DrillRelFactories.LOGICAL_BUILDER); |
| |
| SubQueryRemoveRule SUB_QUERY_PROJECT_REMOVE_RULE = |
| new SubQueryRemoveRule.SubQueryProjectRemoveRule(DrillRelFactories.LOGICAL_BUILDER); |
| |
| SubQueryRemoveRule SUB_QUERY_JOIN_REMOVE_RULE = |
| new SubQueryRemoveRule.SubQueryJoinRemoveRule(DrillRelFactories.LOGICAL_BUILDER); |
| } |