handle double project by copying

Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/31d19946
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/31d19946
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/31d19946

Branch: refs/heads/master
Commit: 31d199461aaa7bdebe66415bf78b76c98d0fd637
Parents: 2038bc6
Author: Steven Phillips <[email protected]>
Authored: Wed Apr 2 12:10:12 2014 -0700
Committer: Jacques Nadeau <[email protected]>
Committed: Sat Apr 19 18:07:10 2014 -0700

----------------------------------------------------------------------
 .../physical/impl/project/ProjectRecordBatch.java | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/31d19946/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java
index 949b5f7..4342f52 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java
@@ -18,7 +18,9 @@
 package org.apache.drill.exec.physical.impl.project;
 
 import java.io.IOException;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.drill.common.expression.ErrorCollector;
 import org.apache.drill.common.expression.ErrorCollectorImpl;
@@ -118,8 +120,12 @@ public class ProjectRecordBatch extends 
AbstractSingleRecordBatch<Project>{
     final List<TransferPair> transfers = Lists.newArrayList();
     
     final ClassGenerator<Projector> cg = 
CodeGenerator.getRoot(Projector.TEMPLATE_DEFINITION, 
context.getFunctionRegistry());
-    
-    if(isAnyWildcard(exprs)){
+
+    Set<Integer> transferFieldIds = new HashSet();
+
+    boolean isAnyWildcard = isAnyWildcard(exprs);
+
+    if(isAnyWildcard){
       for(VectorWrapper<?> wrapper : incoming){
         ValueVector vvIn = wrapper.getValueVector();
         TransferPair tp = wrapper.getValueVector().getTransferPair(new 
FieldReference(vvIn.getField().getName()));
@@ -134,9 +140,12 @@ public class ProjectRecordBatch extends 
AbstractSingleRecordBatch<Project>{
         if(collector.hasErrors()){
           throw new SchemaChangeException(String.format("Failure while trying 
to materialize incoming schema.  Errors:\n %s.", collector.toErrorString()));
         }
-        
+
+
         // add value vector to transfer if direct reference and this is 
allowed, otherwise, add to evaluation stack.
-        if(expr instanceof ValueVectorReadExpression && 
incoming.getSchema().getSelectionVectorMode() == SelectionVectorMode.NONE){
+        if(expr instanceof ValueVectorReadExpression && 
incoming.getSchema().getSelectionVectorMode() == SelectionVectorMode.NONE &&
+                !isAnyWildcard &&
+                !transferFieldIds.contains(((ValueVectorReadExpression) 
expr).getFieldId().getFieldId())) {
           ValueVectorReadExpression vectorRead = (ValueVectorReadExpression) 
expr;
           ValueVector vvIn = 
incoming.getValueAccessorById(vectorRead.getFieldId().getFieldId(), 
TypeHelper.getValueVectorClass(vectorRead.getMajorType().getMinorType(), 
vectorRead.getMajorType().getMode())).getValueVector();
           Preconditions.checkNotNull(incoming);
@@ -144,6 +153,7 @@ public class ProjectRecordBatch extends 
AbstractSingleRecordBatch<Project>{
           TransferPair tp = vvIn.getTransferPair(getRef(namedExpression));
           transfers.add(tp);
           container.add(tp.getTo());
+          transferFieldIds.add(vectorRead.getFieldId().getFieldId());
           logger.debug("Added transfer.");
         }else{
           // need to do evaluation.

Reply via email to