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 <wei....@intel.com> Authored: Fri Sep 11 10:53:54 2015 -0400 Committer: maryannxue <wei....@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