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

Reply via email to