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 {

Reply via email to