You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ma...@apache.org on 2015/09/11 16:54:20 UTC
phoenix git commit: PHOENIX-2250 [Phoenix/Calcite] Deduct column
reference for TableScan and project required columns/column-families in Scan
Repository: phoenix
Updated Branches:
refs/heads/calcite 1a18e8f87 -> 86116a961
PHOENIX-2250 [Phoenix/Calcite] Deduct column reference for TableScan and project required columns/column-families in Scan
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/86116a96
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/86116a96
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/86116a96
Branch: refs/heads/calcite
Commit: 86116a9614e9b5b91c9fac10576ffabe72ccd6a2
Parents: 1a18e8f
Author: maryannxue <we...@intel.com>
Authored: Fri Sep 11 10:53:54 2015 -0400
Committer: maryannxue <we...@intel.com>
Committed: Fri Sep 11 10:53:54 2015 -0400
----------------------------------------------------------------------
.../calcite/rel/PhoenixAbstractAggregate.java | 13 ++++++++++
.../calcite/rel/PhoenixAbstractJoin.java | 8 +++++++
.../calcite/rel/PhoenixAbstractProject.java | 12 ++++++++++
.../calcite/rel/PhoenixAbstractSemiJoin.java | 8 +++++++
.../calcite/rel/PhoenixClientAggregate.java | 2 ++
.../phoenix/calcite/rel/PhoenixClientJoin.java | 4 ++--
.../calcite/rel/PhoenixClientProject.java | 5 +++-
.../calcite/rel/PhoenixClientSemiJoin.java | 4 ++--
.../phoenix/calcite/rel/PhoenixCorrelate.java | 5 ++--
.../apache/phoenix/calcite/rel/PhoenixRel.java | 17 +++++++------
.../calcite/rel/PhoenixRelImplementorImpl.java | 3 +--
.../calcite/rel/PhoenixServerAggregate.java | 3 +++
.../phoenix/calcite/rel/PhoenixServerJoin.java | 4 ++--
.../calcite/rel/PhoenixServerProject.java | 3 ++-
.../calcite/rel/PhoenixServerSemiJoin.java | 4 ++--
.../phoenix/calcite/rel/PhoenixTableScan.java | 25 +++++++++++++-------
.../rel/PhoenixToEnumerableConverter.java | 3 +++
17 files changed, 92 insertions(+), 31 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractAggregate.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractAggregate.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractAggregate.java
index e2938a7..b549663 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractAggregate.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractAggregate.java
@@ -10,6 +10,7 @@ import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.Aggregate;
import org.apache.calcite.rel.core.AggregateCall;
import org.apache.calcite.util.ImmutableBitSet;
+import org.apache.calcite.util.ImmutableIntList;
import org.apache.phoenix.calcite.CalciteUtils;
import org.apache.phoenix.compile.QueryPlan;
import org.apache.phoenix.compile.GroupByCompiler.GroupBy;
@@ -68,6 +69,18 @@ abstract public class PhoenixAbstractAggregate extends Aggregate implements Phoe
return super.computeSelfCost(planner);
}
+ protected ImmutableIntList getColumnRefList() {
+ List<Integer> columnRefList = Lists.newArrayList();
+ for (ImmutableBitSet set : groupSets) {
+ columnRefList.addAll(set.asList());
+ }
+ // TODO filterArg??
+ for (AggregateCall call : aggCalls) {
+ columnRefList.addAll(call.getArgList());
+ }
+ return ImmutableIntList.copyOf(columnRefList);
+ }
+
protected GroupBy getGroupBy(Implementor implementor) {
if (groupSets.size() > 1) {
throw new UnsupportedOperationException();
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractJoin.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractJoin.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractJoin.java
index 3355ee2..5d27758 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractJoin.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractJoin.java
@@ -40,6 +40,14 @@ abstract public class PhoenixAbstractJoin extends Join implements PhoenixRel {
.itemIf("isSingleValueRhs", isSingleValueRhs, isSingleValueRhs);
}
+ protected ImmutableIntList getColumnRefList(int index) {
+ assert index <= 1;
+
+ return index == 0 ?
+ ImmutableIntList.identity(getLeft().getRowType().getFieldCount())
+ : ImmutableIntList.identity(getRight().getRowType().getFieldCount());
+ }
+
protected QueryPlan implementInput(Implementor implementor, int index, List<Expression> conditionExprs) {
assert index <= 1;
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractProject.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractProject.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractProject.java
index 3c16563..f99559d 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractProject.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractProject.java
@@ -5,12 +5,15 @@ import java.util.List;
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptCost;
import org.apache.calcite.plan.RelOptPlanner;
+import org.apache.calcite.plan.RelOptUtil.InputFinder;
import org.apache.calcite.plan.RelTraitSet;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.Project;
import org.apache.calcite.rel.metadata.RelMetadataQuery;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.util.ImmutableBitSet;
+import org.apache.calcite.util.ImmutableIntList;
import org.apache.phoenix.calcite.CalciteUtils;
import org.apache.phoenix.execute.TupleProjector;
import org.apache.phoenix.expression.Expression;
@@ -37,6 +40,15 @@ abstract public class PhoenixAbstractProject extends Project implements PhoenixR
return planner.getCostFactory().makeCost(rows, 0, 0);
}
+ protected ImmutableIntList getColumnRefList() {
+ ImmutableBitSet bitSet = ImmutableBitSet.of();
+ for (RexNode node : getProjects()) {
+ InputFinder inputFinder = InputFinder.analyze(node);
+ bitSet = bitSet.union(inputFinder.inputBitSet.build());
+ }
+ return ImmutableIntList.copyOf(bitSet.asList());
+ }
+
protected TupleProjector project(Implementor implementor) {
List<Expression> exprs = Lists.newArrayList();
for (RexNode project : getProjects()) {
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractSemiJoin.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractSemiJoin.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractSemiJoin.java
index e788a75..5a835bc 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractSemiJoin.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixAbstractSemiJoin.java
@@ -21,6 +21,14 @@ abstract public class PhoenixAbstractSemiJoin extends SemiJoin implements Phoeni
super(cluster, traitSet, left, right, condition, leftKeys, rightKeys);
}
+ protected ImmutableIntList getColumnRefList(int index) {
+ assert index <= 1;
+
+ return index == 0 ?
+ ImmutableIntList.identity(getLeft().getRowType().getFieldCount())
+ : rightKeys;
+ }
+
protected QueryPlan implementInput(Implementor implementor, int index, List<Expression> conditionExprs) {
assert index <= 1;
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientAggregate.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientAggregate.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientAggregate.java
index 75f19a0..c62c328 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientAggregate.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientAggregate.java
@@ -58,7 +58,9 @@ public class PhoenixClientAggregate extends PhoenixAbstractAggregate {
@Override
public QueryPlan implement(Implementor implementor) {
+ implementor.pushContext(implementor.getCurrentContext().withColumnRefList(getColumnRefList()));
QueryPlan plan = implementor.visitInput(0, (PhoenixRel) getInput());
+ implementor.popContext();
TableRef tableRef = implementor.getTableRef();
PhoenixStatement stmt = plan.getContext().getStatement();
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientJoin.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientJoin.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientJoin.java
index 599661c..9eba164 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientJoin.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientJoin.java
@@ -110,12 +110,12 @@ public class PhoenixClientJoin extends PhoenixAbstractJoin {
List<Expression> leftExprs = Lists.<Expression> newArrayList();
List<Expression> rightExprs = Lists.<Expression> newArrayList();
- implementor.pushContext(new ImplementorContext(implementor.getCurrentContext().isRetainPKColumns() && getJoinType() != JoinRelType.FULL, true));
+ implementor.pushContext(new ImplementorContext(implementor.getCurrentContext().retainPKColumns && getJoinType() != JoinRelType.FULL, true, getColumnRefList(0)));
QueryPlan leftPlan = implementInput(implementor, 0, leftExprs);
PTable leftTable = implementor.getTableRef().getTable();
implementor.popContext();
- implementor.pushContext(new ImplementorContext(false, true));
+ implementor.pushContext(new ImplementorContext(false, true, getColumnRefList(1)));
QueryPlan rightPlan = implementInput(implementor, 1, rightExprs);
PTable rightTable = implementor.getTableRef().getTable();
implementor.popContext();
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientProject.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientProject.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientProject.java
index 77ca76d..e170553 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientProject.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientProject.java
@@ -56,7 +56,10 @@ public class PhoenixClientProject extends PhoenixAbstractProject {
@Override
public QueryPlan implement(Implementor implementor) {
- QueryPlan plan = implementor.visitInput(0, (PhoenixRel) getInput());
+ implementor.pushContext(implementor.getCurrentContext().withColumnRefList(getColumnRefList()));
+ QueryPlan plan = implementor.visitInput(0, (PhoenixRel) getInput());
+ implementor.popContext();
+
TupleProjector tupleProjector = project(implementor);
return new TupleProjectionPlan(plan, tupleProjector, null);
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientSemiJoin.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientSemiJoin.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientSemiJoin.java
index 87dc44d..0611a8c 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientSemiJoin.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientSemiJoin.java
@@ -96,12 +96,12 @@ public class PhoenixClientSemiJoin extends PhoenixAbstractSemiJoin implements
List<Expression> leftExprs = Lists.<Expression> newArrayList();
List<Expression> rightExprs = Lists.<Expression> newArrayList();
- implementor.pushContext(new ImplementorContext(implementor.getCurrentContext().isRetainPKColumns() && getJoinType() != JoinRelType.FULL, true));
+ implementor.pushContext(new ImplementorContext(implementor.getCurrentContext().retainPKColumns && getJoinType() != JoinRelType.FULL, true, getColumnRefList(0)));
QueryPlan leftPlan = implementInput(implementor, 0, leftExprs);
TableRef joinedTable = implementor.getTableRef();
implementor.popContext();
- implementor.pushContext(new ImplementorContext(false, true));
+ implementor.pushContext(new ImplementorContext(false, true, getColumnRefList(1)));
QueryPlan rightPlan = implementInput(implementor, 1, rightExprs);
implementor.popContext();
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixCorrelate.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixCorrelate.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixCorrelate.java
index 430e282..6518700 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixCorrelate.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixCorrelate.java
@@ -14,6 +14,7 @@ import org.apache.calcite.rel.core.Correlate;
import org.apache.calcite.rel.core.CorrelationId;
import org.apache.calcite.sql.SemiJoinType;
import org.apache.calcite.util.ImmutableBitSet;
+import org.apache.calcite.util.ImmutableIntList;
import org.apache.phoenix.calcite.CalciteUtils;
import org.apache.phoenix.calcite.metadata.PhoenixRelMdCollation;
import org.apache.phoenix.compile.JoinCompiler;
@@ -68,14 +69,14 @@ public class PhoenixCorrelate extends Correlate implements PhoenixRel {
@Override
public QueryPlan implement(Implementor implementor) {
- implementor.pushContext(new ImplementorContext(implementor.getCurrentContext().isRetainPKColumns(), true));
+ implementor.pushContext(new ImplementorContext(implementor.getCurrentContext().retainPKColumns, true, ImmutableIntList.identity(getLeft().getRowType().getFieldCount())));
QueryPlan leftPlan = implementor.visitInput(0, (PhoenixRel) getLeft());
PTable leftTable = implementor.getTableRef().getTable();
implementor.popContext();
implementor.getRuntimeContext().defineCorrelateVariable(getCorrelVariable(), implementor.getTableRef());
- implementor.pushContext(new ImplementorContext(false, true));
+ implementor.pushContext(new ImplementorContext(false, true, ImmutableIntList.identity(getRight().getRowType().getFieldCount())));
QueryPlan rightPlan = implementor.visitInput(1, (PhoenixRel) getRight());
PTable rightTable = implementor.getTableRef().getTable();
implementor.popContext();
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRel.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRel.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRel.java
index 305af62..7d269a8 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRel.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRel.java
@@ -5,6 +5,7 @@ import java.util.List;
import org.apache.calcite.plan.Convention;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.metadata.RelMetadataProvider;
+import org.apache.calcite.util.ImmutableIntList;
import org.apache.phoenix.calcite.metadata.PhoenixRelMetadataProvider;
import org.apache.phoenix.compile.QueryPlan;
import org.apache.phoenix.compile.RowProjector;
@@ -48,20 +49,18 @@ public interface PhoenixRel extends RelNode {
QueryPlan implement(Implementor implementor);
class ImplementorContext {
- private boolean retainPKColumns;
- private boolean forceProject;
+ public final boolean retainPKColumns;
+ public final boolean forceProject;
+ public final ImmutableIntList columnRefList;
- public ImplementorContext(boolean retainPKColumns, boolean forceProject) {
+ public ImplementorContext(boolean retainPKColumns, boolean forceProject, ImmutableIntList columnRefList) {
this.retainPKColumns = retainPKColumns;
this.forceProject = forceProject;
+ this.columnRefList = columnRefList;
}
- public boolean isRetainPKColumns() {
- return this.retainPKColumns;
- }
-
- public boolean forceProject() {
- return this.forceProject;
+ public ImplementorContext withColumnRefList(ImmutableIntList columnRefList) {
+ return new ImplementorContext(this.retainPKColumns, this.forceProject, columnRefList);
}
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java
index d4b304a..c4ad62d 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java
@@ -42,7 +42,6 @@ public class PhoenixRelImplementorImpl implements PhoenixRel.Implementor {
public PhoenixRelImplementorImpl(RuntimeContext runtimeContext) {
this.runtimeContext = runtimeContext;
this.contextStack = new Stack<ImplementorContext>();
- pushContext(new ImplementorContext(true, false));
}
@Override
@@ -102,7 +101,7 @@ public class PhoenixRelImplementorImpl implements PhoenixRel.Implementor {
}
try {
- return TupleProjectionCompiler.createProjectedTable(getTableRef(), sourceColumnRefs, getCurrentContext().isRetainPKColumns());
+ return TupleProjectionCompiler.createProjectedTable(getTableRef(), sourceColumnRefs, getCurrentContext().retainPKColumns);
} catch (SQLException e) {
throw new RuntimeException(e);
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerAggregate.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerAggregate.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerAggregate.java
index a707b14..d208bef 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerAggregate.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerAggregate.java
@@ -54,7 +54,10 @@ public class PhoenixServerAggregate extends PhoenixAbstractAggregate {
@Override
public QueryPlan implement(Implementor implementor) {
+ implementor.pushContext(implementor.getCurrentContext().withColumnRefList(getColumnRefList()));
QueryPlan plan = implementor.visitInput(0, (PhoenixRel) getInput());
+ implementor.popContext();
+
assert (plan instanceof ScanPlan
|| plan instanceof HashJoinPlan)
&& plan.getLimit() == null;
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerJoin.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerJoin.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerJoin.java
index 047deac..d9749e0 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerJoin.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerJoin.java
@@ -104,12 +104,12 @@ public class PhoenixServerJoin extends PhoenixAbstractJoin {
List<Expression> leftExprs = Lists.<Expression> newArrayList();
List<Expression> rightExprs = Lists.<Expression> newArrayList();
- implementor.pushContext(new ImplementorContext(implementor.getCurrentContext().isRetainPKColumns(), true));
+ implementor.pushContext(new ImplementorContext(implementor.getCurrentContext().retainPKColumns, true, getColumnRefList(0)));
QueryPlan leftPlan = implementInput(implementor, 0, leftExprs);
PTable leftTable = implementor.getTableRef().getTable();
implementor.popContext();
- implementor.pushContext(new ImplementorContext(false, true));
+ implementor.pushContext(new ImplementorContext(false, true, getColumnRefList(1)));
QueryPlan rightPlan = implementInput(implementor, 1, rightExprs);
PTable rightTable = implementor.getTableRef().getTable();
implementor.popContext();
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerProject.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerProject.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerProject.java
index bafd78c..daa48f7 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerProject.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerProject.java
@@ -57,9 +57,10 @@ public class PhoenixServerProject extends PhoenixAbstractProject {
@Override
public QueryPlan implement(Implementor implementor) {
- implementor.pushContext(new ImplementorContext(implementor.getCurrentContext().isRetainPKColumns(), false));
+ implementor.pushContext(new ImplementorContext(implementor.getCurrentContext().retainPKColumns, false, getColumnRefList()));
QueryPlan plan = implementor.visitInput(0, (PhoenixRel) getInput());
implementor.popContext();
+
assert (plan instanceof ScanPlan);
TupleProjector tupleProjector = super.project(implementor);
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerSemiJoin.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerSemiJoin.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerSemiJoin.java
index 4593bdb..b9a3576 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerSemiJoin.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixServerSemiJoin.java
@@ -95,12 +95,12 @@ public class PhoenixServerSemiJoin extends PhoenixAbstractSemiJoin {
List<Expression> leftExprs = Lists.<Expression> newArrayList();
List<Expression> rightExprs = Lists.<Expression> newArrayList();
- implementor.pushContext(new ImplementorContext(implementor.getCurrentContext().isRetainPKColumns(), true));
+ implementor.pushContext(new ImplementorContext(implementor.getCurrentContext().retainPKColumns, true, getColumnRefList(0)));
QueryPlan leftPlan = implementInput(implementor, 0, leftExprs);
TableRef joinedTable = implementor.getTableRef();
implementor.popContext();
- implementor.pushContext(new ImplementorContext(false, true));
+ implementor.pushContext(new ImplementorContext(false, true, getColumnRefList(1)));
QueryPlan rightPlan = implementInput(implementor, 1, rightExprs);
implementor.popContext();
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java
index 5bf9569..407afd1 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixTableScan.java
@@ -7,6 +7,7 @@ import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptCost;
import org.apache.calcite.plan.RelOptPlanner;
import org.apache.calcite.plan.RelOptTable;
+import org.apache.calcite.plan.RelOptUtil.InputFinder;
import org.apache.calcite.plan.RelTraitSet;
import org.apache.calcite.rel.RelCollation;
import org.apache.calcite.rel.RelCollationTraitDef;
@@ -15,6 +16,8 @@ import org.apache.calcite.rel.RelWriter;
import org.apache.calcite.rel.core.TableScan;
import org.apache.calcite.rel.metadata.RelMetadataQuery;
import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.util.ImmutableBitSet;
+import org.apache.calcite.util.ImmutableIntList;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.phoenix.calcite.CalciteUtils;
@@ -38,7 +41,7 @@ import org.apache.phoenix.jdbc.PhoenixStatement;
import org.apache.phoenix.parse.SelectStatement;
import org.apache.phoenix.schema.KeyValueSchema.KeyValueSchemaBuilder;
import org.apache.phoenix.schema.PColumn;
-import org.apache.phoenix.schema.PColumnFamily;
+import org.apache.phoenix.schema.PName;
import org.apache.phoenix.schema.PTable;
import org.apache.phoenix.schema.TableRef;
import org.apache.phoenix.schema.types.PDataType;
@@ -182,8 +185,11 @@ public class PhoenixTableScan extends TableScan implements PhoenixRel {
ColumnResolver resolver = FromCompiler.getResolver(tableRef);
StatementContext context = new StatementContext(stmt, resolver, new Scan(), new SequenceManager(stmt));
SelectStatement select = SelectStatement.SELECT_ONE;
+ ImmutableIntList columnRefList = implementor.getCurrentContext().columnRefList;
Expression dynamicFilter = null;
if (filter != null) {
+ ImmutableBitSet bitSet = InputFinder.analyze(filter).inputBitSet.addAll(columnRefList).build();
+ columnRefList = ImmutableIntList.copyOf(bitSet.asList());
Expression filterExpr = CalciteUtils.toExpression(filter, implementor);
filterExpr = WhereOptimizer.pushKeyExpressionsToScan(context, select, filterExpr);
WhereCompiler.setScanFilter(context, select, filterExpr, true, false);
@@ -195,8 +201,8 @@ public class PhoenixTableScan extends TableScan implements PhoenixRel {
dynamicFilter = filterExpr;
}
}
- projectAllColumnFamilies(context.getScan(), phoenixTable.getTable());
- if (implementor.getCurrentContext().forceProject()) {
+ projectColumnFamilies(context.getScan(), phoenixTable.getTable(), columnRefList);
+ if (implementor.getCurrentContext().forceProject) {
TupleProjector tupleProjector = createTupleProjector(implementor, phoenixTable.getTable());
TupleProjector.serializeProjectorIntoScan(context.getScan(), tupleProjector);
PTable projectedTable = implementor.createProjectedTable();
@@ -215,7 +221,7 @@ public class PhoenixTableScan extends TableScan implements PhoenixRel {
KeyValueSchemaBuilder builder = new KeyValueSchemaBuilder(0);
List<Expression> exprs = Lists.<Expression> newArrayList();
for (PColumn column : table.getColumns()) {
- if (!SchemaUtil.isPKColumn(column) || !implementor.getCurrentContext().isRetainPKColumns()) {
+ if (!SchemaUtil.isPKColumn(column) || !implementor.getCurrentContext().retainPKColumns) {
Expression expr = implementor.newColumnExpression(column.getPosition());
exprs.add(expr);
builder.addField(expr);
@@ -225,11 +231,14 @@ public class PhoenixTableScan extends TableScan implements PhoenixRel {
return new TupleProjector(builder.build(), exprs.toArray(new Expression[exprs.size()]));
}
- // TODO only project needed columns
- private void projectAllColumnFamilies(Scan scan, PTable table) {
+ private void projectColumnFamilies(Scan scan, PTable table, ImmutableIntList columnRefList) {
scan.getFamilyMap().clear();
- for (PColumnFamily family : table.getColumnFamilies()) {
- scan.addFamily(family.getName().getBytes());
+ for (Integer index : columnRefList) {
+ PColumn column = table.getColumns().get(index);
+ PName familyName = column.getFamilyName();
+ if (familyName != null) {
+ scan.addFamily(familyName.getBytes());
+ }
}
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/86116a96/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixToEnumerableConverter.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixToEnumerableConverter.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixToEnumerableConverter.java
index b171dac..19ff75c 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixToEnumerableConverter.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixToEnumerableConverter.java
@@ -22,7 +22,9 @@ import org.apache.calcite.plan.RelTraitSet;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.convert.ConverterImpl;
import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.util.ImmutableIntList;
import org.apache.phoenix.calcite.BuiltInMethod;
+import org.apache.phoenix.calcite.rel.PhoenixRel.ImplementorContext;
import org.apache.phoenix.compile.ExplainPlan;
import org.apache.phoenix.compile.QueryPlan;
import org.apache.phoenix.compile.RowProjector;
@@ -85,6 +87,7 @@ public class PhoenixToEnumerableConverter extends ConverterImpl implements Enume
static QueryPlan makePlan(PhoenixRel rel) {
final PhoenixRel.Implementor phoenixImplementor = new PhoenixRelImplementorImpl(new RuntimeContextImpl());
+ phoenixImplementor.pushContext(new ImplementorContext(true, false, ImmutableIntList.identity(rel.getRowType().getFieldCount())));
final QueryPlan plan = phoenixImplementor.visitInput(0, rel);
return new DelegateQueryPlan(plan) {
@Override