You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2014/11/14 22:32:40 UTC
[32/58] [abbrv] [partial] incubator-calcite git commit: [CALCITE-306]
Standardize code style for "import package.*; "
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/LoptJoinTree.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/LoptJoinTree.java b/core/src/main/java/org/apache/calcite/rel/rules/LoptJoinTree.java
index 0ac7197..55e41c7 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/LoptJoinTree.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/LoptJoinTree.java
@@ -14,18 +14,19 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
+package org.apache.calcite.rel.rules;
-import java.util.*;
-
-import org.eigenbase.rel.*;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.Join;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
+import java.util.List;
+
/**
- * Utility class used to store a {@link JoinRelBase} tree and the factors that
- * make up the tree.
+ * Utility class used to store a {@link org.apache.calcite.rel.core.Join} tree
+ * and the factors that make up the tree.
*
* <p>Because {@link RelNode}s can be duplicated in a query
* when you have a self-join, factor ids are needed to distinguish between the
@@ -115,7 +116,7 @@ public class LoptJoinTree {
public LoptJoinTree getLeft() {
final Node node = (Node) factorTree;
return new LoptJoinTree(
- ((JoinRelBase) joinTree).getLeft(),
+ ((Join) joinTree).getLeft(),
node.getLeft(),
node.getLeft().getParent().isRemovableSelfJoin());
}
@@ -123,7 +124,7 @@ public class LoptJoinTree {
public LoptJoinTree getRight() {
final Node node = (Node) factorTree;
return new LoptJoinTree(
- ((JoinRelBase) joinTree).getRight(),
+ ((Join) joinTree).getRight(),
node.getRight(),
node.getRight().getParent().isRemovableSelfJoin());
}
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/LoptMultiJoin.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/LoptMultiJoin.java b/core/src/main/java/org/apache/calcite/rel/rules/LoptMultiJoin.java
index 8410894..071dbc1 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/LoptMultiJoin.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/LoptMultiJoin.java
@@ -14,59 +14,71 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
-
-import java.util.*;
-
-import org.eigenbase.rel.*;
-import org.eigenbase.rel.metadata.*;
-import org.eigenbase.relopt.*;
-import org.eigenbase.reltype.*;
-import org.eigenbase.rex.*;
-import org.eigenbase.sql.SqlKind;
-import org.eigenbase.util.IntList;
-
-import net.hydromatic.optiq.util.BitSets;
+package org.apache.calcite.rel.rules;
+
+import org.apache.calcite.plan.RelOptUtil;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.JoinRelType;
+import org.apache.calcite.rel.core.SemiJoin;
+import org.apache.calcite.rel.metadata.RelColumnOrigin;
+import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.rel.type.RelDataTypeField;
+import org.apache.calcite.rex.RexCall;
+import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.sql.SqlKind;
+import org.apache.calcite.util.BitSets;
+import org.apache.calcite.util.IntList;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Set;
+
/**
* Utility class that keeps track of the join factors that
- * make up a {@link MultiJoinRel}.
+ * make up a {@link MultiJoin}.
*/
public class LoptMultiJoin {
//~ Instance fields --------------------------------------------------------
/**
- * The MultiJoinRel being optimized
+ * The MultiJoin being optimized
*/
- MultiJoinRel multiJoin;
+ MultiJoin multiJoin;
/**
- * Join filters associated with the MultiJoinRel, decomposed into a list.
+ * Join filters associated with the MultiJoin, decomposed into a list.
* Excludes left/right outer join filters.
*/
private List<RexNode> joinFilters;
/**
- * All join filters associated with the MultiJoinRel, decomposed into a
+ * All join filters associated with the MultiJoin, decomposed into a
* list. Includes left/right outer join filters.
*/
private List<RexNode> allJoinFilters;
/**
- * Number of factors into the MultiJoinRel
+ * Number of factors into the MultiJoin
*/
private final int nJoinFactors;
/**
- * Total number of fields in the MultiJoinRel
+ * Total number of fields in the MultiJoin
*/
private int nTotalFields;
/**
- * Original inputs into the MultiJoinRel
+ * Original inputs into the MultiJoin
*/
private final ImmutableList<RelNode> joinFactors;
@@ -150,7 +162,7 @@ public class LoptMultiJoin {
/**
* The semijoins that allow the join of a dimension table to be removed
*/
- SemiJoinRel [] joinRemovalSemiJoins;
+ SemiJoin[] joinRemovalSemiJoins;
/**
* Set of null-generating factors whose corresponding outer join can be
@@ -168,7 +180,7 @@ public class LoptMultiJoin {
//~ Constructors -----------------------------------------------------------
- public LoptMultiJoin(MultiJoinRel multiJoin) {
+ public LoptMultiJoin(MultiJoin multiJoin) {
this.multiJoin = multiJoin;
joinFactors = ImmutableList.copyOf(multiJoin.getInputs());
nJoinFactors = joinFactors.size();
@@ -219,7 +231,7 @@ public class LoptMultiJoin {
factory = multiJoin.getCluster().getTypeFactory();
joinRemovalFactors = new Integer[nJoinFactors];
- joinRemovalSemiJoins = new SemiJoinRel[nJoinFactors];
+ joinRemovalSemiJoins = new SemiJoin[nJoinFactors];
removableOuterJoinFactors = new HashSet<Integer>();
removableSelfJoinPairs = new HashMap<Integer, RemovableSelfJoin>();
@@ -228,9 +240,9 @@ public class LoptMultiJoin {
//~ Methods ----------------------------------------------------------------
/**
- * @return the MultiJoinRel corresponding to this multijoin
+ * @return the MultiJoin corresponding to this multijoin
*/
- public MultiJoinRel getMultiJoinRel() {
+ public MultiJoin getMultiJoinRel() {
return multiJoin;
}
@@ -391,7 +403,7 @@ public class LoptMultiJoin {
* @return the semijoin that allows the join of a dimension table to be
* removed
*/
- public SemiJoinRel getJoinRemovalSemiJoin(int dimIdx) {
+ public SemiJoin getJoinRemovalSemiJoin(int dimIdx) {
return joinRemovalSemiJoins[dimIdx];
}
@@ -413,7 +425,7 @@ public class LoptMultiJoin {
* @param dimIdx id of the dimension factor
* @param semiJoin the semijoin
*/
- public void setJoinRemovalSemiJoin(int dimIdx, SemiJoinRel semiJoin) {
+ public void setJoinRemovalSemiJoin(int dimIdx, SemiJoin semiJoin) {
joinRemovalSemiJoins[dimIdx] = semiJoin;
}
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/LoptOptimizeJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/LoptOptimizeJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/LoptOptimizeJoinRule.java
index f26c817..2f5643b 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/LoptOptimizeJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/LoptOptimizeJoinRule.java
@@ -14,30 +14,57 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
-
-import java.util.*;
-
-import org.eigenbase.rel.*;
-import org.eigenbase.rel.metadata.*;
-import org.eigenbase.relopt.*;
-import org.eigenbase.reltype.*;
-import org.eigenbase.rex.*;
-import org.eigenbase.sql.fun.*;
-import org.eigenbase.util.ImmutableIntList;
-import org.eigenbase.util.Pair;
-import org.eigenbase.util.mapping.IntPair;
-
-import net.hydromatic.optiq.util.BitSets;
+package org.apache.calcite.rel.rules;
+
+import org.apache.calcite.plan.RelOptCost;
+import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.plan.RelOptTable;
+import org.apache.calcite.plan.RelOptUtil;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.Join;
+import org.apache.calcite.rel.core.JoinInfo;
+import org.apache.calcite.rel.core.JoinRelType;
+import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.core.RelFactories;
+import org.apache.calcite.rel.core.SemiJoin;
+import org.apache.calcite.rel.metadata.RelColumnOrigin;
+import org.apache.calcite.rel.metadata.RelMdUtil;
+import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.rel.type.RelDataTypeField;
+import org.apache.calcite.rex.RexBuilder;
+import org.apache.calcite.rex.RexCall;
+import org.apache.calcite.rex.RexInputRef;
+import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexUtil;
+import org.apache.calcite.sql.fun.SqlStdOperatorTable;
+import org.apache.calcite.util.BitSets;
+import org.apache.calcite.util.ImmutableIntList;
+import org.apache.calcite.util.Pair;
+import org.apache.calcite.util.mapping.IntPair;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
/**
* Planner rule that implements the heuristic planner for determining optimal
* join orderings.
*
- * <p>It is triggered by the pattern {@link ProjectRel} ({@link MultiJoinRel}).
+ * <p>It is triggered by the pattern
+ * {@link org.apache.calcite.rel.logical.LogicalProject}
+ * ({@link MultiJoin}).
*/
public class LoptOptimizeJoinRule extends RelOptRule {
public static final LoptOptimizeJoinRule INSTANCE =
@@ -55,7 +82,7 @@ public class LoptOptimizeJoinRule extends RelOptRule {
RelFactories.JoinFactory joinFactory,
RelFactories.ProjectFactory projectFactory,
RelFactories.FilterFactory filterFactory) {
- super(operand(MultiJoinRel.class, any()));
+ super(operand(MultiJoin.class, any()));
this.joinFactory = joinFactory;
this.projectFactory = projectFactory;
this.filterFactory = filterFactory;
@@ -65,7 +92,7 @@ public class LoptOptimizeJoinRule extends RelOptRule {
// implement RelOptRule
public void onMatch(RelOptRuleCall call) {
- final MultiJoinRel multiJoinRel = call.rel(0);
+ final MultiJoin multiJoinRel = call.rel(0);
final LoptMultiJoin multiJoin = new LoptMultiJoin(multiJoinRel);
findRemovableOuterJoins(multiJoin);
@@ -509,8 +536,8 @@ public class LoptOptimizeJoinRule extends RelOptRule {
newOffset));
}
}
- ProjectRelBase newProject =
- (ProjectRelBase) projectFactory.createProject(
+ Project newProject =
+ (Project) projectFactory.createProject(
joinTree.getJoinTree(),
newProjExprs,
fieldNames);
@@ -798,15 +825,15 @@ public class LoptOptimizeJoinRule extends RelOptRule {
}
/**
- * Returns true if a relnode corresponds to a JoinRel that wasn't one of the
- * original MultiJoinRel input factors
+ * Returns whether a RelNode corresponds to a Join that wasn't one of the
+ * original MultiJoin input factors.
*/
private boolean isJoinTree(RelNode rel) {
// full outer joins were already optimized in a prior instantiation
// of this rule; therefore we should never see a join input that's
// a full outer join
- if (rel instanceof JoinRelBase) {
- assert ((JoinRelBase) rel).getJoinType() != JoinRelType.FULL;
+ if (rel instanceof Join) {
+ assert ((Join) rel).getJoinType() != JoinRelType.FULL;
return true;
} else {
return false;
@@ -949,10 +976,10 @@ public class LoptOptimizeJoinRule extends RelOptRule {
// The width cost is the width of the tree itself plus the widths
// of its children. Hence, skinnier rows are better when they're
// lower in the tree since the width of a RelNode contributes to
- // the cost of each JoinRel that appears above that RelNode.
+ // the cost of each LogicalJoin that appears above that RelNode.
int width = tree.getRowType().getFieldCount();
if (isJoinTree(tree)) {
- JoinRelBase joinRel = (JoinRelBase) tree;
+ Join joinRel = (Join) tree;
width +=
rowWidthCost(joinRel.getLeft())
+ rowWidthCost(joinRel.getRight());
@@ -993,7 +1020,7 @@ public class LoptOptimizeJoinRule extends RelOptRule {
int childNo = -1;
LoptJoinTree left = joinTree.getLeft();
LoptJoinTree right = joinTree.getRight();
- JoinRelBase joinRel = (JoinRelBase) joinTree.getJoinTree();
+ Join joinRel = (Join) joinTree.getJoinTree();
JoinRelType joinType = joinRel.getJoinType();
// can't push factors pass self-joins because in order to later remove
@@ -1065,7 +1092,7 @@ public class LoptOptimizeJoinRule extends RelOptRule {
// pushdown of the new factor as well as any swapping that may have
// been done during the pushdown
RexNode newCondition =
- ((JoinRelBase) joinTree.getJoinTree()).getCondition();
+ ((Join) joinTree.getJoinTree()).getCondition();
newCondition =
adjustFilter(
multiJoin,
@@ -1142,7 +1169,7 @@ public class LoptOptimizeJoinRule extends RelOptRule {
// as a left outer join since it's being added to the RHS side of
// the join; createJoinSubTree may swap the inputs and therefore
// convert the left outer join to a right outer join; if the original
- // MultiJoinRel was a full outer join, these should be the only
+ // MultiJoin was a full outer join, these should be the only
// factors in the join, so create the join as a full outer join
JoinRelType joinType;
if (multiJoin.getMultiJoinRel().isFullOuterJoin()) {
@@ -1510,7 +1537,7 @@ public class LoptOptimizeJoinRule extends RelOptRule {
multiJoin.getJoinFactor(dimIdx).getRowType().getFieldList();
int nDimFields = dimFields.size();
Integer [] replacementKeys = new Integer[nDimFields];
- SemiJoinRel semiJoin = multiJoin.getJoinRemovalSemiJoin(dimIdx);
+ SemiJoin semiJoin = multiJoin.getJoinRemovalSemiJoin(dimIdx);
ImmutableIntList dimKeys = semiJoin.getRightKeys();
ImmutableIntList factKeys = semiJoin.getLeftKeys();
for (int i = 0; i < dimKeys.size(); i++) {
@@ -1614,8 +1641,8 @@ public class LoptOptimizeJoinRule extends RelOptRule {
}
projects.add(Pair.of(projExpr, newFields.get(i).getName()));
}
- ProjectRelBase projRel =
- (ProjectRelBase) projectFactory.createProject(
+ Project projRel =
+ (Project) projectFactory.createProject(
currJoinRel,
Pair.left(projects),
Pair.right(projects));
@@ -1637,7 +1664,7 @@ public class LoptOptimizeJoinRule extends RelOptRule {
// Filters referencing factors other than leftIdx and factorToAdd
// still do need to be applied. So, add them into a separate
- // FilterRel placed on top off the projection created above.
+ // LogicalFilter placed on top off the projection created above.
RelNode topRelNode = projRel;
if (leftIdx >= 0) {
topRelNode =
@@ -1661,7 +1688,7 @@ public class LoptOptimizeJoinRule extends RelOptRule {
}
/**
- * Creates a JoinRel given left and right operands and a join condition.
+ * Creates a LogicalJoin given left and right operands and a join condition.
* Swaps the operands if beneficial.
*
* @param multiJoin join factors being optimized
@@ -1674,11 +1701,11 @@ public class LoptOptimizeJoinRule extends RelOptRule {
* otherwise, the condition has already been partially adjusted and only
* needs to be further adjusted if swapping is done
* @param filtersToAdd additional filters that may be added on top of the
- * resulting JoinRel, if the join is a left or right outer join
+ * resulting LogicalJoin, if the join is a left or right outer join
* @param selfJoin true if the join being created is a self-join that's
* removable
*
- * @return created JoinRel
+ * @return created LogicalJoin
*/
private LoptJoinTree createJoinSubtree(
LoptMultiJoin multiJoin,
@@ -1960,7 +1987,7 @@ public class LoptOptimizeJoinRule extends RelOptRule {
*
* @return true if the join is removable
*/
- public static boolean isRemovableSelfJoin(JoinRelBase joinRel) {
+ public static boolean isRemovableSelfJoin(Join joinRel) {
final RelNode left = joinRel.getLeft();
final RelNode right = joinRel.getRight();
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java b/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java
index 319b323..2f95c20 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java
@@ -14,22 +14,40 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
-
-import java.util.*;
-
-import org.eigenbase.rel.*;
-import org.eigenbase.rel.metadata.*;
-import org.eigenbase.relopt.*;
-import org.eigenbase.rex.*;
-import org.eigenbase.sql.SqlKind;
-import org.eigenbase.sql.fun.*;
-import org.eigenbase.util.ImmutableIntList;
-
-import net.hydromatic.optiq.util.BitSets;
+package org.apache.calcite.rel.rules;
+
+import org.apache.calcite.plan.Convention;
+import org.apache.calcite.plan.RelOptCost;
+import org.apache.calcite.plan.RelOptTable;
+import org.apache.calcite.plan.RelOptUtil;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.JoinInfo;
+import org.apache.calcite.rel.core.SemiJoin;
+import org.apache.calcite.rel.metadata.RelColumnOrigin;
+import org.apache.calcite.rel.metadata.RelMdUtil;
+import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.rex.RexBuilder;
+import org.apache.calcite.rex.RexCall;
+import org.apache.calcite.rex.RexInputRef;
+import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexUtil;
+import org.apache.calcite.sql.SqlKind;
+import org.apache.calcite.sql.fun.SqlStdOperatorTable;
+import org.apache.calcite.util.BitSets;
+import org.apache.calcite.util.ImmutableIntList;
import com.google.common.collect.Lists;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.BitSet;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Set;
+
/**
* Implements the logic for determining the optimal
* semi-joins to be used in processing joins in a query.
@@ -56,10 +74,10 @@ public class LoptSemiJoinOptimizer {
/**
* Associates potential semijoins with each fact table factor. The first
* parameter in the map corresponds to the fact table. The second
- * corresponds to the dimension table and a SemiJoinRel that captures all
+ * corresponds to the dimension table and a SemiJoin that captures all
* the necessary semijoin data between that fact and dimension table
*/
- private Map<Integer, Map<Integer, SemiJoinRel>> possibleSemiJoins;
+ private Map<Integer, Map<Integer, SemiJoin>> possibleSemiJoins;
private final Comparator<Integer> factorCostComparator =
new FactorCostComparator();
@@ -91,7 +109,7 @@ public class LoptSemiJoinOptimizer {
* @param multiJoin join factors being optimized
*/
public void makePossibleSemiJoins(LoptMultiJoin multiJoin) {
- possibleSemiJoins = new HashMap<Integer, Map<Integer, SemiJoinRel>>();
+ possibleSemiJoins = new HashMap<Integer, Map<Integer, SemiJoin>>();
// semijoins can't be used with any type of outer join, including full
if (multiJoin.getMultiJoinRel().isFullOuterJoin()) {
@@ -102,8 +120,8 @@ public class LoptSemiJoinOptimizer {
for (int factIdx = 0; factIdx < nJoinFactors; factIdx++) {
Map<Integer, List<RexNode>> dimFilters =
new HashMap<Integer, List<RexNode>>();
- Map<Integer, SemiJoinRel> semiJoinMap =
- new HashMap<Integer, SemiJoinRel>();
+ Map<Integer, SemiJoin> semiJoinMap =
+ new HashMap<Integer, SemiJoin>();
// loop over all filters and find equality filters that reference
// this factor and one other factor
@@ -137,7 +155,7 @@ public class LoptSemiJoinOptimizer {
for (Integer dimIdx : dimIdxes) {
List<RexNode> joinFilters = dimFilters.get(dimIdx);
if (joinFilters != null) {
- SemiJoinRel semiJoin =
+ SemiJoin semiJoin =
findSemiJoinIndexByCost(
multiJoin,
joinFilters,
@@ -214,15 +232,15 @@ public class LoptSemiJoinOptimizer {
* @param factIdx index in join factors corresponding to the fact table
* @param dimIdx index in join factors corresponding to the dimension table
*
- * @return SemiJoinRel containing information regarding the semijoin that
+ * @return SemiJoin containing information regarding the semijoin that
* can be used to filter the fact table
*/
- private SemiJoinRel findSemiJoinIndexByCost(
+ private SemiJoin findSemiJoinIndexByCost(
LoptMultiJoin multiJoin,
List<RexNode> joinFilters,
int factIdx,
int dimIdx) {
- // create a SemiJoinRel with the semi-join condition and keys
+ // create a SemiJoin with the semi-join condition and keys
RexNode semiJoinCondition =
RexUtil.composeConjunction(rexBuilder, joinFilters, true);
@@ -263,8 +281,8 @@ public class LoptSemiJoinOptimizer {
// find the best index
List<Integer> bestKeyOrder = new ArrayList<Integer>();
- LcsRowScanRel tmpFactRel =
- (LcsRowScanRel) factTable.toRel(
+ LcsTableScan tmpFactRel =
+ (LcsTableScan) factTable.toRel(
RelOptUtil.getContext(factRel.getCluster()));
LcsIndexOptimizer indexOptimizer = new LcsIndexOptimizer(tmpFactRel);
@@ -302,8 +320,8 @@ public class LoptSemiJoinOptimizer {
multiJoin.getNumFieldsInJoinFactor(factIdx),
semiJoinCondition);
}
- SemiJoinRel semiJoin =
- new SemiJoinRel(
+ SemiJoin semiJoin =
+ new SemiJoin(
factRel.getCluster(),
factRel.getCluster().traitSetOf(Convention.NONE),
factRel,
@@ -532,7 +550,7 @@ public class LoptSemiJoinOptimizer {
for (int i = 0; i < nJoinFactors; i++) {
Integer factIdx = sortedFactors[i];
RelNode factRel = chosenSemiJoins[factIdx];
- Map<Integer, SemiJoinRel> possibleDimensions =
+ Map<Integer, SemiJoin> possibleDimensions =
possibleSemiJoins.get(factIdx);
if (possibleDimensions == null) {
continue;
@@ -545,7 +563,7 @@ public class LoptSemiJoinOptimizer {
// fact table
Set<Integer> dimIdxes = possibleDimensions.keySet();
for (Integer dimIdx : dimIdxes) {
- SemiJoinRel semiJoin = possibleDimensions.get(dimIdx);
+ SemiJoin semiJoin = possibleDimensions.get(dimIdx);
if (semiJoin == null) {
continue;
}
@@ -566,13 +584,13 @@ public class LoptSemiJoinOptimizer {
// if a suitable dimension table has been found, associate it
// with the fact table in the chosenSemiJoins array; also remove
// the entry from possibleSemiJoins so we won't chose it again;
- // note that we create the SemiJoinRel using the chosen semijoins
+ // note that we create the SemiJoin using the chosen semijoins
// already created for each factor so any chaining of filters will
// be accounted for
if (bestDimIdx != -1) {
- SemiJoinRel semiJoin = possibleDimensions.get(bestDimIdx);
- SemiJoinRel chosenSemiJoin =
- new SemiJoinRel(
+ SemiJoin semiJoin = possibleDimensions.get(bestDimIdx);
+ SemiJoin chosenSemiJoin =
+ new SemiJoin(
factRel.getCluster(),
factRel.getCluster().traitSetOf(Convention.NONE),
factRel,
@@ -622,7 +640,7 @@ public class LoptSemiJoinOptimizer {
private double computeScore(
RelNode factRel,
RelNode dimRel,
- SemiJoinRel semiJoin) {
+ SemiJoin semiJoin) {
// Estimate savings as a result of applying semijoin filter on fact
// table. As a heuristic, the selectivity of the semijoin needs to
// be less than half. There may be instances where an even smaller
@@ -695,7 +713,7 @@ public class LoptSemiJoinOptimizer {
*/
private void removeJoin(
LoptMultiJoin multiJoin,
- SemiJoinRel semiJoin,
+ SemiJoin semiJoin,
int factIdx,
int dimIdx) {
// if the dimension can be removed because of another semijoin, then
@@ -774,7 +792,7 @@ public class LoptSemiJoinOptimizer {
* @param dimIdx index corresponding to dimension table
*/
private void removePossibleSemiJoin(
- Map<Integer, SemiJoinRel> possibleDimensions,
+ Map<Integer, SemiJoin> possibleDimensions,
Integer factIdx,
Integer dimIdx) {
// dimension table may not have a corresponding semijoin if it
@@ -824,12 +842,12 @@ public class LoptSemiJoinOptimizer {
}
/** Dummy class to allow code to compile. */
- private static class LcsRowScanRel {
+ private static class LcsTableScan {
}
/** Dummy class to allow code to compile. */
private static class LcsIndexOptimizer {
- public LcsIndexOptimizer(LcsRowScanRel rel) {}
+ public LcsIndexOptimizer(LcsTableScan rel) {}
public FemLocalIndex findSemiJoinIndexByCost(RelNode dimRel,
List<Integer> actualLeftKeys, List<Integer> rightKeys,
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/MultiJoin.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoin.java b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoin.java
index 2f252cd..cd70844 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoin.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoin.java
@@ -14,28 +14,36 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
-
-import java.util.*;
-
-import org.eigenbase.rel.*;
-import org.eigenbase.relopt.*;
-import org.eigenbase.reltype.*;
-import org.eigenbase.rex.*;
-import org.eigenbase.util.ImmutableIntList;
-import org.eigenbase.util.ImmutableNullableList;
-
-import net.hydromatic.linq4j.Ord;
+package org.apache.calcite.rel.rules;
+
+import org.apache.calcite.linq4j.Ord;
+import org.apache.calcite.plan.Convention;
+import org.apache.calcite.plan.RelOptCluster;
+import org.apache.calcite.plan.RelTraitSet;
+import org.apache.calcite.rel.AbstractRelNode;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.RelWriter;
+import org.apache.calcite.rel.core.JoinRelType;
+import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.util.ImmutableIntList;
+import org.apache.calcite.util.ImmutableNullableList;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
/**
- * A MultiJoinRel represents a join of N inputs, whereas other join relnodes
+ * A MultiJoin represents a join of N inputs, whereas regular Joins
* represent strictly binary joins.
*/
-public final class MultiJoinRel extends AbstractRelNode {
+public final class MultiJoin extends AbstractRelNode {
//~ Instance fields --------------------------------------------------------
private final List<RelNode> inputs;
@@ -51,10 +59,10 @@ public final class MultiJoinRel extends AbstractRelNode {
//~ Constructors -----------------------------------------------------------
/**
- * Constructs a MultiJoinRel.
+ * Constructs a MultiJoin.
*
* @param cluster cluster that join belongs to
- * @param inputs inputs into this multirel join
+ * @param inputs inputs into this multi-join
* @param joinFilter join filter applicable to this join node
* @param rowType row type of the join result of this node
* @param isFullOuterJoin true if the join is a full outer join
@@ -75,7 +83,7 @@ public final class MultiJoinRel extends AbstractRelNode {
* the input #
* @param postJoinFilter filter to be applied after the joins are
*/
- public MultiJoinRel(
+ public MultiJoin(
RelOptCluster cluster,
List<RelNode> inputs,
RexNode joinFilter,
@@ -108,7 +116,7 @@ public final class MultiJoinRel extends AbstractRelNode {
@Override public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) {
assert traitSet.containsIfApplicable(Convention.NONE);
- return new MultiJoinRel(
+ return new MultiJoin(
getCluster(),
inputs,
joinFilter,
@@ -170,20 +178,19 @@ public final class MultiJoinRel extends AbstractRelNode {
return inputs;
}
- @Override
- public List<RexNode> getChildExps() {
+ @Override public List<RexNode> getChildExps() {
return ImmutableList.of(joinFilter);
}
/**
- * @return join filters associated with this MultiJoinRel
+ * @return join filters associated with this MultiJoin
*/
public RexNode getJoinFilter() {
return joinFilter;
}
/**
- * @return true if the MultiJoinRel corresponds to a full outer join.
+ * @return true if the MultiJoin corresponds to a full outer join.
*/
public boolean isFullOuterJoin() {
return isFullOuterJoin;
@@ -228,7 +235,7 @@ public final class MultiJoinRel extends AbstractRelNode {
}
/**
- * @return post-join filter associated with this MultiJoinRel
+ * @return post-join filter associated with this MultiJoin
*/
public RexNode getPostJoinFilter() {
return postJoinFilter;
@@ -244,4 +251,4 @@ public final class MultiJoinRel extends AbstractRelNode {
}
}
-// End MultiJoinRel.java
+// End MultiJoin.java
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java
index 007e49e..62eef89 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinOptimizeBushyRule.java
@@ -14,7 +14,31 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
+package org.apache.calcite.rel.rules;
+
+import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.plan.RelOptUtil;
+import org.apache.calcite.prepare.CalcitePrepareImpl;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.JoinRelType;
+import org.apache.calcite.rel.core.RelFactories;
+import org.apache.calcite.rel.metadata.RelMdUtil;
+import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.rex.RexBuilder;
+import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexPermuteInputsShuttle;
+import org.apache.calcite.rex.RexUtil;
+import org.apache.calcite.rex.RexVisitor;
+import org.apache.calcite.util.BitSets;
+import org.apache.calcite.util.Pair;
+import org.apache.calcite.util.Util;
+import org.apache.calcite.util.mapping.Mappings;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
import java.io.PrintWriter;
import java.util.BitSet;
@@ -22,30 +46,15 @@ import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
-import org.eigenbase.rel.*;
-import org.eigenbase.rel.metadata.RelMdUtil;
-import org.eigenbase.rel.metadata.RelMetadataQuery;
-import org.eigenbase.relopt.*;
-import org.eigenbase.rex.*;
-import org.eigenbase.util.Pair;
-import org.eigenbase.util.Util;
-import org.eigenbase.util.mapping.Mappings;
-
-import net.hydromatic.optiq.prepare.OptiqPrepareImpl;
-import net.hydromatic.optiq.util.BitSets;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-
/**
* Planner rule that finds an approximately optimal ordering for join operators
* using a heuristic algorithm.
*
- * <p>It is triggered by the pattern {@link ProjectRel} ({@link MultiJoinRel}).
+ * <p>It is triggered by the pattern
+ * {@link org.apache.calcite.rel.logical.LogicalProject} ({@link MultiJoin}).
*
- * <p>It is similar to {@link org.eigenbase.rel.rules.LoptOptimizeJoinRule}.
+ * <p>It is similar to
+ * {@link org.apache.calcite.rel.rules.LoptOptimizeJoinRule}.
* {@code LoptOptimizeJoinRule} is only capable of producing left-deep joins;
* this rule is capable of producing bushy joins.
*
@@ -57,26 +66,26 @@ import com.google.common.collect.Lists;
* e.g. {@code t0.c1 = t1.c1 and t1.c2 = t0.c3}
* </ol>
*/
-public class OptimizeBushyJoinRule extends RelOptRule {
- public static final OptimizeBushyJoinRule INSTANCE =
- new OptimizeBushyJoinRule(RelFactories.DEFAULT_JOIN_FACTORY,
+public class MultiJoinOptimizeBushyRule extends RelOptRule {
+ public static final MultiJoinOptimizeBushyRule INSTANCE =
+ new MultiJoinOptimizeBushyRule(RelFactories.DEFAULT_JOIN_FACTORY,
RelFactories.DEFAULT_PROJECT_FACTORY);
private final RelFactories.JoinFactory joinFactory;
private final RelFactories.ProjectFactory projectFactory;
private final PrintWriter pw =
- OptiqPrepareImpl.DEBUG ? new PrintWriter(System.out, true) : null;
+ CalcitePrepareImpl.DEBUG ? new PrintWriter(System.out, true) : null;
- /** Creates an OptimizeBushyJoinRule. */
- public OptimizeBushyJoinRule(RelFactories.JoinFactory joinFactory,
+ /** Creates an MultiJoinOptimizeBushyRule. */
+ public MultiJoinOptimizeBushyRule(RelFactories.JoinFactory joinFactory,
RelFactories.ProjectFactory projectFactory) {
- super(operand(MultiJoinRel.class, any()));
+ super(operand(MultiJoin.class, any()));
this.joinFactory = joinFactory;
this.projectFactory = projectFactory;
}
@Override public void onMatch(RelOptRuleCall call) {
- final MultiJoinRel multiJoinRel = call.rel(0);
+ final MultiJoin multiJoinRel = call.rel(0);
final RexBuilder rexBuilder = multiJoinRel.getCluster().getRexBuilder();
final LoptMultiJoin multiJoin = new LoptMultiJoin(multiJoinRel);
@@ -369,4 +378,4 @@ public class OptimizeBushyJoinRule extends RelOptRule {
}
}
-// End OptimizeBushyJoinRule.java
+// End MultiJoinOptimizeBushyRule.java
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java
index a23f57b..4feb04e 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java
@@ -14,19 +14,28 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
+package org.apache.calcite.rel.rules;
-import org.eigenbase.rel.*;
-import org.eigenbase.relopt.*;
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.plan.RelOptRuleOperand;
+import org.apache.calcite.plan.RelOptUtil;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.logical.LogicalJoin;
+import org.apache.calcite.rel.logical.LogicalProject;
/**
- * PullUpProjectsOnTopOfMultiJoinRule implements the rule for pulling {@link
- * ProjectRel}s that are on top of a {@link MultiJoinRel} and beneath a {@link
- * JoinRel} so the {@link ProjectRel} appears above the {@link JoinRel}. In the
- * process of doing so, also save away information about the respective fields
- * that are referenced in the expressions in the {@link ProjectRel} we're
- * pulling up, as well as the join condition, in the resultant {@link
- * MultiJoinRel}s
+ * MultiJoinProjectTransposeRule implements the rule for pulling
+ * {@link org.apache.calcite.rel.logical.LogicalProject}s that are on top of a
+ * {@link MultiJoin} and beneath a
+ * {@link org.apache.calcite.rel.logical.LogicalJoin} so the
+ * {@link org.apache.calcite.rel.logical.LogicalProject} appears above the
+ * {@link org.apache.calcite.rel.logical.LogicalJoin}.
+ *
+ * <p>In the process of doing
+ * so, also save away information about the respective fields that are
+ * referenced in the expressions in the
+ * {@link org.apache.calcite.rel.logical.LogicalProject} we're pulling up, as
+ * well as the join condition, in the resultant {@link MultiJoin}s
*
* <p>For example, if we have the following subselect:
*
@@ -34,49 +43,48 @@ import org.eigenbase.relopt.*;
* (select X.x1, Y.y1 from X, Y
* where X.x2 = Y.y2 and X.x3 = 1 and Y.y3 = 2)</pre>
*
- * <p>The {@link MultiJoinRel} associated with (X, Y) associates x1 with X and
+ * <p>The {@link MultiJoin} associated with (X, Y) associates x1 with X and
* y1 with Y. Although x3 and y3 need to be read due to the filters, they are
* not required after the row scan has completed and therefore are not saved.
* The join fields, x2 and y2, are also tracked separately.
*
- * <p>Note that by only pulling up projects that are on top of {@link
- * MultiJoinRel}s, we preserve projections on top of row scans.
+ * <p>Note that by only pulling up projects that are on top of
+ * {@link MultiJoin}s, we preserve projections on top of row scans.
*
- * <p>See the superclass for details on restrictions regarding which {@link
- * ProjectRel}s cannot be pulled.
+ * <p>See the superclass for details on restrictions regarding which
+ * {@link org.apache.calcite.rel.logical.LogicalProject}s cannot be pulled.
*/
-public class PullUpProjectsOnTopOfMultiJoinRule
- extends PullUpProjectsAboveJoinRule {
+public class MultiJoinProjectTransposeRule extends JoinProjectTransposeRule {
//~ Static fields/initializers ---------------------------------------------
- public static final PullUpProjectsOnTopOfMultiJoinRule MULTI_BOTH_PROJECT =
- new PullUpProjectsOnTopOfMultiJoinRule(
- operand(JoinRel.class,
- operand(ProjectRel.class,
- operand(MultiJoinRel.class, any())),
- operand(ProjectRel.class,
- operand(MultiJoinRel.class, any()))),
- "PullUpProjectsOnTopOfMultiJoinRule: with two ProjectRel children");
+ public static final MultiJoinProjectTransposeRule MULTI_BOTH_PROJECT =
+ new MultiJoinProjectTransposeRule(
+ operand(LogicalJoin.class,
+ operand(LogicalProject.class,
+ operand(MultiJoin.class, any())),
+ operand(LogicalProject.class,
+ operand(MultiJoin.class, any()))),
+ "MultiJoinProjectTransposeRule: with two LogicalProject children");
- public static final PullUpProjectsOnTopOfMultiJoinRule MULTI_LEFT_PROJECT =
- new PullUpProjectsOnTopOfMultiJoinRule(
- operand(JoinRel.class,
+ public static final MultiJoinProjectTransposeRule MULTI_LEFT_PROJECT =
+ new MultiJoinProjectTransposeRule(
+ operand(LogicalJoin.class,
some(
- operand(ProjectRel.class,
- operand(MultiJoinRel.class, any())))),
- "PullUpProjectsOnTopOfMultiJoinRule: with ProjectRel on left");
+ operand(LogicalProject.class,
+ operand(MultiJoin.class, any())))),
+ "MultiJoinProjectTransposeRule: with LogicalProject on left");
- public static final PullUpProjectsOnTopOfMultiJoinRule MULTI_RIGHT_PROJECT =
- new PullUpProjectsOnTopOfMultiJoinRule(
- operand(JoinRel.class,
+ public static final MultiJoinProjectTransposeRule MULTI_RIGHT_PROJECT =
+ new MultiJoinProjectTransposeRule(
+ operand(LogicalJoin.class,
operand(RelNode.class, any()),
- operand(ProjectRel.class,
- operand(MultiJoinRel.class, any()))),
- "PullUpProjectsOnTopOfMultiJoinRule: with ProjectRel on right");
+ operand(LogicalProject.class,
+ operand(MultiJoin.class, any()))),
+ "MultiJoinProjectTransposeRule: with LogicalProject on right");
//~ Constructors -----------------------------------------------------------
- public PullUpProjectsOnTopOfMultiJoinRule(
+ public MultiJoinProjectTransposeRule(
RelOptRuleOperand operand,
String description) {
super(operand, description);
@@ -84,18 +92,18 @@ public class PullUpProjectsOnTopOfMultiJoinRule
//~ Methods ----------------------------------------------------------------
- // override PullUpProjectsAboveJoinRule
+ // override JoinProjectTransposeRule
protected boolean hasLeftChild(RelOptRuleCall call) {
return call.rels.length != 4;
}
- // override PullUpProjectsAboveJoinRule
+ // override JoinProjectTransposeRule
protected boolean hasRightChild(RelOptRuleCall call) {
return call.rels.length > 3;
}
- // override PullUpProjectsAboveJoinRule
- protected ProjectRel getRightChild(RelOptRuleCall call) {
+ // override JoinProjectTransposeRule
+ protected LogicalProject getRightChild(RelOptRuleCall call) {
if (call.rels.length == 4) {
return call.rel(2);
} else {
@@ -103,14 +111,14 @@ public class PullUpProjectsOnTopOfMultiJoinRule
}
}
- // override PullUpProjectsAboveJoinRule
+ // override JoinProjectTransposeRule
protected RelNode getProjectChild(
RelOptRuleCall call,
- ProjectRel project,
+ LogicalProject project,
boolean leftChild) {
- // locate the appropriate MultiJoinRel based on which rule was fired
+ // locate the appropriate MultiJoin based on which rule was fired
// and which projection we're dealing with
- MultiJoinRel multiJoin;
+ MultiJoin multiJoin;
if (leftChild) {
multiJoin = call.rel(2);
} else if (call.rels.length == 4) {
@@ -119,10 +127,10 @@ public class PullUpProjectsOnTopOfMultiJoinRule
multiJoin = call.rel(4);
}
- // create a new MultiJoinRel that reflects the columns in the projection
- // above the MultiJoinRel
+ // create a new MultiJoin that reflects the columns in the projection
+ // above the MultiJoin
return RelOptUtil.projectMultiJoin(multiJoin, project);
}
}
-// End PullUpProjectsOnTopOfMultiJoinRule.java
+// End MultiJoinProjectTransposeRule.java
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java
index 999b7fa..40f4aab 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java
@@ -14,42 +14,55 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
+package org.apache.calcite.rel.rules;
-import java.util.*;
+import org.apache.calcite.plan.RelOptCluster;
+import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.rel.RelCollation;
+import org.apache.calcite.rel.logical.LogicalCalc;
+import org.apache.calcite.rel.logical.LogicalProject;
+import org.apache.calcite.rex.RexBuilder;
+import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexOver;
+import org.apache.calcite.rex.RexProgram;
+import org.apache.calcite.rex.RexProgramBuilder;
+import org.apache.calcite.util.Pair;
-import org.eigenbase.rel.*;
-import org.eigenbase.relopt.*;
-import org.eigenbase.rex.*;
-import org.eigenbase.util.Pair;
+import java.util.Collections;
/**
- * Planner rule which merges a {@link ProjectRel} and a {@link CalcRel}. The
- * resulting {@link CalcRel} has the same project list as the original {@link
- * ProjectRel}, but expressed in terms of the original {@link CalcRel}'s inputs.
+ * Planner rule which merges a
+ * {@link org.apache.calcite.rel.logical.LogicalProject} and a
+ * {@link org.apache.calcite.rel.logical.LogicalCalc}.
*
- * @see MergeFilterOntoCalcRule
+ * <p>The resulting {@link org.apache.calcite.rel.logical.LogicalCalc} has the
+ * same project list as the original
+ * {@link org.apache.calcite.rel.logical.LogicalProject}, but expressed in terms
+ * of the original {@link org.apache.calcite.rel.logical.LogicalCalc}'s inputs.
+ *
+ * @see FilterCalcMergeRule
*/
-public class MergeProjectOntoCalcRule extends RelOptRule {
+public class ProjectCalcMergeRule extends RelOptRule {
//~ Static fields/initializers ---------------------------------------------
- public static final MergeProjectOntoCalcRule INSTANCE =
- new MergeProjectOntoCalcRule();
+ public static final ProjectCalcMergeRule INSTANCE =
+ new ProjectCalcMergeRule();
//~ Constructors -----------------------------------------------------------
- private MergeProjectOntoCalcRule() {
+ private ProjectCalcMergeRule() {
super(
operand(
- ProjectRel.class,
- operand(CalcRel.class, any())));
+ LogicalProject.class,
+ operand(LogicalCalc.class, any())));
}
//~ Methods ----------------------------------------------------------------
public void onMatch(RelOptRuleCall call) {
- final ProjectRel project = call.rel(0);
- final CalcRel calc = call.rel(1);
+ final LogicalProject project = call.rel(0);
+ final LogicalCalc calc = call.rel(1);
// Don't merge a project which contains windowed aggregates onto a
// calc. That would effectively be pushing a windowed aggregate down
@@ -65,8 +78,8 @@ public class MergeProjectOntoCalcRule extends RelOptRule {
project.getRowType(),
cluster.getRexBuilder());
if (RexOver.containsOver(program)) {
- CalcRel projectAsCalc =
- new CalcRel(
+ LogicalCalc projectAsCalc =
+ new LogicalCalc(
cluster,
project.getTraitSet(),
calc,
@@ -95,11 +108,11 @@ public class MergeProjectOntoCalcRule extends RelOptRule {
topProgram,
bottomProgram,
rexBuilder);
- final CalcRel newCalc =
- new CalcRel(
+ final LogicalCalc newCalc =
+ new LogicalCalc(
cluster,
project.getTraitSet(),
- calc.getChild(),
+ calc.getInput(),
project.getRowType(),
mergedProgram,
Collections.<RelCollation>emptyList());
@@ -107,4 +120,4 @@ public class MergeProjectOntoCalcRule extends RelOptRule {
}
}
-// End MergeProjectOntoCalcRule.java
+// End ProjectCalcMergeRule.java
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/ProjectFilterTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectFilterTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectFilterTransposeRule.java
index 70ba40e..0fb7918 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectFilterTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectFilterTransposeRule.java
@@ -14,19 +14,23 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
+package org.apache.calcite.rel.rules;
-import org.eigenbase.rel.*;
-import org.eigenbase.relopt.*;
-import org.eigenbase.rex.*;
+import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.logical.LogicalFilter;
+import org.apache.calcite.rel.logical.LogicalProject;
+import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexOver;
/**
- * PushProjectPastFilterRule implements the rule for pushing a projection past a
- * filter.
+ * Planner rule that pushes a {@link org.apache.calcite.rel.core.Project}
+ * past a {@link org.apache.calcite.rel.core.Filter}.
*/
-public class PushProjectPastFilterRule extends RelOptRule {
- public static final PushProjectPastFilterRule INSTANCE =
- new PushProjectPastFilterRule(PushProjector.ExprCondition.FALSE);
+public class ProjectFilterTransposeRule extends RelOptRule {
+ public static final ProjectFilterTransposeRule INSTANCE =
+ new ProjectFilterTransposeRule(PushProjector.ExprCondition.FALSE);
//~ Instance fields --------------------------------------------------------
@@ -38,17 +42,17 @@ public class PushProjectPastFilterRule extends RelOptRule {
//~ Constructors -----------------------------------------------------------
/**
- * Creates a PushProjectPastFilterRule.
+ * Creates a ProjectFilterTransposeRule.
*
* @param preserveExprCondition Condition for expressions that should be
* preserved in the projection
*/
- private PushProjectPastFilterRule(
+ private ProjectFilterTransposeRule(
PushProjector.ExprCondition preserveExprCondition) {
super(
operand(
- ProjectRel.class,
- operand(FilterRel.class, any())));
+ LogicalProject.class,
+ operand(LogicalFilter.class, any())));
this.preserveExprCondition = preserveExprCondition;
}
@@ -56,18 +60,18 @@ public class PushProjectPastFilterRule extends RelOptRule {
// implement RelOptRule
public void onMatch(RelOptRuleCall call) {
- ProjectRel origProj;
- FilterRel filterRel;
+ LogicalProject origProj;
+ LogicalFilter filter;
if (call.rels.length == 2) {
origProj = call.rel(0);
- filterRel = call.rel(1);
+ filter = call.rel(1);
} else {
origProj = null;
- filterRel = call.rel(0);
+ filter = call.rel(0);
}
- RelNode rel = filterRel.getChild();
- RexNode origFilter = filterRel.getCondition();
+ RelNode rel = filter.getInput();
+ RexNode origFilter = filter.getCondition();
if ((origProj != null)
&& RexOver.containsOver(origProj.getProjects(), null)) {
@@ -90,4 +94,4 @@ public class PushProjectPastFilterRule extends RelOptRule {
}
}
-// End PushProjectPastFilterRule.java
+// End ProjectFilterTransposeRule.java
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/ProjectJoinTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectJoinTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectJoinTransposeRule.java
index 9d6eddb..5379110 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectJoinTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectJoinTransposeRule.java
@@ -14,23 +14,28 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
+package org.apache.calcite.rel.rules;
-import java.util.*;
+import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.Join;
+import org.apache.calcite.rel.logical.LogicalProject;
+import org.apache.calcite.rel.type.RelDataTypeField;
+import org.apache.calcite.rex.RexNode;
-import org.eigenbase.rel.*;
-import org.eigenbase.relopt.*;
-import org.eigenbase.reltype.*;
-import org.eigenbase.rex.*;
+import java.util.ArrayList;
+import java.util.List;
/**
- * PushProjectPastJoinRule implements the rule for pushing a projection past a
- * join by splitting the projection into a projection on top of each child of
+ * Planner rule that pushes a {@link org.apache.calcite.rel.core.Project}
+ * past a {@link org.apache.calcite.rel.core.Join}
+ * by splitting the projection into a projection on top of each child of
* the join.
*/
-public class PushProjectPastJoinRule extends RelOptRule {
- public static final PushProjectPastJoinRule INSTANCE =
- new PushProjectPastJoinRule(PushProjector.ExprCondition.FALSE);
+public class ProjectJoinTransposeRule extends RelOptRule {
+ public static final ProjectJoinTransposeRule INSTANCE =
+ new ProjectJoinTransposeRule(PushProjector.ExprCondition.FALSE);
//~ Instance fields --------------------------------------------------------
@@ -42,16 +47,16 @@ public class PushProjectPastJoinRule extends RelOptRule {
//~ Constructors -----------------------------------------------------------
/**
- * Creates a PushProjectPastJoinRule with an explicit condition.
+ * Creates a ProjectJoinTransposeRule with an explicit condition.
*
* @param preserveExprCondition Condition for expressions that should be
* preserved in the projection
*/
- private PushProjectPastJoinRule(
+ private ProjectJoinTransposeRule(
PushProjector.ExprCondition preserveExprCondition) {
super(
- operand(ProjectRel.class,
- operand(JoinRelBase.class, any())));
+ operand(LogicalProject.class,
+ operand(Join.class, any())));
this.preserveExprCondition = preserveExprCondition;
}
@@ -59,8 +64,8 @@ public class PushProjectPastJoinRule extends RelOptRule {
// implement RelOptRule
public void onMatch(RelOptRuleCall call) {
- ProjectRel origProj = call.rel(0);
- final JoinRelBase join = call.rel(1);
+ LogicalProject origProj = call.rel(0);
+ final Join join = call.rel(1);
// locate all fields referenced in the projection and join condition;
// determine which inputs are referenced in the projection and
@@ -109,7 +114,7 @@ public class PushProjectPastJoinRule extends RelOptRule {
}
// create a new join with the projected children
- JoinRelBase newJoinRel =
+ Join newJoinRel =
join.copy(
join.getTraitSet(),
newJoinFilter,
@@ -127,4 +132,4 @@ public class PushProjectPastJoinRule extends RelOptRule {
}
}
-// End PushProjectPastJoinRule.java
+// End ProjectJoinTransposeRule.java
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/ProjectMergeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectMergeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectMergeRule.java
index 78c67af..96559cf 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectMergeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectMergeRule.java
@@ -14,30 +14,36 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
-
-import java.util.*;
-
-import org.eigenbase.rel.*;
-import org.eigenbase.rel.RelFactories.ProjectFactory;
-import org.eigenbase.relopt.*;
-import org.eigenbase.rex.*;
-import org.eigenbase.util.Permutation;
+package org.apache.calcite.rel.rules;
+
+import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.plan.RelOptUtil;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.core.RelFactories;
+import org.apache.calcite.rel.core.RelFactories.ProjectFactory;
+import org.apache.calcite.rex.RexBuilder;
+import org.apache.calcite.rex.RexLocalRef;
+import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexProgram;
+import org.apache.calcite.rex.RexProgramBuilder;
+import org.apache.calcite.util.Permutation;
+
+import java.util.ArrayList;
+import java.util.List;
/**
- * MergeProjectRule merges a {@link ProjectRelBase} into
- * another {@link ProjectRelBase},
+ * ProjectMergeRule merges a {@link org.apache.calcite.rel.core.Project} into
+ * another {@link org.apache.calcite.rel.core.Project},
* provided the projects aren't projecting identical sets of input references.
*/
-public class MergeProjectRule extends RelOptRule {
- public static final MergeProjectRule INSTANCE =
- new MergeProjectRule();
+public class ProjectMergeRule extends RelOptRule {
+ public static final ProjectMergeRule INSTANCE = new ProjectMergeRule();
//~ Instance fields --------------------------------------------------------
- /**
- * if true, always merge projects
- */
+ /** Whether to always merge projects. */
private final boolean force;
private final ProjectFactory projectFactory;
@@ -45,22 +51,22 @@ public class MergeProjectRule extends RelOptRule {
//~ Constructors -----------------------------------------------------------
/**
- * Creates a MergeProjectRule.
+ * Creates a ProjectMergeRule.
*/
- private MergeProjectRule() {
+ private ProjectMergeRule() {
this(false, RelFactories.DEFAULT_PROJECT_FACTORY);
}
/**
- * Creates a MergeProjectRule, specifying whether to always merge projects.
+ * Creates a ProjectMergeRule, specifying whether to always merge projects.
*
* @param force Whether to always merge projects
*/
- public MergeProjectRule(boolean force, ProjectFactory pFactory) {
+ public ProjectMergeRule(boolean force, ProjectFactory pFactory) {
super(
- operand(ProjectRelBase.class,
- operand(ProjectRelBase.class, any())),
- "MergeProjectRule" + (force ? ": force mode" : ""));
+ operand(Project.class,
+ operand(Project.class, any())),
+ "ProjectMergeRule" + (force ? ": force mode" : ""));
this.force = force;
projectFactory = pFactory;
}
@@ -69,8 +75,8 @@ public class MergeProjectRule extends RelOptRule {
// implement RelOptRule
public void onMatch(RelOptRuleCall call) {
- ProjectRelBase topProject = call.rel(0);
- ProjectRelBase bottomProject = call.rel(1);
+ Project topProject = call.rel(0);
+ Project bottomProject = call.rel(1);
RexBuilder rexBuilder = topProject.getCluster().getRexBuilder();
// If one or both projects are permutations, short-circuit the complex logic
@@ -78,18 +84,18 @@ public class MergeProjectRule extends RelOptRule {
final Permutation topPermutation = topProject.getPermutation();
if (topPermutation != null) {
if (topPermutation.isIdentity()) {
- // Let RemoveTrivialProjectRule handle this.
+ // Let ProjectRemoveRule handle this.
return;
}
final Permutation bottomPermutation = bottomProject.getPermutation();
if (bottomPermutation != null) {
if (bottomPermutation.isIdentity()) {
- // Let RemoveTrivialProjectRule handle this.
+ // Let ProjectRemoveRule handle this.
return;
}
final Permutation product = topPermutation.product(bottomPermutation);
call.transformTo(
- RelOptUtil.projectMapping(bottomProject.getChild(),
+ RelOptUtil.projectMapping(bottomProject.getInput(),
product.inverse(), topProject.getRowType().getFieldNames(),
projectFactory));
return;
@@ -98,7 +104,7 @@ public class MergeProjectRule extends RelOptRule {
// if we're not in force mode and the two projects reference identical
// inputs, then return and either let FennelRenameRule or
- // RemoveTrivialProjectRule replace the projects
+ // ProjectRemoveRule replace the projects
if (!force) {
if (RelOptUtil.checkProjAndChildInputs(topProject, false)) {
return;
@@ -108,7 +114,7 @@ public class MergeProjectRule extends RelOptRule {
// create a RexProgram for the bottom project
RexProgram bottomProgram =
RexProgram.create(
- bottomProject.getChild().getRowType(),
+ bottomProject.getInput().getRowType(),
bottomProject.getProjects(),
null,
bottomProject.getRowType(),
@@ -142,11 +148,11 @@ public class MergeProjectRule extends RelOptRule {
// replace the two projects with a combined projection
RelNode newProjectRel = projectFactory.createProject(
- bottomProject.getChild(), newProjExprs,
+ bottomProject.getInput(), newProjExprs,
topProject.getRowType().getFieldNames());
call.transformTo(newProjectRel);
}
}
-// End MergeProjectRule.java
+// End ProjectMergeRule.java
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java
index fd300c9..065738e 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java
@@ -14,37 +14,42 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
+package org.apache.calcite.rel.rules;
-import org.eigenbase.rel.*;
-import org.eigenbase.relopt.*;
+import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.plan.RelOptUtil;
+import org.apache.calcite.rel.logical.LogicalProject;
/**
- * PushProjectIntoMultiJoinRule implements the rule for pushing projection
- * information from a {@link ProjectRel} into the {@link MultiJoinRel} that is
- * input into the {@link ProjectRel}.
+ * Planner rule that pushes
+ * {@link org.apache.calcite.rel.core.Project}
+ * into a {@link MultiJoin},
+ * creating a richer {@code MultiJoin}.
+ *
+ * @see org.apache.calcite.rel.rules.FilterMultiJoinMergeRule
*/
-public class PushProjectIntoMultiJoinRule extends RelOptRule {
- public static final PushProjectIntoMultiJoinRule INSTANCE =
- new PushProjectIntoMultiJoinRule();
+public class ProjectMultiJoinMergeRule extends RelOptRule {
+ public static final ProjectMultiJoinMergeRule INSTANCE =
+ new ProjectMultiJoinMergeRule();
//~ Constructors -----------------------------------------------------------
/**
- * Creates a PushProjectIntoMultiJoinRule.
+ * Creates a ProjectMultiJoinMergeRule.
*/
- private PushProjectIntoMultiJoinRule() {
+ private ProjectMultiJoinMergeRule() {
super(
operand(
- ProjectRel.class,
- operand(MultiJoinRel.class, any())));
+ LogicalProject.class,
+ operand(MultiJoin.class, any())));
}
//~ Methods ----------------------------------------------------------------
public void onMatch(RelOptRuleCall call) {
- ProjectRel project = call.rel(0);
- MultiJoinRel multiJoin = call.rel(1);
+ LogicalProject project = call.rel(0);
+ MultiJoin multiJoin = call.rel(1);
// if all inputs have their projFields set, then projection information
// has already been pushed into each input
@@ -59,12 +64,12 @@ public class PushProjectIntoMultiJoinRule extends RelOptRule {
return;
}
- // create a new MultiJoinRel that reflects the columns in the projection
- // above the MultiJoinRel
- MultiJoinRel newMultiJoin =
+ // create a new MultiJoin that reflects the columns in the projection
+ // above the MultiJoin
+ MultiJoin newMultiJoin =
RelOptUtil.projectMultiJoin(multiJoin, project);
- ProjectRel newProject =
- (ProjectRel) RelOptUtil.createProject(
+ LogicalProject newProject =
+ (LogicalProject) RelOptUtil.createProject(
newMultiJoin,
project.getProjects(),
project.getRowType().getFieldNames());
@@ -73,4 +78,4 @@ public class PushProjectIntoMultiJoinRule extends RelOptRule {
}
}
-// End PushProjectIntoMultiJoinRule.java
+// End ProjectMultiJoinMergeRule.java
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
index c84098b..b74f532 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
@@ -14,54 +14,58 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
+package org.apache.calcite.rel.rules;
-import java.util.List;
-
-import org.eigenbase.rel.*;
-import org.eigenbase.relopt.*;
-import org.eigenbase.reltype.*;
-import org.eigenbase.rex.*;
+import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeField;
+import org.apache.calcite.rex.RexInputRef;
+import org.apache.calcite.rex.RexNode;
import com.google.common.base.Predicate;
+import java.util.List;
+
/**
- * Rule that, given a {@link ProjectRelBase} node that merely returns its input,
- * converts the node into its child.
+ * Planner rule that,
+ * given a {@link org.apache.calcite.rel.core.Project} node that
+ * merely returns its input, converts the node into its child.
*
- * <p>For example, <code>ProjectRel(ArrayReader(a), {$input0})</code> becomes
+ * <p>For example, <code>Project(ArrayReader(a), {$input0})</code> becomes
* <code>ArrayReader(a)</code>.</p>
*
- * @see org.eigenbase.rel.rules.RemoveTrivialCalcRule
- * @see org.eigenbase.rel.rules.MergeProjectRule
+ * @see CalcRemoveRule
+ * @see ProjectMergeRule
*/
-public class RemoveTrivialProjectRule extends RelOptRule {
+public class ProjectRemoveRule extends RelOptRule {
//~ Static fields/initializers ---------------------------------------------
- private static final Predicate<ProjectRelBase> PREDICATE =
- new Predicate<ProjectRelBase>() {
- public boolean apply(ProjectRelBase input) {
+ private static final Predicate<Project> PREDICATE =
+ new Predicate<Project>() {
+ public boolean apply(Project input) {
return isTrivial(input);
}
};
- public static final RemoveTrivialProjectRule INSTANCE =
- new RemoveTrivialProjectRule();
+ public static final ProjectRemoveRule INSTANCE = new ProjectRemoveRule();
//~ Constructors -----------------------------------------------------------
- private RemoveTrivialProjectRule() {
+ private ProjectRemoveRule() {
// Create a specialized operand to detect non-matches early. This keeps
// the rule queue short.
- super(operand(ProjectRelBase.class, null, PREDICATE, any()));
+ super(operand(Project.class, null, PREDICATE, any()));
}
//~ Methods ----------------------------------------------------------------
public void onMatch(RelOptRuleCall call) {
- ProjectRelBase project = call.rel(0);
+ Project project = call.rel(0);
assert isTrivial(project);
- RelNode stripped = project.getChild();
+ RelNode stripped = project.getInput();
RelNode child = call.getPlanner().register(stripped, project);
call.transformTo(child);
}
@@ -70,12 +74,12 @@ public class RemoveTrivialProjectRule extends RelOptRule {
* Returns the child of a project if the project is trivial, otherwise
* the project itself.
*/
- public static RelNode strip(ProjectRelBase project) {
- return isTrivial(project) ? project.getChild() : project;
+ public static RelNode strip(Project project) {
+ return isTrivial(project) ? project.getInput() : project;
}
- public static boolean isTrivial(ProjectRelBase project) {
- RelNode child = project.getChild();
+ public static boolean isTrivial(Project project) {
+ RelNode child = project.getInput();
final RelDataType childRowType = child.getRowType();
if (!childRowType.isStruct()) {
return false;
@@ -83,19 +87,15 @@ public class RemoveTrivialProjectRule extends RelOptRule {
if (!project.isBoxed()) {
return false;
}
- if (!isIdentity(
- project.getProjects(),
- project.getRowType(),
+ if (!isIdentity(project.getProjects(), project.getRowType(),
childRowType)) {
return false;
}
return true;
}
- public static boolean isIdentity(
- List<? extends RexNode> exps,
- RelDataType rowType,
- RelDataType childRowType) {
+ public static boolean isIdentity(List<? extends RexNode> exps,
+ RelDataType rowType, RelDataType childRowType) {
List<RelDataTypeField> fields = rowType.getFieldList();
List<RelDataTypeField> childFields = childRowType.getFieldList();
int fieldCount = childFields.size();
@@ -119,4 +119,4 @@ public class RemoveTrivialProjectRule extends RelOptRule {
}
}
-// End RemoveTrivialProjectRule.java
+// End ProjectRemoveRule.java
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/ProjectSetOpTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectSetOpTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectSetOpTransposeRule.java
index 845deee..2647c5c 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectSetOpTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectSetOpTransposeRule.java
@@ -14,22 +14,30 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
+package org.apache.calcite.rel.rules;
-import java.util.*;
+import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.SetOp;
+import org.apache.calcite.rel.logical.LogicalProject;
+import org.apache.calcite.rex.RexInputRef;
-import org.eigenbase.rel.*;
-import org.eigenbase.relopt.*;
-import org.eigenbase.rex.*;
+import java.util.ArrayList;
+import java.util.List;
/**
- * PushProjectPastSetOpRule implements the rule for pushing a {@link ProjectRel}
- * past a {@link SetOpRel}. The children of the {@link SetOpRel} will project
- * only the {@link RexInputRef}s referenced in the original {@link ProjectRel}.
+ * Planner rule that pushes
+ * a {@link org.apache.calcite.rel.logical.LogicalProject}
+ * past a {@link org.apache.calcite.rel.core.SetOp}.
+ *
+ * <p>The children of the {@code SetOp} will project
+ * only the {@link RexInputRef}s referenced in the original
+ * {@code LogicalProject}.
*/
-public class PushProjectPastSetOpRule extends RelOptRule {
- public static final PushProjectPastSetOpRule INSTANCE =
- new PushProjectPastSetOpRule(PushProjector.ExprCondition.FALSE);
+public class ProjectSetOpTransposeRule extends RelOptRule {
+ public static final ProjectSetOpTransposeRule INSTANCE =
+ new ProjectSetOpTransposeRule(PushProjector.ExprCondition.FALSE);
//~ Instance fields --------------------------------------------------------
@@ -41,17 +49,17 @@ public class PushProjectPastSetOpRule extends RelOptRule {
//~ Constructors -----------------------------------------------------------
/**
- * Creates a PushProjectPastSetOpRule with an explicit condition whether
+ * Creates a ProjectSetOpTransposeRule with an explicit condition whether
* to preserve expressions.
*
* @param preserveExprCondition Condition whether to preserve expressions
*/
- public PushProjectPastSetOpRule(
+ public ProjectSetOpTransposeRule(
PushProjector.ExprCondition preserveExprCondition) {
super(
operand(
- ProjectRel.class,
- operand(SetOpRel.class, any())));
+ LogicalProject.class,
+ operand(SetOp.class, any())));
this.preserveExprCondition = preserveExprCondition;
}
@@ -59,17 +67,17 @@ public class PushProjectPastSetOpRule extends RelOptRule {
// implement RelOptRule
public void onMatch(RelOptRuleCall call) {
- ProjectRel origProj = call.rel(0);
- SetOpRel setOpRel = call.rel(1);
+ LogicalProject origProj = call.rel(0);
+ SetOp setOp = call.rel(1);
// cannot push project past a distinct
- if (!setOpRel.all) {
+ if (!setOp.all) {
return;
}
// locate all fields referenced in the projection
PushProjector pushProject =
- new PushProjector(origProj, null, setOpRel, preserveExprCondition);
+ new PushProjector(origProj, null, setOp, preserveExprCondition);
pushProject.locateAllRefs();
List<RelNode> newSetOpInputs = new ArrayList<RelNode>();
@@ -80,10 +88,10 @@ public class PushProjectPastSetOpRule extends RelOptRule {
// to try to keep expensive expressions above the join,
// because UNION ALL does not have any filtering effect,
// and it is the only operator this rule currently acts on
- for (RelNode input : setOpRel.getInputs()) {
+ for (RelNode input : setOp.getInputs()) {
// be lazy: produce two ProjectRels, and let another rule
// merge them (could probably just clone origProj instead?)
- ProjectRel p =
+ LogicalProject p =
pushProject.createProjectRefsAndExprs(
input, true, false);
newSetOpInputs.add(
@@ -91,11 +99,11 @@ public class PushProjectPastSetOpRule extends RelOptRule {
}
// create a new setop whose children are the ProjectRels created above
- SetOpRel newSetOpRel =
- setOpRel.copy(setOpRel.getTraitSet(), newSetOpInputs);
+ SetOp newSetOp =
+ setOp.copy(setOp.getTraitSet(), newSetOpInputs);
- call.transformTo(newSetOpRel);
+ call.transformTo(newSetOp);
}
}
-// End PushProjectPastSetOpRule.java
+// End ProjectSetOpTransposeRule.java
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java
index 6803e3c..fe53113 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java
@@ -14,45 +14,50 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
+package org.apache.calcite.rel.rules;
-import org.eigenbase.rel.*;
-import org.eigenbase.relopt.*;
+import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.Sort;
+import org.apache.calcite.rel.logical.LogicalProject;
import com.google.common.collect.ImmutableList;
/**
- * Planner rule that pushes a {@link ProjectRel} past a {@link SortRel}.
+ * Planner rule that pushes
+ * a {@link org.apache.calcite.rel.logical.LogicalProject}
+ * past a {@link org.apache.calcite.rel.core.Sort}.
+ *
+ * @see org.apache.calcite.rel.rules.SortProjectTransposeRule
*/
-public class PushProjectPastSortRule extends RelOptRule {
- public static final PushProjectPastSortRule INSTANCE =
- new PushProjectPastSortRule();
+public class ProjectSortTransposeRule extends RelOptRule {
+ public static final ProjectSortTransposeRule INSTANCE =
+ new ProjectSortTransposeRule();
//~ Constructors -----------------------------------------------------------
/**
- * Creates a PushProjectPastSortRule.
+ * Creates a ProjectSortTransposeRule.
*/
- private PushProjectPastSortRule() {
+ private ProjectSortTransposeRule() {
super(
- operand(
- ProjectRel.class,
- operand(SortRel.class, any())));
+ operand(LogicalProject.class,
+ operand(Sort.class, any())));
}
//~ Methods ----------------------------------------------------------------
- // implement RelOptRule
public void onMatch(RelOptRuleCall call) {
- ProjectRel project = call.rel(0);
- SortRel sort = call.rel(1);
- if (sort.getClass() != SortRel.class) {
+ LogicalProject project = call.rel(0);
+ Sort sort = call.rel(1);
+ if (sort.getClass() != Sort.class) {
return;
}
RelNode newProject =
project.copy(
- project.getTraitSet(), ImmutableList.of(sort.getChild()));
- final SortRel newSort =
+ project.getTraitSet(), ImmutableList.of(sort.getInput()));
+ final Sort newSort =
sort.copy(
sort.getTraitSet(),
newProject,
@@ -63,4 +68,4 @@ public class PushProjectPastSortRule extends RelOptRule {
}
}
-// End PushProjectPastSortRule.java
+// End ProjectSortTransposeRule.java
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a0ba73cd/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableRule.java
index 475edbb..785cc26 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableRule.java
@@ -14,43 +14,42 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.eigenbase.rel.rules;
+package org.apache.calcite.rel.rules;
-import java.util.List;
-
-import org.eigenbase.rel.FilterRelBase;
-import org.eigenbase.rel.ProjectRelBase;
-import org.eigenbase.rel.RelNode;
-import org.eigenbase.rel.TableAccessRelBase;
-import org.eigenbase.relopt.RelOptRule;
-import org.eigenbase.relopt.RelOptRuleCall;
-import org.eigenbase.relopt.RelOptRuleOperand;
-import org.eigenbase.relopt.RelOptTable;
-import org.eigenbase.relopt.RelOptUtil;
-import org.eigenbase.rex.RexBuilder;
-import org.eigenbase.rex.RexInputRef;
-import org.eigenbase.rex.RexLocalRef;
-import org.eigenbase.rex.RexNode;
-import org.eigenbase.rex.RexProgram;
-import org.eigenbase.rex.RexShuttle;
-
-import net.hydromatic.optiq.ProjectableFilterableTable;
-import net.hydromatic.optiq.rules.java.EnumerableRel;
-import net.hydromatic.optiq.rules.java.JavaRules;
+import org.apache.calcite.adapter.enumerable.EnumerableInterpreter;
+import org.apache.calcite.adapter.enumerable.EnumerableRel;
+import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.plan.RelOptRuleOperand;
+import org.apache.calcite.plan.RelOptTable;
+import org.apache.calcite.plan.RelOptUtil;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.Filter;
+import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.core.TableScan;
+import org.apache.calcite.rex.RexBuilder;
+import org.apache.calcite.rex.RexInputRef;
+import org.apache.calcite.rex.RexLocalRef;
+import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexProgram;
+import org.apache.calcite.rex.RexShuttle;
+import org.apache.calcite.schema.ProjectableFilterableTable;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
+import java.util.List;
+
/**
* Planner rule that pushes a project into a scan of a
- * {@link net.hydromatic.optiq.ProjectableFilterableTable}.
+ * {@link org.apache.calcite.schema.ProjectableFilterableTable}.
*
- * @see org.eigenbase.rel.rules.FilterTableRule
+ * @see org.apache.calcite.rel.rules.FilterTableRule
*/
public abstract class ProjectTableRule extends RelOptRule {
- private static final Predicate<TableAccessRelBase> PREDICATE =
- new Predicate<TableAccessRelBase>() {
- public boolean apply(TableAccessRelBase scan) {
+ private static final Predicate<TableScan> PREDICATE =
+ new Predicate<TableScan>() {
+ public boolean apply(TableScan scan) {
// We can only push projects into a ProjectableFilterableTable.
final RelOptTable table = scan.getTable();
return table.unwrap(ProjectableFilterableTable.class) != null;
@@ -59,14 +58,14 @@ public abstract class ProjectTableRule extends RelOptRule {
public static final ProjectTableRule INSTANCE =
new ProjectTableRule(
- operand(ProjectRelBase.class,
- operand(JavaRules.EnumerableInterpreterRel.class,
- operand(TableAccessRelBase.class, null, PREDICATE, none()))),
+ operand(Project.class,
+ operand(EnumerableInterpreter.class,
+ operand(TableScan.class, null, PREDICATE, none()))),
"ProjectTableRule:basic") {
@Override public void onMatch(RelOptRuleCall call) {
- final ProjectRelBase project = call.rel(0);
- final JavaRules.EnumerableInterpreterRel interpreter = call.rel(1);
- final TableAccessRelBase scan = call.rel(2);
+ final Project project = call.rel(0);
+ final EnumerableInterpreter interpreter = call.rel(1);
+ final TableScan scan = call.rel(2);
final RelOptTable table = scan.getTable();
assert table.unwrap(ProjectableFilterableTable.class) != null;
apply(call, project, null, interpreter);
@@ -75,17 +74,17 @@ public abstract class ProjectTableRule extends RelOptRule {
public static final ProjectTableRule INSTANCE2 =
new ProjectTableRule(
- operand(ProjectRelBase.class,
- operand(FilterRelBase.class,
- operand(JavaRules.EnumerableInterpreterRel.class,
- operand(TableAccessRelBase.class, null, PREDICATE,
+ operand(Project.class,
+ operand(Filter.class,
+ operand(EnumerableInterpreter.class,
+ operand(TableScan.class, null, PREDICATE,
none())))),
"ProjectTableRule:filter") {
@Override public void onMatch(RelOptRuleCall call) {
- final ProjectRelBase project = call.rel(0);
- final FilterRelBase filter = call.rel(1);
- final JavaRules.EnumerableInterpreterRel interpreter = call.rel(2);
- final TableAccessRelBase scan = call.rel(3);
+ final Project project = call.rel(0);
+ final Filter filter = call.rel(1);
+ final EnumerableInterpreter interpreter = call.rel(2);
+ final TableScan scan = call.rel(3);
final RelOptTable table = scan.getTable();
assert table.unwrap(ProjectableFilterableTable.class) != null;
apply(call, project, filter, interpreter);
@@ -101,8 +100,8 @@ public abstract class ProjectTableRule extends RelOptRule {
//~ Methods ----------------------------------------------------------------
- protected void apply(RelOptRuleCall call, ProjectRelBase project,
- FilterRelBase filter, JavaRules.EnumerableInterpreterRel interpreter) {
+ protected void apply(RelOptRuleCall call, Project project,
+ Filter filter, EnumerableInterpreter interpreter) {
// Split the projects into column references and expressions on top of them.
// Creating a RexProgram is a convenient way to do this.
final RexBuilder rexBuilder = project.getCluster().getRexBuilder();
@@ -142,7 +141,7 @@ public abstract class ProjectTableRule extends RelOptRule {
}
}
- RelNode input = interpreter.getChild();
+ RelNode input = interpreter.getInput();
if (filter != null) {
input = RelOptUtil.createFilter(input, filter.getCondition(),
EnumerableRel.FILTER_FACTORY);
@@ -151,7 +150,7 @@ public abstract class ProjectTableRule extends RelOptRule {
RelOptUtil.createProject(EnumerableRel.PROJECT_FACTORY, input,
projectOrdinals);
final RelNode newInterpreter =
- new JavaRules.EnumerableInterpreterRel(interpreter.getCluster(),
+ new EnumerableInterpreter(interpreter.getCluster(),
interpreter.getTraitSet(), newProject, 0.15d);
final RelNode residue;
if (extraProjects != null) {