aboutsummaryrefslogtreecommitdiff
path: root/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java
diff options
context:
space:
mode:
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.java27
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);