diff options
Diffstat (limited to 'exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java')
-rw-r--r-- | exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java index 6f797480f..4d85c6a9a 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java @@ -237,13 +237,17 @@ public class EvaluationVisitor { generator.unNestEvalBlock(); + List<String> holderFields = ValueHolderHelper.getHolderParams(output.getMajorType()); if (thenExpr.isOptional()) { JConditional newCond = jc._then()._if(thenExpr.getIsSet().ne(JExpr.lit(0))); JBlock b = newCond._then(); - b.assign(output.getHolder(), thenExpr.getHolder()); - //b.assign(output.getIsSet(), thenExpr.getIsSet()); + for (String holderField : holderFields) { + b.assign(output.f(holderField), thenExpr.f(holderField)); + } } else { - jc._then().assign(output.getHolder(), thenExpr.getHolder()); + for (String holderField : holderFields) { + jc._then().assign(output.f(holderField), thenExpr.f(holderField)); + } } generator.nestEvalBlock(jc._else()); @@ -255,10 +259,13 @@ public class EvaluationVisitor { if (elseExpr.isOptional()) { JConditional newCond = jc._else()._if(elseExpr.getIsSet().ne(JExpr.lit(0))); JBlock b = newCond._then(); - b.assign(output.getHolder(), elseExpr.getHolder()); - //b.assign(output.getIsSet(), elseExpr.getIsSet()); + for (String holderField : holderFields) { + b.assign(output.f(holderField), elseExpr.f(holderField)); + } } else { - jc._else().assign(output.getHolder(), elseExpr.getHolder()); + for (String holderField : holderFields) { + jc._else().assign(output.f(holderField), elseExpr.f(holderField)); + } } local.add(conditionalBlock); return output; @@ -1436,7 +1443,13 @@ public class EvaluationVisitor { */ private HoldingContainer renderConstantExpression(ClassGenerator<?> generator, HoldingContainer input) { JVar fieldValue = generator.declareClassField("constant", generator.getHolderType(input.getMajorType())); - generator.getEvalBlock().assign(fieldValue, input.getHolder()); + // Creates a new vector for class field and assigns to its fields values from output field + // to allow scalar replacement for source objects + generator.getEvalBlock().assign(fieldValue, JExpr._new(generator.getHolderType(input.getMajorType()))); + List<String> holderFields = ValueHolderHelper.getHolderParams(input.getMajorType()); + for (String holderField : holderFields) { + generator.getEvalBlock().assign(fieldValue.ref(holderField), input.getHolder().ref(holderField)); + } generator.getMappingSet().exitConstant(); return new HoldingContainer(input.getMajorType(), fieldValue, fieldValue.ref("value"), fieldValue.ref("isSet")) .setConstant(true); |