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.
