DRILL-346: Move constant expressions to setup.
Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/8cc75bf5 Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/8cc75bf5 Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/8cc75bf5 Branch: refs/heads/master Commit: 8cc75bf56378754c6fb02e1c301d3e60823af929 Parents: d3c0196 Author: Jinfeng Ni <[email protected]> Authored: Mon Mar 17 09:03:14 2014 -0700 Committer: Jacques Nadeau <[email protected]> Committed: Mon Mar 17 09:05:47 2014 -0700 ---------------------------------------------------------------------- .../common/expression/FunctionDefinition.java | 17 +++- .../sig/ConstantExpressionIdentifier.java | 6 +- .../exec/compile/sig/GeneratorMapping.java | 8 ++ .../drill/exec/compile/sig/MappingSet.java | 20 ++++- .../apache/drill/exec/expr/ClassGenerator.java | 15 +++- .../drill/exec/expr/EvaluationVisitor.java | 81 ++++++++++++++------ .../drill/exec/expr/annotations/Param.java | 1 + .../drill/exec/expr/fn/DrillAggFuncHolder.java | 10 +-- .../drill/exec/expr/fn/DrillFuncHolder.java | 21 ++++- .../exec/expr/fn/DrillSimpleFuncHolder.java | 19 +++-- .../drill/exec/expr/fn/FunctionConverter.java | 3 + .../drill/exec/expr/fn/impl/Alternator.java | 4 +- .../exec/physical/impl/aggregate/AggBatch.java | 52 ++++++------- .../exec/physical/impl/join/MergeJoinBatch.java | 37 ++++----- .../MergingReceiverGeneratorBase.java | 4 +- .../impl/mergereceiver/MergingRecordBatch.java | 4 +- .../OrderedPartitionRecordBatch.java | 8 +- .../exec/physical/impl/sort/SortBatch.java | 15 ++-- .../drill/exec/fn/impl/GeneratorFunctions.java | 6 +- 19 files changed, 218 insertions(+), 113 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java ---------------------------------------------------------------------- diff --git a/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java b/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java index 8009632..f9e408b 100644 --- a/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java +++ b/common/src/main/java/org/apache/drill/common/expression/FunctionDefinition.java @@ -31,17 +31,24 @@ public class FunctionDefinition { private final OutputTypeDeterminer outputType; private final boolean aggregating; private final boolean isOperator; + private final boolean isRandom; private FunctionDefinition(String name, ArgumentValidator argumentValidator, OutputTypeDeterminer outputType, boolean aggregating, boolean isOperator, String[] registeredNames) { + this(name, argumentValidator, outputType, aggregating, isOperator, registeredNames, false); + } + + private FunctionDefinition(String name, ArgumentValidator argumentValidator, OutputTypeDeterminer outputType, + boolean aggregating, boolean isOperator, String[] registeredNames, boolean isRandom) { this.name = name; this.argumentValidator = argumentValidator; this.outputType = outputType; this.aggregating = aggregating; this.registeredNames = ArrayUtils.isEmpty(registeredNames) ? new String[]{name} : registeredNames; this.isOperator = isOperator; + this.isRandom = isRandom; } - + public MajorType getDataType(List<LogicalExpression> args){ return outputType.getOutputType(args); } @@ -62,6 +69,10 @@ public class FunctionDefinition { return new FunctionDefinition(name, argumentValidator, outputType, false, false, registeredNames); } + public static FunctionDefinition simpleRandom(String name, ArgumentValidator argumentValidator, OutputTypeDeterminer outputType, String... registeredNames){ + return new FunctionDefinition(name, argumentValidator, outputType, false, false, registeredNames, true); + } + public static FunctionDefinition aggregator(String name, ArgumentValidator argumentValidator, OutputTypeDeterminer outputType, String... registeredNames){ return new FunctionDefinition(name, argumentValidator, outputType, true, false, registeredNames); } @@ -86,6 +97,10 @@ public class FunctionDefinition { return this.name; } + public boolean isRandom() { + return this.isRandom; + } + public FunctionCall newCall(List<LogicalExpression> args, ExpressionPosition pos){ return new FunctionCall(this, args, pos); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/ConstantExpressionIdentifier.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/ConstantExpressionIdentifier.java b/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/ConstantExpressionIdentifier.java index 7a48112..83a5e6f 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/ConstantExpressionIdentifier.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/ConstantExpressionIdentifier.java @@ -86,7 +86,7 @@ public class ConstantExpressionIdentifier implements ExprVisitor<Boolean, Identi @Override public Boolean visitFunctionCall(FunctionCall call, IdentityHashMap<LogicalExpression, Object> value){ - return checkChildren(call, value, !call.getDefinition().isAggregating()); + return checkChildren(call, value, !call.getDefinition().isAggregating() && !call.getDefinition().isRandom()); } @@ -114,25 +114,21 @@ public class ConstantExpressionIdentifier implements ExprVisitor<Boolean, Identi @Override public Boolean visitLongConstant(LongExpression intExpr, IdentityHashMap<LogicalExpression, Object> value){ - value.put(intExpr, true); return true; } @Override public Boolean visitDoubleConstant(DoubleExpression dExpr, IdentityHashMap<LogicalExpression, Object> value){ - value.put(dExpr, true); return true; } @Override public Boolean visitBooleanConstant(BooleanExpression e, IdentityHashMap<LogicalExpression, Object> value){ - value.put(e, true); return true; } @Override public Boolean visitQuotedStringConstant(QuotedString e, IdentityHashMap<LogicalExpression, Object> value){ - value.put(e, true); return true; } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/GeneratorMapping.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/GeneratorMapping.java b/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/GeneratorMapping.java index f99150e..8604956 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/GeneratorMapping.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/GeneratorMapping.java @@ -38,6 +38,14 @@ public class GeneratorMapping { this.cleanup = cleanup; } + public GeneratorMapping(GeneratorMapping gm) { + super(); + this.setup = gm.setup; + this.eval = gm.eval; + this.reset = gm.reset; + this.cleanup = gm.cleanup; + } + public static GeneratorMapping GM(String setup, String eval){ return create(setup, eval, null, null); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/MappingSet.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/MappingSet.java b/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/MappingSet.java index 1cb2380..c116077 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/MappingSet.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/compile/sig/MappingSet.java @@ -58,20 +58,32 @@ public class MappingSet { this.outgoing = DirectExpression.direct(outgoing); Preconditions.checkArgument(mappings.length >= 2); this.constant = mappings[0]; + + //Make sure the constant GM is different from other GM. If it is identical, clone another copy. + for (int i = 1; i< mappings.length; i++) { + if (mappings[0] == mappings[i]) { + this.constant = new GeneratorMapping(mappings[0]); + break; + } + } + this.mappings = Arrays.copyOfRange(mappings, 1, mappings.length); this.current = this.mappings[0]; } public void enterConstant(){ -// assert constant != current; -// current = constant; + assert constant != current; + current = constant; } public void exitConstant(){ -// assert constant == current; -// current = mappings[mappingIndex]; + assert constant == current; + current = mappings[mappingIndex]; } + public boolean isWithinConstant() { + return constant == current; + } public void enterChild(){ assert current == mappings[mappingIndex]; http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ClassGenerator.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ClassGenerator.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ClassGenerator.java index e674eab..6d00435 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ClassGenerator.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ClassGenerator.java @@ -73,7 +73,7 @@ public class ClassGenerator<T>{ private MappingSet mappings; public static MappingSet getDefaultMapping(){ - return new MappingSet("inIndex", "outIndex", DEFAULT_SCALAR_MAP, DEFAULT_SCALAR_MAP); + return new MappingSet("inIndex", "outIndex", DEFAULT_CONSTANT_MAP, DEFAULT_SCALAR_MAP); } @@ -313,6 +313,7 @@ public class ClassGenerator<T>{ private final JFieldRef value; private final JFieldRef isSet; private final MajorType type; + private boolean isConstant; public HoldingContainer(MajorType t, JVar holder, JFieldRef value, JFieldRef isSet) { super(); @@ -320,8 +321,18 @@ public class ClassGenerator<T>{ this.value = value; this.isSet = isSet; this.type = t; + this.isConstant = false; } - + + public HoldingContainer setConstant(boolean isConstant) { + this.isConstant = isConstant; + return this; + } + + public boolean isConstant() { + return this.isConstant; + } + public JVar getHolder() { return holder; } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/expr/EvaluationVisitor.java ---------------------------------------------------------------------- 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 a7895d3..cac47b3 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 @@ -34,8 +34,10 @@ import org.apache.drill.common.expression.visitors.AbstractExprVisitor; import org.apache.drill.common.types.TypeProtos.MajorType; import org.apache.drill.common.types.TypeProtos.MinorType; import org.apache.drill.common.types.Types; + import org.apache.drill.exec.expr.ClassGenerator.BlockType; import org.apache.drill.exec.expr.ClassGenerator.HoldingContainer; +import org.apache.drill.exec.compile.sig.ConstantExpressionIdentifier; import org.apache.drill.exec.expr.fn.DrillFuncHolder; import org.apache.drill.exec.expr.fn.FunctionImplementationRegistry; import org.apache.drill.exec.physical.impl.filter.ReturnValueExpression; @@ -61,8 +63,8 @@ public class EvaluationVisitor { } public HoldingContainer addExpr(LogicalExpression e, ClassGenerator<?> generator){ -// Set<LogicalExpression> constantBoundaries = ConstantExpressionIdentifier.getConstantExpressionSet(e); - Set<LogicalExpression> constantBoundaries = Collections.emptySet(); + Set<LogicalExpression> constantBoundaries = ConstantExpressionIdentifier.getConstantExpressionSet(e); + //Set<LogicalExpression> constantBoundaries = Collections.emptySet(); return e.accept(new ConstantFilter(constantBoundaries), generator); } @@ -143,7 +145,7 @@ public class EvaluationVisitor { } @Override - public HoldingContainer visitLongConstant(LongExpression e, ClassGenerator<?> generator) throws RuntimeException { + public HoldingContainer visitLongConstant(LongExpression e, ClassGenerator<?> generator) throws RuntimeException { HoldingContainer out = generator.declare(e.getMajorType()); generator.getEvalBlock().assign(out.getValue(), JExpr.lit(e.getLong())); return out; @@ -283,7 +285,6 @@ public class EvaluationVisitor { JExpression stringLiteral = JExpr.lit(e.value); setup.assign(var, ((JClass)generator.getModel().ref(ValueHolderHelper.class)).staticInvoke("getVarCharHolder").arg(stringLiteral)); return new HoldingContainer(majorType, var, null, null); - } } @@ -296,14 +297,17 @@ public class EvaluationVisitor { super(); this.constantBoundaries = constantBoundaries; } - + @Override public HoldingContainer visitFunctionCall(FunctionCall e, ClassGenerator<?> generator) throws RuntimeException { if (constantBoundaries.contains(e)) { generator.getMappingSet().enterConstant(); HoldingContainer c = super.visitFunctionCall(e, generator); - generator.getMappingSet().exitConstant(); - return c; + //generator.getMappingSet().exitConstant(); + //return c; + return renderConstantExpression(generator, c); + } else if (generator.getMappingSet().isWithinConstant()) { + return super.visitFunctionCall(e, generator).setConstant(true); } else { return super.visitFunctionCall(e, generator); } @@ -314,8 +318,11 @@ public class EvaluationVisitor { if (constantBoundaries.contains(e)) { generator.getMappingSet().enterConstant(); HoldingContainer c = super.visitIfExpression(e, generator); - generator.getMappingSet().exitConstant(); - return c; + // generator.getMappingSet().exitConstant(); + // return c; + return renderConstantExpression(generator, c); + } else if (generator.getMappingSet().isWithinConstant()) { + return super.visitIfExpression(e, generator).setConstant(true); } else { return super.visitIfExpression(e, generator); } @@ -326,8 +333,11 @@ public class EvaluationVisitor { if (constantBoundaries.contains(e)) { generator.getMappingSet().enterConstant(); HoldingContainer c = super.visitSchemaPath(e, generator); - generator.getMappingSet().exitConstant(); - return c; + //generator.getMappingSet().exitConstant(); + //return c; + return renderConstantExpression(generator, c); + } else if (generator.getMappingSet().isWithinConstant()) { + return super.visitSchemaPath(e, generator).setConstant(true); } else { return super.visitSchemaPath(e, generator); } @@ -338,8 +348,11 @@ public class EvaluationVisitor { if (constantBoundaries.contains(e)) { generator.getMappingSet().enterConstant(); HoldingContainer c = super.visitLongConstant(e, generator); - generator.getMappingSet().exitConstant(); - return c; + //generator.getMappingSet().exitConstant(); + //return c; + return renderConstantExpression(generator, c); + } else if (generator.getMappingSet().isWithinConstant()) { + return super.visitLongConstant(e, generator).setConstant(true); } else { return super.visitLongConstant(e, generator); } @@ -350,8 +363,11 @@ public class EvaluationVisitor { if (constantBoundaries.contains(e)) { generator.getMappingSet().enterConstant(); HoldingContainer c = super.visitDoubleConstant(e, generator); - generator.getMappingSet().exitConstant(); - return c; + //generator.getMappingSet().exitConstant(); + //return c; + return renderConstantExpression(generator, c); + } else if (generator.getMappingSet().isWithinConstant()) { + return super.visitDoubleConstant(e, generator).setConstant(true); } else { return super.visitDoubleConstant(e, generator); } @@ -363,8 +379,11 @@ public class EvaluationVisitor { if (constantBoundaries.contains(e)) { generator.getMappingSet().enterConstant(); HoldingContainer c = super.visitBooleanConstant(e, generator); - generator.getMappingSet().exitConstant(); - return c; + //generator.getMappingSet().exitConstant(); + //return c; + return renderConstantExpression(generator, c); + } else if (generator.getMappingSet().isWithinConstant()) { + return super.visitBooleanConstant(e, generator).setConstant(true); } else { return super.visitBooleanConstant(e, generator); } @@ -376,10 +395,13 @@ public class EvaluationVisitor { if (constantBoundaries.contains(e)) { generator.getMappingSet().enterConstant(); HoldingContainer c = super.visitUnknown(e, generator); - generator.getMappingSet().exitConstant(); - return c; + //generator.getMappingSet().exitConstant(); + //return c; + return renderConstantExpression(generator, c); + } else if (generator.getMappingSet().isWithinConstant()) { + return super.visitUnknown(e, generator).setConstant(true); } else { - return super.visitUnknown(e, generator); + return super.visitUnknown(e, generator); } } @@ -389,12 +411,25 @@ public class EvaluationVisitor { if (constantBoundaries.contains(e)) { generator.getMappingSet().enterConstant(); HoldingContainer c = super.visitQuotedStringConstant(e, generator); - generator.getMappingSet().exitConstant(); - return c; + //generator.getMappingSet().exitConstant(); + //return c; + return renderConstantExpression(generator, c); + } else if (generator.getMappingSet().isWithinConstant()) { + return super.visitQuotedStringConstant(e, generator).setConstant(true); } else { - return super.visitQuotedStringConstant(e, generator); + return super.visitQuotedStringConstant(e, generator); } } + /* Get a HoldingContainer for a constant expression. The returned HoldingContainder will indicate it's for + * a constant expression. + * */ + private HoldingContainer renderConstantExpression(ClassGenerator<?> generator, HoldingContainer input){ + JVar fieldValue = generator.declareClassField("constant", generator.getHolderType(input.getMajorType())); + generator.getEvalBlock().assign(fieldValue, input.getHolder()); + generator.getMappingSet().exitConstant(); + return new HoldingContainer(input.getMajorType(), fieldValue, fieldValue.ref("value"), fieldValue.ref("isSet")).setConstant(true); + } + } } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/expr/annotations/Param.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/annotations/Param.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/annotations/Param.java index 20c0746..8bdc2dd 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/annotations/Param.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/annotations/Param.java @@ -31,4 +31,5 @@ import org.apache.drill.common.types.TypeProtos.MinorType; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface Param { + boolean constant() default false; } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillAggFuncHolder.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillAggFuncHolder.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillAggFuncHolder.java index 7622865..5f1e358 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillAggFuncHolder.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillAggFuncHolder.java @@ -63,14 +63,14 @@ class DrillAggFuncHolder extends DrillFuncHolder{ @Override public JVar[] renderStart(ClassGenerator<?> g, HoldingContainer[] inputVariables) { JVar[] workspaceJVars = declareWorkspaceVariables(g); - generateBody(g, BlockType.SETUP, setup, workspaceJVars); + generateBody(g, BlockType.SETUP, setup, null, workspaceJVars, false); return workspaceJVars; } @Override public void renderMiddle(ClassGenerator<?> g, HoldingContainer[] inputVariables, JVar[] workspaceJVars) { - addProtectedBlock(g, g.getBlock(BlockType.EVAL), add, inputVariables, workspaceJVars); + addProtectedBlock(g, g.getBlock(BlockType.EVAL), add, inputVariables, workspaceJVars, false); } @@ -80,11 +80,11 @@ class DrillAggFuncHolder extends DrillFuncHolder{ JBlock sub = new JBlock(); g.getEvalBlock().add(sub); JVar internalOutput = sub.decl(JMod.FINAL, g.getHolderType(returnValue.type), returnValue.name, JExpr._new(g.getHolderType(returnValue.type))); - addProtectedBlock(g, sub, output, null, workspaceJVars); + addProtectedBlock(g, sub, output, null, workspaceJVars, false); sub.assign(out.getHolder(), internalOutput); - generateBody(g, BlockType.RESET, reset, workspaceJVars); - generateBody(g, BlockType.CLEANUP, cleanup, workspaceJVars); + generateBody(g, BlockType.RESET, reset, null, workspaceJVars, false); + generateBody(g, BlockType.CLEANUP, cleanup, null, workspaceJVars, false); return out; } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFuncHolder.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFuncHolder.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFuncHolder.java index dcdf1ea..d1619b2 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFuncHolder.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFuncHolder.java @@ -92,20 +92,26 @@ public abstract class DrillFuncHolder { return workspaceJVars; } - protected void generateBody(ClassGenerator<?> g, BlockType bt, String body, JVar[] workspaceJVars){ + protected void generateBody(ClassGenerator<?> g, BlockType bt, String body, HoldingContainer[] inputVariables, JVar[] workspaceJVars, boolean decConstantInputOnly){ if(!Strings.isNullOrEmpty(body) && !body.trim().isEmpty()){ JBlock sub = new JBlock(true, true); - addProtectedBlock(g, sub, body, null, workspaceJVars); + if (decConstantInputOnly) { + addProtectedBlock(g, sub, body, inputVariables, workspaceJVars, true); + } else { + addProtectedBlock(g, sub, body, null, workspaceJVars, false); + } g.getBlock(bt).directStatement(String.format("/** start %s for function %s **/ ", bt.name(), functionName)); g.getBlock(bt).add(sub); g.getBlock(bt).directStatement(String.format("/** end %s for function %s **/ ", bt.name(), functionName)); } } - protected void addProtectedBlock(ClassGenerator<?> g, JBlock sub, String body, HoldingContainer[] inputVariables, JVar[] workspaceJVars){ - + protected void addProtectedBlock(ClassGenerator<?> g, JBlock sub, String body, HoldingContainer[] inputVariables, JVar[] workspaceJVars, boolean decConstInputOnly){ if(inputVariables != null){ for(int i =0; i < inputVariables.length; i++){ + if (decConstInputOnly && !inputVariables[i].isConstant()) + continue; + ValueReference parameter = parameters[i]; HoldingContainer inputVariable = inputVariables[i]; sub.decl(inputVariable.getHolder().type(), parameter.name, inputVariable.getHolder()); @@ -175,13 +181,20 @@ public abstract class DrillFuncHolder { public static class ValueReference{ MajorType type; String name; + boolean isConstant; public ValueReference(MajorType type, String name) { super(); Preconditions.checkNotNull(type); Preconditions.checkNotNull(name); this.type = type; this.name = name; + isConstant = false; } + + public void setConstant(boolean isConstant) { + this.isConstant = isConstant; + } + @Override public String toString() { return "ValueReference [type=" + type + ", name=" + name + "]"; http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillSimpleFuncHolder.java ---------------------------------------------------------------------- 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 4939063..de847df 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 @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import org.apache.drill.common.exceptions.DrillRuntimeException; import org.apache.drill.common.types.TypeProtos.DataMode; import org.apache.drill.common.types.TypeProtos.MajorType; import org.apache.drill.exec.expr.ClassGenerator; @@ -28,6 +29,7 @@ import org.apache.drill.exec.expr.ClassGenerator.BlockType; import org.apache.drill.exec.expr.ClassGenerator.HoldingContainer; import org.apache.drill.exec.expr.annotations.FunctionTemplate.FunctionScope; import org.apache.drill.exec.expr.annotations.FunctionTemplate.NullHandling; +import org.apache.drill.exec.expr.fn.DrillFuncHolder.ValueReference; import com.google.common.base.Preconditions; import com.google.common.base.Strings; @@ -64,13 +66,20 @@ class DrillSimpleFuncHolder extends DrillFuncHolder{ } public HoldingContainer renderEnd(ClassGenerator<?> g, HoldingContainer[] inputVariables, JVar[] workspaceJVars){ - generateBody(g, BlockType.SETUP, setupBody, workspaceJVars); + //If the function's annotation specifies a parameter has to be constant expression, but the HoldingContainer + //for the argument is not, then raise exception. + for(int i =0; i < inputVariables.length; i++){ + if (parameters[i].isConstant && !inputVariables[i].isConstant()) { + throw new DrillRuntimeException(String.format("The argument '%s' of Function '%s' has to be constant!", parameters[i].name, this.getFunctionName())); + } + } + generateBody(g, BlockType.SETUP, setupBody, inputVariables, workspaceJVars, true); HoldingContainer c = generateEvalBody(g, inputVariables, evalBody, workspaceJVars); - generateBody(g, BlockType.RESET, resetBody, workspaceJVars); - generateBody(g, BlockType.CLEANUP, cleanupBody, workspaceJVars); + generateBody(g, BlockType.RESET, resetBody, null, workspaceJVars, false); + generateBody(g, BlockType.CLEANUP, cleanupBody, null, workspaceJVars, false); return c; } - + protected HoldingContainer generateEvalBody(ClassGenerator<?> g, HoldingContainer[] inputVariables, String body, JVar[] workspaceJVars){ //g.getBlock().directStatement(String.format("//---- start of eval portion of %s function. ----//", functionName)); @@ -111,7 +120,7 @@ class DrillSimpleFuncHolder extends DrillFuncHolder{ JVar internalOutput = sub.decl(JMod.FINAL, g.getHolderType(returnValueType), returnValue.name, JExpr._new(g.getHolderType(returnValueType))); - addProtectedBlock(g, sub, body, inputVariables, workspaceJVars); + 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 sub.assign(out.getHolder(), internalOutput); if (sub != topSub) sub.assign(internalOutput.ref("isSet"),JExpr.lit(1));// Assign null if NULL_IF_NULL mode http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionConverter.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionConverter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionConverter.java index befa9bf..3145240 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionConverter.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionConverter.java @@ -136,6 +136,9 @@ public class FunctionConverter { ValueReference p = new ValueReference(type, field.getName()); if(param != null){ + if (param.constant()) { + p.setConstant(true); + } params.add(p); }else{ if(outputField != null){ http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/Alternator.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/Alternator.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/Alternator.java index 5bff29e..f65af3b 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/Alternator.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/Alternator.java @@ -82,8 +82,8 @@ public class Alternator { @Override public FunctionDefinition[] getFunctionDefintions() { return new FunctionDefinition[]{ - FunctionDefinition.simple("alternate", NoArgValidator.VALIDATOR, new OutputTypeDeterminer.FixedType(Types.required(MinorType.BIGINT)), "alternate"), - FunctionDefinition.simple("alternate3", NoArgValidator.VALIDATOR, new OutputTypeDeterminer.FixedType(Types.required(MinorType.BIGINT)), "alternate3") + FunctionDefinition.simpleRandom("alternate", NoArgValidator.VALIDATOR, new OutputTypeDeterminer.FixedType(Types.required(MinorType.BIGINT)), "alternate"), + FunctionDefinition.simpleRandom("alternate3", NoArgValidator.VALIDATOR, new OutputTypeDeterminer.FixedType(Types.required(MinorType.BIGINT)), "alternate3") }; } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/AggBatch.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/AggBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/AggBatch.java index 86fea4e..ad60e8f 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/AggBatch.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/AggBatch.java @@ -203,17 +203,17 @@ public class AggBatch extends AbstractRecordBatch<StreamingAggregate> { - private final GeneratorMapping IS_SAME = GeneratorMapping.create("setupInterior", "isSame", null, null); - private final MappingSet IS_SAME_I1 = new MappingSet("index1", null, IS_SAME, IS_SAME); - private final MappingSet IS_SAME_I2 = new MappingSet("index2", null, IS_SAME, IS_SAME); + private static final GeneratorMapping IS_SAME = GeneratorMapping.create("setupInterior", "isSame", null, null); + private final MappingSet isSameI1Mapping = new MappingSet("index1", null, IS_SAME, IS_SAME); + private final MappingSet isSameI2Mapping = new MappingSet("index2", null, IS_SAME, IS_SAME); private void setupIsSame(ClassGenerator<Aggregator> cg, LogicalExpression[] keyExprs){ - cg.setMappingSet(IS_SAME_I1); + cg.setMappingSet(isSameI1Mapping); for(LogicalExpression expr : keyExprs){ // first, we rewrite the evaluation stack for each side of the comparison. - cg.setMappingSet(IS_SAME_I1); + cg.setMappingSet(isSameI1Mapping); HoldingContainer first = cg.addExpr(expr, false); - cg.setMappingSet(IS_SAME_I2); + cg.setMappingSet(isSameI2Mapping); HoldingContainer second = cg.addExpr(expr, false); FunctionCall f = new FunctionCall(ComparatorFunctions.COMPARE_TO, ImmutableList.of((LogicalExpression) new HoldingContainerExpression(first), new HoldingContainerExpression(second)), ExpressionPosition.UNKNOWN); @@ -223,18 +223,18 @@ public class AggBatch extends AbstractRecordBatch<StreamingAggregate> { cg.getEvalBlock()._return(JExpr.TRUE); } - private final GeneratorMapping IS_SAME_PREV_INTERNAL_BATCH_READ = GeneratorMapping.create("isSamePrev", "isSamePrev", null, null); // the internal batch changes each time so we need to redo setup. - private final GeneratorMapping IS_SAME_PREV = GeneratorMapping.create("setupInterior", "isSamePrev", null, null); - private final MappingSet ISA_B1 = new MappingSet("b1Index", null, "b1", null, IS_SAME_PREV_INTERNAL_BATCH_READ, IS_SAME_PREV_INTERNAL_BATCH_READ); - private final MappingSet ISA_B2 = new MappingSet("b2Index", null, "incoming", null, IS_SAME_PREV, IS_SAME_PREV); + private static final GeneratorMapping IS_SAME_PREV_INTERNAL_BATCH_READ = GeneratorMapping.create("isSamePrev", "isSamePrev", null, null); // the internal batch changes each time so we need to redo setup. + private static final GeneratorMapping IS_SAME_PREV = GeneratorMapping.create("setupInterior", "isSamePrev", null, null); + private final MappingSet isaB1Mapping = new MappingSet("b1Index", null, "b1", null, IS_SAME_PREV_INTERNAL_BATCH_READ, IS_SAME_PREV_INTERNAL_BATCH_READ); + private final MappingSet isaB2Mapping = new MappingSet("b2Index", null, "incoming", null, IS_SAME_PREV, IS_SAME_PREV); private void setupIsSameApart(ClassGenerator<Aggregator> cg, LogicalExpression[] keyExprs){ - cg.setMappingSet(ISA_B1); + cg.setMappingSet(isaB1Mapping); for(LogicalExpression expr : keyExprs){ // first, we rewrite the evaluation stack for each side of the comparison. - cg.setMappingSet(ISA_B1); + cg.setMappingSet(isaB1Mapping); HoldingContainer first = cg.addExpr(expr, false); - cg.setMappingSet(ISA_B2); + cg.setMappingSet(isaB2Mapping); HoldingContainer second = cg.addExpr(expr, false); FunctionCall f = new FunctionCall(ComparatorFunctions.COMPARE_TO, ImmutableList.of((LogicalExpression) new HoldingContainerExpression(first), new HoldingContainerExpression(second)), ExpressionPosition.UNKNOWN); @@ -244,12 +244,12 @@ public class AggBatch extends AbstractRecordBatch<StreamingAggregate> { cg.getEvalBlock()._return(JExpr.TRUE); } - private final GeneratorMapping EVAL_INSIDE = GeneratorMapping.create("setupInterior", "addRecord", null, null); - private final GeneratorMapping EVAL_OUTSIDE = GeneratorMapping.create("setupInterior", "outputRecordValues", "resetValues", "cleanup"); - private final MappingSet EVAL = new MappingSet("index", "outIndex", EVAL_INSIDE, EVAL_OUTSIDE, EVAL_INSIDE); + private static final GeneratorMapping EVAL_INSIDE = GeneratorMapping.create("setupInterior", "addRecord", null, null); + private static final GeneratorMapping EVAL_OUTSIDE = GeneratorMapping.create("setupInterior", "outputRecordValues", "resetValues", "cleanup"); + private final MappingSet evalMapping = new MappingSet("index", "outIndex", EVAL_INSIDE, EVAL_OUTSIDE, EVAL_INSIDE); private void addRecordValues(ClassGenerator<Aggregator> cg, LogicalExpression[] valueExprs){ - cg.setMappingSet(EVAL); + cg.setMappingSet(evalMapping); for(LogicalExpression ex : valueExprs){ HoldingContainer hc = cg.addExpr(ex); cg.getBlock(BlockType.EVAL)._if(hc.getValue().eq(JExpr.lit(0)))._then()._return(JExpr.FALSE); @@ -257,10 +257,10 @@ public class AggBatch extends AbstractRecordBatch<StreamingAggregate> { cg.getBlock(BlockType.EVAL)._return(JExpr.TRUE); } - private final MappingSet RECORD_KEYS = new MappingSet(GeneratorMapping.create("setupInterior", "outputRecordKeys", null, null)); + private final MappingSet recordKeysMapping = new MappingSet(GeneratorMapping.create("setupInterior", "outputRecordKeys", null, null)); private void outputRecordKeys(ClassGenerator<Aggregator> cg, TypedFieldId[] keyOutputIds, LogicalExpression[] keyExprs){ - cg.setMappingSet(RECORD_KEYS); + cg.setMappingSet(recordKeysMapping); for(int i =0; i < keyExprs.length; i++){ HoldingContainer hc = cg.addExpr(new ValueVectorWriteExpression(keyOutputIds[i], keyExprs[i], true)); cg.getBlock(BlockType.EVAL)._if(hc.getValue().eq(JExpr.lit(0)))._then()._return(JExpr.FALSE); @@ -268,22 +268,22 @@ public class AggBatch extends AbstractRecordBatch<StreamingAggregate> { cg.getBlock(BlockType.EVAL)._return(JExpr.TRUE); } - private final GeneratorMapping PREVIOUS_KEYS_OUT = GeneratorMapping.create("setupInterior", "outputRecordKeysPrev", null, null); - private final MappingSet RECORD_KEYS_PREV_OUT = new MappingSet("previousIndex", "outIndex", "previous", "outgoing", PREVIOUS_KEYS_OUT, PREVIOUS_KEYS_OUT); + private static final GeneratorMapping PREVIOUS_KEYS_OUT = GeneratorMapping.create("setupInterior", "outputRecordKeysPrev", null, null); + private final MappingSet recordKeysPrevOutMapping = new MappingSet("previousIndex", "outIndex", "previous", "outgoing", PREVIOUS_KEYS_OUT, PREVIOUS_KEYS_OUT); - private final GeneratorMapping PREVIOUS_KEYS = GeneratorMapping.create("outputRecordKeysPrev", "outputRecordKeysPrev", null, null); - private final MappingSet RECORD_KEYS_PREV = new MappingSet("previousIndex", "outIndex", "previous", null, PREVIOUS_KEYS, PREVIOUS_KEYS); + private static final GeneratorMapping PREVIOUS_KEYS = GeneratorMapping.create("outputRecordKeysPrev", "outputRecordKeysPrev", null, null); + private final MappingSet recordKeysPrevMapping = new MappingSet("previousIndex", "outIndex", "previous", null, PREVIOUS_KEYS, PREVIOUS_KEYS); private void outputRecordKeysPrev(ClassGenerator<Aggregator> cg, TypedFieldId[] keyOutputIds, LogicalExpression[] keyExprs){ - cg.setMappingSet(RECORD_KEYS_PREV); + cg.setMappingSet(recordKeysPrevMapping); for(int i =0; i < keyExprs.length; i++){ // IMPORTANT: there is an implicit assertion here that the TypedFieldIds for the previous batch and the current batch are the same. This is possible because InternalBatch guarantees this. logger.debug("Writing out expr {}", keyExprs[i]); cg.rotateBlock(); - cg.setMappingSet(RECORD_KEYS_PREV); + cg.setMappingSet(recordKeysPrevMapping); HoldingContainer innerExpression = cg.addExpr(keyExprs[i], false); - cg.setMappingSet(RECORD_KEYS_PREV_OUT); + cg.setMappingSet(recordKeysPrevOutMapping); HoldingContainer outerExpression = cg.addExpr(new ValueVectorWriteExpression(keyOutputIds[i], new HoldingContainerExpression(innerExpression), true), false); cg.getBlock(BlockType.EVAL)._if(outerExpression.getValue().eq(JExpr.lit(0)))._then()._return(JExpr.FALSE); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/MergeJoinBatch.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/MergeJoinBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/MergeJoinBatch.java index 7680ff9..6e98543 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/MergeJoinBatch.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/MergeJoinBatch.java @@ -79,31 +79,31 @@ public class MergeJoinBatch extends AbstractRecordBatch<MergeJoinPOP> { // private static final MappingSet COMPARE_LEFT_MAPPING = new MappingSet("leftIndex", "null", compareLeft, compareLeft); // private static final MappingSet COMPARE_NEXT_LEFT_MAPPING = new MappingSet("nextLeftIndex", "null", compareLeft, compareLeft); // - public static final MappingSet SETUP_MAPPING = + public final MappingSet setupMapping = new MappingSet("null", "null", GM("doSetup", "doSetup", null, null), GM("doSetup", "doSetup", null, null)); - public static final MappingSet COPY_LEFT_MAPPING = + public final MappingSet copyLeftMapping = new MappingSet("leftIndex", "outIndex", GM("doSetup", "doCopyLeft", null, null), GM("doSetup", "doCopyLeft", null, null)); - public static final MappingSet COPY_RIGHT_MAPPING = + public final MappingSet copyRightMappping = new MappingSet("rightIndex", "outIndex", GM("doSetup", "doCopyRight", null, null), GM("doSetup", "doCopyRight", null, null)); - public static final MappingSet COMPARE_MAPPING = + public final MappingSet compareMapping = new MappingSet("leftIndex", "rightIndex", GM("doSetup", "doCompare", null, null), GM("doSetup", "doCompare", null, null)); - public static final MappingSet COMPARE_RIGHT_MAPPING = + public final MappingSet compareRightMapping = new MappingSet("rightIndex", "null", GM("doSetup", "doCompare", null, null), GM("doSetup", "doCompare", null, null)); - public static final MappingSet COMPARE_LEFT_MAPPING = + public final MappingSet compareLeftMapping = new MappingSet("leftIndex", "null", GM("doSetup", "doCompareNextLeftKey", null, null), GM("doSetup", "doCompareNextLeftKey", null, null)); - public static final MappingSet COMPARE_NEXT_LEFT_MAPPING = + public final MappingSet compareNextLeftMapping = new MappingSet("nextLeftIndex", "null", GM("doSetup", "doCompareNextLeftKey", null, null), GM("doSetup", "doCompareNextLeftKey", null, null)); @@ -226,7 +226,7 @@ public class MergeJoinBatch extends AbstractRecordBatch<MergeJoinPOP> { ///////////////////////////////////////// // declare and assign JoinStatus member - cg.setMappingSet(SETUP_MAPPING); + cg.setMappingSet(setupMapping); JClass joinStatusClass = cg.getModel().ref(JoinStatus.class); JVar joinStatus = cg.clazz.field(JMod.NONE, joinStatusClass, "status"); cg.getSetupBlock().assign(JExpr._this().ref(joinStatus), JExpr.direct("status")); @@ -262,10 +262,11 @@ public class MergeJoinBatch extends AbstractRecordBatch<MergeJoinPOP> { // generate compare() //////////////////////// - cg.setMappingSet(COMPARE_MAPPING); + cg.setMappingSet(compareMapping); cg.getSetupBlock().assign(JExpr._this().ref(incomingRecordBatch), JExpr._this().ref(incomingLeftRecordBatch)); ClassGenerator.HoldingContainer compareLeftExprHolder = cg.addExpr(materializedLeftExpr, false); - cg.setMappingSet(COMPARE_RIGHT_MAPPING); + + cg.setMappingSet(compareRightMapping); cg.getSetupBlock().assign(JExpr._this().ref(incomingRecordBatch), JExpr._this().ref(incomingRightRecordBatch)); ClassGenerator.HoldingContainer compareRightExprHolder = cg.addExpr(materializedRightExpr, false); @@ -312,7 +313,7 @@ public class MergeJoinBatch extends AbstractRecordBatch<MergeJoinPOP> { // generate compareNextLeftKey() //////////////////////////////// - cg.setMappingSet(COMPARE_LEFT_MAPPING); + cg.setMappingSet(compareLeftMapping); cg.getSetupBlock().assign(JExpr._this().ref(incomingRecordBatch), JExpr._this().ref(incomingLeftRecordBatch)); // int nextLeftIndex = leftIndex + 1; @@ -325,7 +326,7 @@ public class MergeJoinBatch extends AbstractRecordBatch<MergeJoinPOP> { // generate VV read expressions ClassGenerator.HoldingContainer compareThisLeftExprHolder = cg.addExpr(materializedLeftExpr, false); - cg.setMappingSet(COMPARE_NEXT_LEFT_MAPPING); // change mapping from 'leftIndex' to 'nextLeftIndex' + cg.setMappingSet(compareNextLeftMapping); // change mapping from 'leftIndex' to 'nextLeftIndex' ClassGenerator.HoldingContainer compareNextLeftExprHolder = cg.addExpr(materializedLeftExpr, false); if (compareThisLeftExprHolder.isOptional()) { @@ -348,7 +349,7 @@ public class MergeJoinBatch extends AbstractRecordBatch<MergeJoinPOP> { // generate copyLeft() ////////////////////// - cg.setMappingSet(COPY_LEFT_MAPPING); + cg.setMappingSet(copyLeftMapping); int vectorId = 0; for (VectorWrapper<?> vw : left) { JVar vvIn = cg.declareVectorValueSetupAndMember("incomingLeft", @@ -357,8 +358,8 @@ public class MergeJoinBatch extends AbstractRecordBatch<MergeJoinPOP> { new TypedFieldId(vw.getField().getType(),vectorId)); // todo: check result of copyFromSafe and grow allocation cg.getEvalBlock()._if(vvOut.invoke("copyFromSafe") - .arg(COPY_LEFT_MAPPING.getValueReadIndex()) - .arg(COPY_LEFT_MAPPING.getValueWriteIndex()) + .arg(copyLeftMapping.getValueReadIndex()) + .arg(copyLeftMapping.getValueWriteIndex()) .arg(vvIn).eq(JExpr.FALSE)) ._then() ._return(JExpr.FALSE); @@ -368,7 +369,7 @@ public class MergeJoinBatch extends AbstractRecordBatch<MergeJoinPOP> { // generate copyRight() /////////////////////// - cg.setMappingSet(COPY_RIGHT_MAPPING); + cg.setMappingSet(copyRightMappping); int rightVectorBase = vectorId; for (VectorWrapper<?> vw : right) { @@ -378,8 +379,8 @@ public class MergeJoinBatch extends AbstractRecordBatch<MergeJoinPOP> { new TypedFieldId(vw.getField().getType(),vectorId)); // todo: check result of copyFromSafe and grow allocation cg.getEvalBlock()._if(vvOut.invoke("copyFromSafe") - .arg(COPY_RIGHT_MAPPING.getValueReadIndex()) - .arg(COPY_RIGHT_MAPPING.getValueWriteIndex()) + .arg(copyRightMappping.getValueReadIndex()) + .arg(copyRightMappping.getValueWriteIndex()) .arg(vvIn).eq(JExpr.FALSE)) ._then() ._return(JExpr.FALSE); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/mergereceiver/MergingReceiverGeneratorBase.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/mergereceiver/MergingReceiverGeneratorBase.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/mergereceiver/MergingReceiverGeneratorBase.java index 3193c76..9096018 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/mergereceiver/MergingReceiverGeneratorBase.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/mergereceiver/MergingReceiverGeneratorBase.java @@ -40,12 +40,12 @@ public interface MergingReceiverGeneratorBase { public static TemplateClassDefinition<MergingReceiverGeneratorBase> TEMPLATE_DEFINITION = new TemplateClassDefinition<>(MergingReceiverGeneratorBase.class, MergingReceiverTemplate.class); - public final MappingSet COMPARE_MAPPING = + public final MappingSet compareMapping = new MappingSet("left.valueIndex", "right.valueIndex", GM("doSetup", "doCompare", null, null), GM("doSetup", "doCompare", null, null)); - public final MappingSet COPY_MAPPING = + public final MappingSet copyMapping = new MappingSet("inIndex", "outIndex", GM("doSetup", "doCopy", null, null), GM("doSetup", "doCopy", null, null)); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/mergereceiver/MergingRecordBatch.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/mergereceiver/MergingRecordBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/mergereceiver/MergingRecordBatch.java index 72f1ad9..8572085 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/mergereceiver/MergingRecordBatch.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/mergereceiver/MergingRecordBatch.java @@ -411,7 +411,7 @@ public class MergingRecordBatch implements RecordBatch { cg.getSetupBlock().assign(incomingBatchesVar, JExpr.direct("incomingBatchLoaders")); cg.getSetupBlock().assign(outgoingBatch, JExpr.direct("outgoing")); - cg.setMappingSet(MergingReceiverGeneratorBase.COMPARE_MAPPING); + cg.setMappingSet(MergingReceiverGeneratorBase.compareMapping); // evaluate expression on each incoming batch and create/initialize 2d array of incoming vectors. For example: // incomingVectors = new ValueVector[][] { @@ -566,7 +566,7 @@ public class MergingRecordBatch implements RecordBatch { cg.getSetupBlock().assign(outgoingVectors, JExpr.newArray(cg.getModel().ref(ValueVector.class), fieldsPerBatch)); // generate copy function and setup outgoing batches - cg.setMappingSet(MergingReceiverGeneratorBase.COPY_MAPPING); + cg.setMappingSet(MergingReceiverGeneratorBase.copyMapping); int fieldIdx = 0; for (VectorWrapper<?> vvOut : outgoingContainer) { // declare outgoing value vectors http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/orderedpartitioner/OrderedPartitionRecordBatch.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/orderedpartitioner/OrderedPartitionRecordBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/orderedpartitioner/OrderedPartitionRecordBatch.java index 381fbe2..3413046 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/orderedpartitioner/OrderedPartitionRecordBatch.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/orderedpartitioner/OrderedPartitionRecordBatch.java @@ -88,12 +88,12 @@ import com.sun.codemodel.JExpr; public class OrderedPartitionRecordBatch extends AbstractRecordBatch<OrderedPartitionSender> { static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(OrderedPartitionRecordBatch.class); - public final MappingSet mainMapping = new MappingSet((String) null, null, ClassGenerator.DEFAULT_SCALAR_MAP, + public final MappingSet mainMapping = new MappingSet( (String) null, null, ClassGenerator.DEFAULT_CONSTANT_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); - public final MappingSet incomingMapping = new MappingSet("inIndex", null, "incoming", null, - ClassGenerator.DEFAULT_SCALAR_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); + public final MappingSet incomingMapping = new MappingSet("inIndex", null, "incoming", null, + ClassGenerator.DEFAULT_CONSTANT_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); public final MappingSet partitionMapping = new MappingSet("partitionIndex", null, "partitionVectors", null, - ClassGenerator.DEFAULT_SCALAR_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); + ClassGenerator.DEFAULT_CONSTANT_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); private static long MAX_SORT_BYTES = 8l * 1024 * 1024 * 1024; private final int recordsToSample; // How many records must be received before analyzing http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/sort/SortBatch.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/sort/SortBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/sort/SortBatch.java index 5fd12c0..3364a45 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/sort/SortBatch.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/sort/SortBatch.java @@ -53,9 +53,9 @@ import com.sun.codemodel.JExpr; public class SortBatch extends AbstractRecordBatch<Sort> { static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SortBatch.class); - public final MappingSet MAIN_MAPPING = new MappingSet( (String) null, null, ClassGenerator.DEFAULT_SCALAR_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); - public final MappingSet LEFT_MAPPING = new MappingSet("leftIndex", null, ClassGenerator.DEFAULT_SCALAR_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); - public final MappingSet RIGHT_MAPPING = new MappingSet("rightIndex", null, ClassGenerator.DEFAULT_SCALAR_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); + public final MappingSet mainMapping = new MappingSet( (String) null, null, ClassGenerator.DEFAULT_CONSTANT_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); + public final MappingSet leftMapping = new MappingSet("leftIndex", null, ClassGenerator.DEFAULT_CONSTANT_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); + public final MappingSet rightMapping = new MappingSet("rightIndex", null, ClassGenerator.DEFAULT_CONSTANT_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); private static long MAX_SORT_BYTES = 8l * 1024 * 1024 * 1024; @@ -161,13 +161,14 @@ public class SortBatch extends AbstractRecordBatch<Sort> { } private Sorter createNewSorter() throws ClassTransformationException, IOException, SchemaChangeException { - return createNewSorter(this.context, this.popConfig.getOrderings(), this, MAIN_MAPPING, LEFT_MAPPING, RIGHT_MAPPING); + return createNewSorter(this.context, this.popConfig.getOrderings(), this, mainMapping, leftMapping, rightMapping); } public static Sorter createNewSorter(FragmentContext context, List<Ordering> orderings, VectorAccessible batch) throws ClassTransformationException, IOException, SchemaChangeException { - final MappingSet mainMapping = new MappingSet( (String) null, null, ClassGenerator.DEFAULT_SCALAR_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); - final MappingSet leftMapping = new MappingSet("leftIndex", null, ClassGenerator.DEFAULT_SCALAR_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); - final MappingSet rightMapping = new MappingSet("rightIndex", null, ClassGenerator.DEFAULT_SCALAR_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); + final MappingSet mainMapping = new MappingSet( (String) null, null, ClassGenerator.DEFAULT_CONSTANT_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); + final MappingSet leftMapping = new MappingSet("leftIndex", null, ClassGenerator.DEFAULT_CONSTANT_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); + final MappingSet rightMapping = new MappingSet("rightIndex", null, ClassGenerator.DEFAULT_CONSTANT_MAP, ClassGenerator.DEFAULT_SCALAR_MAP); + return createNewSorter(context, orderings, batch, mainMapping, leftMapping, rightMapping); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/8cc75bf5/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/GeneratorFunctions.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/GeneratorFunctions.java b/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/GeneratorFunctions.java index b79ccd0..7ec7243 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/GeneratorFunctions.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/GeneratorFunctions.java @@ -35,11 +35,11 @@ import java.util.Random; public class GeneratorFunctions { public static final Random random = new Random(1234L); - public static final FunctionDefinition RANDOM_BIG_INT = FunctionDefinition.simple("randomBigInt", new ArgumentValidators.NumericTypeAllowed(1,2, true), + public static final FunctionDefinition RANDOM_BIG_INT = FunctionDefinition.simpleRandom("randomBigInt", new ArgumentValidators.NumericTypeAllowed(1,2, true), OutputTypeDeterminer.FIXED_BIGINT, "randomBigInt"); - public static final FunctionDefinition RANDOM_FLOAT8 = FunctionDefinition.simple("randomFloat8", new ArgumentValidators.NumericTypeAllowed(1,2, true), + public static final FunctionDefinition RANDOM_FLOAT8 = FunctionDefinition.simpleRandom("randomFloat8", new ArgumentValidators.NumericTypeAllowed(1,2, true), OutputTypeDeterminer.FIXED_FLOAT8, "randomFloat8"); - public static final FunctionDefinition INCREASING_BIGINT = FunctionDefinition.simple("increasingBigInt", new ArgumentValidators.NumericTypeAllowed(1, true), + public static final FunctionDefinition INCREASING_BIGINT = FunctionDefinition.simpleRandom("increasingBigInt", new ArgumentValidators.NumericTypeAllowed(1, true), OutputTypeDeterminer.FIXED_BIGINT, "increasingBigInt"); public static class Provider implements CallProvider {
