aboutsummaryrefslogtreecommitdiff
path: root/exec/java-exec/src
diff options
context:
space:
mode:
Diffstat (limited to 'exec/java-exec/src')
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java27
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillSimpleFuncHolder.java14
2 files changed, 29 insertions, 12 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);
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillSimpleFuncHolder.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillSimpleFuncHolder.java
index 1cc25563c..6744585d2 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillSimpleFuncHolder.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillSimpleFuncHolder.java
@@ -36,9 +36,11 @@ import com.sun.codemodel.JExpr;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JMod;
import com.sun.codemodel.JVar;
+import org.apache.drill.exec.vector.ValueHolderHelper;
+
+import java.util.List;
public class DrillSimpleFuncHolder extends DrillFuncHolder {
- static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DrillSimpleFuncHolder.class);
private final String drillFuncClass;
// each function should be wrapped unique class loader associated with its jar
@@ -140,12 +142,14 @@ public class DrillSimpleFuncHolder extends DrillFuncHolder {
JVar internalOutput = sub.decl(JMod.FINAL, g.getHolderType(returnValueType), getReturnValue().getName(), JExpr._new(g.getHolderType(returnValueType)));
addProtectedBlock(g, sub, body, inputVariables, workspaceJVars, false);
- if (sub != topSub) {
- sub.assign(internalOutput.ref("isSet"),JExpr.lit(1));// Assign null if NULL_IF_NULL mode
+
+ List<String> holderFields = ValueHolderHelper.getHolderParams(returnValueType);
+ for (String holderField : holderFields) {
+ sub.assign(out.f(holderField), internalOutput.ref(holderField));
}
- sub.assign(out.getHolder(), internalOutput);
+
if (sub != topSub) {
- sub.assign(internalOutput.ref("isSet"),JExpr.lit(1));// Assign null if NULL_IF_NULL mode
+ sub.assign(out.f("isSet"),JExpr.lit(1)); // Assign null if NULL_IF_NULL mode
}
g.getEvalBlock().directStatement(String.format("//---- end of eval portion of %s function. ----//", getRegisteredNames()[0]));