You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by me...@apache.org on 2015/08/02 16:55:24 UTC

[2/4] drill git commit: DRILL-3500: Add OptimizerRulesContext which exposes information needed by storage plugin specific optimizer rules Add FunctionLookupContext to enable materializing function calls without having access to the entire function regist

DRILL-3500: Add OptimizerRulesContext which exposes information needed by storage plugin specific optimizer rules
Add FunctionLookupContext to enable materializing function calls without having access to the entire function registry


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/f8197cfe
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/f8197cfe
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/f8197cfe

Branch: refs/heads/master
Commit: f8197cfe1bc3671aa6878ef9d1869b2fe8e57331
Parents: 8083508
Author: Mehant Baid <me...@gmail.com>
Authored: Wed Jul 15 14:30:16 2015 -0700
Committer: Mehant Baid <me...@gmail.com>
Committed: Thu Jul 30 20:17:25 2015 -0700

----------------------------------------------------------------------
 .../exec/store/hbase/HBaseStoragePlugin.java    |   4 +-
 .../exec/store/hive/HiveStoragePlugin.java      |   5 +-
 .../exec/store/mongo/MongoStoragePlugin.java    |   4 +-
 .../exec/expr/ExpressionTreeMaterializer.java   | 108 +++++++++----------
 .../expr/fn/FunctionImplementationRegistry.java |   4 +-
 .../exec/expr/fn/FunctionLookupContext.java     |  47 ++++++++
 .../drill/exec/ops/OptimizerRulesContext.java   |  42 ++++++++
 .../org/apache/drill/exec/ops/QueryContext.java |   5 +-
 .../exec/planner/logical/DrillRuleSets.java     |  37 +++----
 .../logical/partition/PruneScanRule.java        |  32 +++---
 .../drill/exec/planner/sql/DrillSqlWorker.java  |   2 +-
 .../drill/exec/store/AbstractStoragePlugin.java |   3 +-
 .../apache/drill/exec/store/StoragePlugin.java  |   3 +-
 .../drill/exec/store/StoragePluginRegistry.java |   5 +-
 .../drill/exec/store/dfs/FileSystemPlugin.java  |   3 +-
 .../store/ischema/InfoSchemaStoragePlugin.java  |   3 +-
 16 files changed, 206 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java
----------------------------------------------------------------------
diff --git a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java
index e0f2eae..ffdd12b 100644
--- a/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java
+++ b/contrib/storage-hbase/src/main/java/org/apache/drill/exec/store/hbase/HBaseStoragePlugin.java
@@ -23,6 +23,7 @@ import java.util.Set;
 import org.apache.calcite.schema.SchemaPlus;
 
 import org.apache.drill.common.JSONOptions;
+import org.apache.drill.exec.ops.OptimizerRulesContext;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.store.AbstractStoragePlugin;
 import org.apache.drill.exec.store.SchemaConfig;
@@ -76,8 +77,7 @@ public class HBaseStoragePlugin extends AbstractStoragePlugin {
   }
 
   @Override
-  public Set<StoragePluginOptimizerRule> getOptimizerRules() {
+  public Set<StoragePluginOptimizerRule> getOptimizerRules(OptimizerRulesContext optimizerRulesContext) {
     return ImmutableSet.of(HBasePushFilterIntoScan.FILTER_ON_SCAN, HBasePushFilterIntoScan.FILTER_ON_PROJECT);
   }
-
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveStoragePlugin.java
----------------------------------------------------------------------
diff --git a/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveStoragePlugin.java b/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveStoragePlugin.java
index fb827cc..4813c5e 100644
--- a/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveStoragePlugin.java
+++ b/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/store/hive/HiveStoragePlugin.java
@@ -28,6 +28,7 @@ import org.apache.calcite.schema.SchemaPlus;
 import org.apache.drill.common.JSONOptions;
 import org.apache.drill.common.exceptions.ExecutionSetupException;
 import org.apache.drill.common.expression.SchemaPath;
+import org.apache.drill.exec.ops.OptimizerRulesContext;
 import org.apache.drill.exec.planner.sql.logical.HivePushPartitionFilterIntoScan;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.store.AbstractStoragePlugin;
@@ -85,7 +86,9 @@ public class HiveStoragePlugin extends AbstractStoragePlugin {
   public void registerSchemas(SchemaConfig schemaConfig, SchemaPlus parent) throws IOException {
     schemaFactory.registerSchemas(schemaConfig, parent);
   }
-  public Set<StoragePluginOptimizerRule> getOptimizerRules() {
+
+  @Override
+  public Set<StoragePluginOptimizerRule> getOptimizerRules(OptimizerRulesContext optimizerRulesContext) {
     return ImmutableSet.of(HivePushPartitionFilterIntoScan.HIVE_FILTER_ON_PROJECT, HivePushPartitionFilterIntoScan.HIVE_FILTER_ON_SCAN);
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePlugin.java
----------------------------------------------------------------------
diff --git a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePlugin.java b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePlugin.java
index 093df57..00912ea 100644
--- a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePlugin.java
+++ b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePlugin.java
@@ -27,6 +27,7 @@ import java.util.concurrent.TimeUnit;
 import org.apache.calcite.schema.SchemaPlus;
 import org.apache.drill.common.JSONOptions;
 import org.apache.drill.common.exceptions.ExecutionSetupException;
+import org.apache.drill.exec.ops.OptimizerRulesContext;
 import org.apache.drill.exec.physical.base.AbstractGroupScan;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.store.AbstractStoragePlugin;
@@ -96,7 +97,8 @@ public class MongoStoragePlugin extends AbstractStoragePlugin {
     return new MongoGroupScan(userName, this, mongoScanSpec, null);
   }
 
-  public Set<StoragePluginOptimizerRule> getOptimizerRules() {
+  @Override
+  public Set<StoragePluginOptimizerRule> getOptimizerRules(OptimizerRulesContext optimizerRulesContext) {
     return ImmutableSet.of(MongoPushDownFilterForScan.INSTANCE);
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
index 7413a97..df315b2 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
@@ -66,6 +66,7 @@ import org.apache.drill.exec.expr.fn.AbstractFuncHolder;
 import org.apache.drill.exec.expr.fn.DrillComplexWriterFuncHolder;
 import org.apache.drill.exec.expr.fn.DrillFuncHolder;
 import org.apache.drill.exec.expr.fn.FunctionImplementationRegistry;
+import org.apache.drill.exec.expr.fn.FunctionLookupContext;
 import org.apache.drill.exec.record.TypedFieldId;
 import org.apache.drill.exec.record.VectorAccessible;
 import org.apache.drill.exec.resolver.FunctionResolver;
@@ -77,7 +78,6 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
-import org.apache.drill.exec.vector.VarCharVector;
 
 public class ExpressionTreeMaterializer {
 
@@ -86,22 +86,22 @@ public class ExpressionTreeMaterializer {
   private ExpressionTreeMaterializer() {
   };
 
-  public static LogicalExpression materialize(LogicalExpression expr, VectorAccessible batch, ErrorCollector errorCollector, FunctionImplementationRegistry registry) {
-    return ExpressionTreeMaterializer.materialize(expr, batch, errorCollector, registry, false);
+  public static LogicalExpression materialize(LogicalExpression expr, VectorAccessible batch, ErrorCollector errorCollector, FunctionLookupContext functionLookupContext) {
+    return ExpressionTreeMaterializer.materialize(expr, batch, errorCollector, functionLookupContext, false);
   }
 
-  public static LogicalExpression materializeAndCheckErrors(LogicalExpression expr, VectorAccessible batch, FunctionImplementationRegistry registry) throws SchemaChangeException {
+  public static LogicalExpression materializeAndCheckErrors(LogicalExpression expr, VectorAccessible batch, FunctionLookupContext functionLookupContext) throws SchemaChangeException {
     ErrorCollector collector = new ErrorCollectorImpl();
-    LogicalExpression e = ExpressionTreeMaterializer.materialize(expr, batch, collector, registry, false);
+    LogicalExpression e = ExpressionTreeMaterializer.materialize(expr, batch, collector, functionLookupContext, false);
     if (collector.hasErrors()) {
       throw new SchemaChangeException(String.format("Failure while trying to materialize incoming schema.  Errors:\n %s.", collector.toErrorString()));
     }
     return e;
   }
 
-  public static LogicalExpression materialize(LogicalExpression expr, VectorAccessible batch, ErrorCollector errorCollector, FunctionImplementationRegistry registry,
+  public static LogicalExpression materialize(LogicalExpression expr, VectorAccessible batch, ErrorCollector errorCollector, FunctionLookupContext functionLookupContext,
       boolean allowComplexWriterExpr) {
-    LogicalExpression out =  expr.accept(new MaterializeVisitor(batch, errorCollector, allowComplexWriterExpr), registry);
+    LogicalExpression out =  expr.accept(new MaterializeVisitor(batch, errorCollector, allowComplexWriterExpr), functionLookupContext);
 
     if (!errorCollector.hasErrors()) {
       out = out.accept(ConditionalExprOptimizer.INSTANCE, null);
@@ -114,14 +114,14 @@ public class ExpressionTreeMaterializer {
     }
   }
 
-  public static LogicalExpression convertToNullableType(LogicalExpression fromExpr, MinorType toType, FunctionImplementationRegistry registry, ErrorCollector errorCollector) {
+  public static LogicalExpression convertToNullableType(LogicalExpression fromExpr, MinorType toType, FunctionLookupContext functionLookupContext, ErrorCollector errorCollector) {
     String funcName = "convertToNullable" + toType.toString();
     List<LogicalExpression> args = Lists.newArrayList();
     args.add(fromExpr);
     FunctionCall funcCall = new FunctionCall(funcName, args, ExpressionPosition.UNKNOWN);
     FunctionResolver resolver = FunctionResolverFactory.getResolver(funcCall);
 
-    DrillFuncHolder matchedConvertToNullableFuncHolder = registry.findDrillFunction(resolver, funcCall);
+    DrillFuncHolder matchedConvertToNullableFuncHolder = functionLookupContext.findDrillFunction(resolver, funcCall);
     if (matchedConvertToNullableFuncHolder == null) {
       logFunctionResolutionError(errorCollector, funcCall);
       return NullExpression.INSTANCE;
@@ -131,7 +131,7 @@ public class ExpressionTreeMaterializer {
   }
 
 
-  public static LogicalExpression addCastExpression(LogicalExpression fromExpr, MajorType toType, FunctionImplementationRegistry registry, ErrorCollector errorCollector) {
+  public static LogicalExpression addCastExpression(LogicalExpression fromExpr, MajorType toType, FunctionLookupContext functionLookupContext, ErrorCollector errorCollector) {
     String castFuncName = CastFunctions.getCastFunc(toType.getMinorType());
     List<LogicalExpression> castArgs = Lists.newArrayList();
     castArgs.add(fromExpr);  //input_expr
@@ -151,7 +151,7 @@ public class ExpressionTreeMaterializer {
     }
     FunctionCall castCall = new FunctionCall(castFuncName, castArgs, ExpressionPosition.UNKNOWN);
     FunctionResolver resolver = FunctionResolverFactory.getExactResolver(castCall);
-    DrillFuncHolder matchedCastFuncHolder = registry.findDrillFunction(resolver, castCall);
+    DrillFuncHolder matchedCastFuncHolder = functionLookupContext.findDrillFunction(resolver, castCall);
 
     if (matchedCastFuncHolder == null) {
       logFunctionResolutionError(errorCollector, castCall);
@@ -185,7 +185,7 @@ public class ExpressionTreeMaterializer {
     errorCollector.addGeneralError(call.getPosition(), sb.toString());
   }
 
-  private static class MaterializeVisitor extends AbstractExprVisitor<LogicalExpression, FunctionImplementationRegistry, RuntimeException> {
+  private static class MaterializeVisitor extends AbstractExprVisitor<LogicalExpression, FunctionLookupContext, RuntimeException> {
     private ExpressionValidator validator = new ExpressionValidator();
     private final ErrorCollector errorCollector;
     private final VectorAccessible batch;
@@ -203,22 +203,22 @@ public class ExpressionTreeMaterializer {
     }
 
     @Override
-    public LogicalExpression visitUnknown(LogicalExpression e, FunctionImplementationRegistry registry)
+    public LogicalExpression visitUnknown(LogicalExpression e, FunctionLookupContext functionLookupContext)
       throws RuntimeException {
       return e;
     }
 
     @Override
-    public LogicalExpression visitFunctionHolderExpression(FunctionHolderExpression holder, FunctionImplementationRegistry value) throws RuntimeException {
+    public LogicalExpression visitFunctionHolderExpression(FunctionHolderExpression holder, FunctionLookupContext functionLookupContext) throws RuntimeException {
       // a function holder is already materialized, no need to rematerialize.  generally this won't be used unless we materialize a partial tree and rematerialize the whole tree.
       return holder;
     }
 
     @Override
-    public LogicalExpression visitBooleanOperator(BooleanOperator op, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitBooleanOperator(BooleanOperator op, FunctionLookupContext functionLookupContext) {
       List<LogicalExpression> args = Lists.newArrayList();
       for (int i = 0; i < op.args.size(); ++i) {
-        LogicalExpression newExpr = op.args.get(i).accept(this, registry);
+        LogicalExpression newExpr = op.args.get(i).accept(this, functionLookupContext);
         assert newExpr != null : String.format("Materialization of %s return a null expression.", op.args.get(i));
         args.add(newExpr);
       }
@@ -228,10 +228,10 @@ public class ExpressionTreeMaterializer {
     }
 
     @Override
-    public LogicalExpression visitFunctionCall(FunctionCall call, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitFunctionCall(FunctionCall call, FunctionLookupContext functionLookupContext) {
       List<LogicalExpression> args = Lists.newArrayList();
       for (int i = 0; i < call.args.size(); ++i) {
-        LogicalExpression newExpr = call.args.get(i).accept(this, registry);
+        LogicalExpression newExpr = call.args.get(i).accept(this, functionLookupContext);
         assert newExpr != null : String.format("Materialization of %s returned a null expression.", call.args.get(i));
         args.add(newExpr);
       }
@@ -240,7 +240,7 @@ public class ExpressionTreeMaterializer {
       call = new FunctionCall(call.getName(), args, call.getPosition());
 
       FunctionResolver resolver = FunctionResolverFactory.getResolver(call);
-      DrillFuncHolder matchedFuncHolder = registry.findDrillFunction(resolver, call);
+      DrillFuncHolder matchedFuncHolder = functionLookupContext.findDrillFunction(resolver, call);
 
       if (matchedFuncHolder instanceof DrillComplexWriterFuncHolder && ! allowComplexWriter) {
         errorCollector.addGeneralError(call.getPosition(), "Only ProjectRecordBatch could have complex writer function. You are using complex writer function " + call.getName() + " in a non-project operation!");
@@ -275,7 +275,7 @@ public class ExpressionTreeMaterializer {
               parmType = MajorType.newBuilder().setMinorType(parmType.getMinorType()).setMode(parmType.getMode()).
                   setScale(currentArg.getMajorType().getScale()).setPrecision(currentArg.getMajorType().getPrecision()).build();
             }
-            argsWithCast.add(addCastExpression(currentArg, parmType, registry, errorCollector));
+            argsWithCast.add(addCastExpression(currentArg, parmType, functionLookupContext, errorCollector));
           }
         }
 
@@ -283,7 +283,7 @@ public class ExpressionTreeMaterializer {
       }
 
       // as no drill func is found, search for a non-Drill function.
-      AbstractFuncHolder matchedNonDrillFuncHolder = registry.findNonDrillFunction(call);
+      AbstractFuncHolder matchedNonDrillFuncHolder = functionLookupContext.findNonDrillFunction(call);
       if (matchedNonDrillFuncHolder != null) {
         // Insert implicit cast function holder expressions if required
         List<LogicalExpression> extArgsWithCast = Lists.newArrayList();
@@ -301,7 +301,7 @@ public class ExpressionTreeMaterializer {
               parmType = MajorType.newBuilder().setMinorType(parmType.getMinorType()).setMode(parmType.getMode()).
                   setScale(currentArg.getMajorType().getScale()).setPrecision(currentArg.getMajorType().getPrecision()).build();
             }
-            extArgsWithCast.add(addCastExpression(call.args.get(i), parmType, registry, errorCollector));
+            extArgsWithCast.add(addCastExpression(call.args.get(i), parmType, functionLookupContext, errorCollector));
           }
         }
 
@@ -313,12 +313,12 @@ public class ExpressionTreeMaterializer {
     }
 
     @Override
-    public LogicalExpression visitIfExpression(IfExpression ifExpr, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitIfExpression(IfExpression ifExpr, FunctionLookupContext functionLookupContext) {
       IfExpression.IfCondition conditions = ifExpr.ifCondition;
-      LogicalExpression newElseExpr = ifExpr.elseExpression.accept(this, registry);
+      LogicalExpression newElseExpr = ifExpr.elseExpression.accept(this, functionLookupContext);
 
-      LogicalExpression newCondition = conditions.condition.accept(this, registry);
-      LogicalExpression newExpr = conditions.expression.accept(this, registry);
+      LogicalExpression newCondition = conditions.condition.accept(this, functionLookupContext);
+      LogicalExpression newExpr = conditions.expression.accept(this, functionLookupContext);
       conditions = new IfExpression.IfCondition(newCondition, newExpr);
 
       MinorType thenType = conditions.expression.getMajorType().getMinorType();
@@ -331,10 +331,10 @@ public class ExpressionTreeMaterializer {
         if (leastRestrictive != thenType) {
           // Implicitly cast the then expression
           conditions = new IfExpression.IfCondition(newCondition,
-          addCastExpression(conditions.expression, newElseExpr.getMajorType(), registry, errorCollector));
+          addCastExpression(conditions.expression, newElseExpr.getMajorType(), functionLookupContext, errorCollector));
         } else if (leastRestrictive != elseType) {
           // Implicitly cast the else expression
-          newElseExpr = addCastExpression(newElseExpr, conditions.expression.getMajorType(), registry, errorCollector);
+          newElseExpr = addCastExpression(newElseExpr, conditions.expression.getMajorType(), functionLookupContext, errorCollector);
         } else {
           /* Cannot cast one of the two expressions to make the output type of if and else expression
            * to be the same. Raise error.
@@ -381,12 +381,12 @@ public class ExpressionTreeMaterializer {
           IfExpression.IfCondition condition = conditions;
           if (condition.expression.getMajorType().getMode() != DataMode.OPTIONAL) {
             conditions = new IfExpression.IfCondition(condition.condition, getConvertToNullableExpr(ImmutableList.of(condition.expression),
-                                                      condition.expression.getMajorType().getMinorType(), registry));
+                                                      condition.expression.getMajorType().getMinorType(), functionLookupContext));
          }
 
         if (newElseExpr.getMajorType().getMode() != DataMode.OPTIONAL) {
           newElseExpr = getConvertToNullableExpr(ImmutableList.of(newElseExpr),
-              newElseExpr.getMajorType().getMinorType(), registry);
+              newElseExpr.getMajorType().getMinorType(), functionLookupContext);
         }
       }
 
@@ -394,12 +394,12 @@ public class ExpressionTreeMaterializer {
     }
 
     private LogicalExpression getConvertToNullableExpr(List<LogicalExpression> args, MinorType minorType,
-        FunctionImplementationRegistry registry) {
+        FunctionLookupContext functionLookupContext) {
       String funcName = "convertToNullable" + minorType.toString();
       FunctionCall funcCall = new FunctionCall(funcName, args, ExpressionPosition.UNKNOWN);
       FunctionResolver resolver = FunctionResolverFactory.getResolver(funcCall);
 
-      DrillFuncHolder matchedConvertToNullableFuncHolder = registry.findDrillFunction(resolver, funcCall);
+      DrillFuncHolder matchedConvertToNullableFuncHolder = functionLookupContext.findDrillFunction(resolver, funcCall);
 
       if (matchedConvertToNullableFuncHolder == null) {
         logFunctionResolutionError(errorCollector, funcCall);
@@ -418,7 +418,7 @@ public class ExpressionTreeMaterializer {
     }
 
     @Override
-    public LogicalExpression visitSchemaPath(SchemaPath path, FunctionImplementationRegistry value) {
+    public LogicalExpression visitSchemaPath(SchemaPath path, FunctionLookupContext functionLookupContext) {
 //      logger.debug("Visiting schema path {}", path);
       TypedFieldId tfId = batch.getValueVectorId(path);
       if (tfId == null) {
@@ -431,101 +431,101 @@ public class ExpressionTreeMaterializer {
     }
 
     @Override
-    public LogicalExpression visitIntConstant(IntExpression intExpr, FunctionImplementationRegistry value) {
+    public LogicalExpression visitIntConstant(IntExpression intExpr, FunctionLookupContext functionLookupContext) {
       return intExpr;
     }
 
     @Override
-    public LogicalExpression visitFloatConstant(FloatExpression fExpr, FunctionImplementationRegistry value) {
+    public LogicalExpression visitFloatConstant(FloatExpression fExpr, FunctionLookupContext functionLookupContext) {
       return fExpr;
     }
 
     @Override
-    public LogicalExpression visitLongConstant(LongExpression intExpr, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitLongConstant(LongExpression intExpr, FunctionLookupContext functionLookupContext) {
       return intExpr;
     }
 
     @Override
-    public LogicalExpression visitDateConstant(DateExpression intExpr, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitDateConstant(DateExpression intExpr, FunctionLookupContext functionLookupContext) {
       return intExpr;
     }
 
     @Override
-    public LogicalExpression visitTimeConstant(TimeExpression intExpr, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitTimeConstant(TimeExpression intExpr, FunctionLookupContext functionLookupContext) {
       return intExpr;
     }
 
     @Override
-    public LogicalExpression visitTimeStampConstant(TimeStampExpression intExpr, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitTimeStampConstant(TimeStampExpression intExpr, FunctionLookupContext functionLookupContext) {
       return intExpr;
     }
 
     @Override
-    public LogicalExpression visitNullConstant(TypedNullConstant nullConstant, FunctionImplementationRegistry value) throws RuntimeException {
+    public LogicalExpression visitNullConstant(TypedNullConstant nullConstant, FunctionLookupContext functionLookupContext) throws RuntimeException {
       return nullConstant;
     }
 
     @Override
-    public LogicalExpression visitIntervalYearConstant(IntervalYearExpression intExpr, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitIntervalYearConstant(IntervalYearExpression intExpr, FunctionLookupContext functionLookupContext) {
       return intExpr;
     }
 
     @Override
-    public LogicalExpression visitIntervalDayConstant(IntervalDayExpression intExpr, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitIntervalDayConstant(IntervalDayExpression intExpr, FunctionLookupContext functionLookupContext) {
       return intExpr;
     }
 
     @Override
-    public LogicalExpression visitDecimal9Constant(Decimal9Expression decExpr, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitDecimal9Constant(Decimal9Expression decExpr, FunctionLookupContext functionLookupContext) {
       return decExpr;
     }
 
     @Override
-    public LogicalExpression visitDecimal18Constant(Decimal18Expression decExpr, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitDecimal18Constant(Decimal18Expression decExpr, FunctionLookupContext functionLookupContext) {
       return decExpr;
     }
 
     @Override
-    public LogicalExpression visitDecimal28Constant(Decimal28Expression decExpr, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitDecimal28Constant(Decimal28Expression decExpr, FunctionLookupContext functionLookupContext) {
       return decExpr;
     }
 
     @Override
-    public LogicalExpression visitDecimal38Constant(Decimal38Expression decExpr, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitDecimal38Constant(Decimal38Expression decExpr, FunctionLookupContext functionLookupContext) {
       return decExpr;
     }
 
     @Override
-    public LogicalExpression visitDoubleConstant(DoubleExpression dExpr, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitDoubleConstant(DoubleExpression dExpr, FunctionLookupContext functionLookupContext) {
       return dExpr;
     }
 
     @Override
-    public LogicalExpression visitBooleanConstant(BooleanExpression e, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitBooleanConstant(BooleanExpression e, FunctionLookupContext functionLookupContext) {
       return e;
     }
 
     @Override
-    public LogicalExpression visitQuotedStringConstant(QuotedString e, FunctionImplementationRegistry registry) {
+    public LogicalExpression visitQuotedStringConstant(QuotedString e, FunctionLookupContext functionLookupContext) {
       return e;
     }
 
     @Override
-    public LogicalExpression visitConvertExpression(ConvertExpression e, FunctionImplementationRegistry value) {
+    public LogicalExpression visitConvertExpression(ConvertExpression e, FunctionLookupContext functionLookupContext) {
       String convertFunctionName = e.getConvertFunction() + e.getEncodingType();
 
       List<LogicalExpression> newArgs = Lists.newArrayList();
       newArgs.add(e.getInput());  //input_expr
 
       FunctionCall fc = new FunctionCall(convertFunctionName, newArgs, e.getPosition());
-      return fc.accept(this, value);
+      return fc.accept(this, functionLookupContext);
     }
 
     @Override
-    public LogicalExpression visitCastExpression(CastExpression e, FunctionImplementationRegistry value) {
+    public LogicalExpression visitCastExpression(CastExpression e, FunctionLookupContext functionLookupContext) {
 
       // if the cast is pointless, remove it.
-      LogicalExpression input = e.getInput().accept(this,  value);
+      LogicalExpression input = e.getInput().accept(this,  functionLookupContext);
 
       MajorType newMajor = e.getMajorType(); // Output type
       MinorType newMinor = input.getMajorType().getMinorType(); // Input type
@@ -558,7 +558,7 @@ public class ExpressionTreeMaterializer {
             newArgs.add(new ValueExpressions.LongExpression(type.getScale(), null));
         }
         FunctionCall fc = new FunctionCall(castFuncWithType, newArgs, e.getPosition());
-        return fc.accept(this, value);
+        return fc.accept(this, functionLookupContext);
       }
     }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionImplementationRegistry.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionImplementationRegistry.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionImplementationRegistry.java
index 05d59ff..dee93c1 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionImplementationRegistry.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionImplementationRegistry.java
@@ -37,7 +37,7 @@ import com.google.common.base.Stopwatch;
 import com.google.common.collect.Lists;
 import org.apache.drill.exec.server.options.OptionManager;
 
-public class FunctionImplementationRegistry {
+public class FunctionImplementationRegistry implements FunctionLookupContext {
   static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(FunctionImplementationRegistry.class);
 
   private DrillFunctionRegistry drillFuncRegistry;
@@ -101,6 +101,7 @@ public class FunctionImplementationRegistry {
    * @param functionCall
    * @return
    */
+  @Override
   public DrillFuncHolder findDrillFunction(FunctionResolver functionResolver, FunctionCall functionCall) {
     return functionResolver.getBestMatch(drillFuncRegistry.getMethods(functionReplacement(functionCall)), functionCall);
   }
@@ -147,6 +148,7 @@ public class FunctionImplementationRegistry {
    * @param functionCall
    * @return
    */
+  @Override
   public AbstractFuncHolder findNonDrillFunction(FunctionCall functionCall) {
     for(PluggableFunctionRegistry registry : pluggableFuncRegistries) {
       AbstractFuncHolder h = registry.getFunction(functionCall);

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionLookupContext.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionLookupContext.java b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionLookupContext.java
new file mode 100644
index 0000000..0a27f65
--- /dev/null
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionLookupContext.java
@@ -0,0 +1,47 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.drill.exec.expr.fn;
+
+import org.apache.drill.common.expression.FunctionCall;
+import org.apache.drill.exec.resolver.FunctionResolver;
+
+public interface FunctionLookupContext {
+
+  /**
+   * Method returns the materialized drill function corresponding to the functioncall that
+   * is passed in
+   *
+   * @param functionResolver - Type of resolver to use.
+   *                           Specifies if the arguments should match exactly or can use implicit cast
+   * @param functionCall - Specifies function name and type of arguments
+   * @return DrillFuncHolder
+   */
+  public DrillFuncHolder findDrillFunction(FunctionResolver functionResolver, FunctionCall functionCall);
+
+  /**
+   * Find function implementation for given <code>functionCall</code> in non-Drill function registries such as Hive UDF
+   * registry.
+   *
+   * Note: Order of searching is same as order of {@link org.apache.drill.exec.expr.fn.PluggableFunctionRegistry}
+   * implementations found on classpath.
+   *
+   * @param functionCall - Specifies function name and type of arguments
+   * @return
+   */
+  public AbstractFuncHolder findNonDrillFunction(FunctionCall functionCall);
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OptimizerRulesContext.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OptimizerRulesContext.java b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OptimizerRulesContext.java
new file mode 100644
index 0000000..33179f3
--- /dev/null
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/OptimizerRulesContext.java
@@ -0,0 +1,42 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.drill.exec.ops;
+
+import org.apache.drill.exec.expr.fn.FunctionImplementationRegistry;
+import org.apache.drill.exec.memory.BufferAllocator;
+import org.apache.drill.exec.planner.physical.PlannerSettings;
+
+public interface OptimizerRulesContext extends UdfUtilities {
+  /**
+   * Method returns the function registry
+   * @return FunctionImplementationRegistry
+   */
+  public FunctionImplementationRegistry getFunctionRegistry();
+
+  /**
+   * Method returns the allocator
+   * @return BufferAllocator
+   */
+  public BufferAllocator getAllocator();
+
+  /**
+   * Method returns the planner options
+   * @return PlannerSettings
+   */
+  public PlannerSettings getPlannerSettings();
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java
index 60fba0f..c3cd4e6 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/ops/QueryContext.java
@@ -54,7 +54,7 @@ import org.apache.drill.exec.util.Utilities;
 // TODO the many methods that just return drillbitContext.getXxx() should be replaced with getDrillbitContext()
 // TODO - consider re-name to PlanningContext, as the query execution context actually appears
 // in fragment contexts
-public class QueryContext implements AutoCloseable, UdfUtilities {
+public class QueryContext implements AutoCloseable, OptimizerRulesContext {
   private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(QueryContext.class);
 
   private static final int INITIAL_OFF_HEAP_ALLOCATION_IN_BYTES = 1024 * 1024;
@@ -105,6 +105,7 @@ public class QueryContext implements AutoCloseable, UdfUtilities {
     schemaTreesToClose = Lists.newArrayList();
   }
 
+  @Override
   public PlannerSettings getPlannerSettings() {
     return plannerSettings;
   }
@@ -113,6 +114,7 @@ public class QueryContext implements AutoCloseable, UdfUtilities {
     return session;
   }
 
+  @Override
   public BufferAllocator getAllocator() {
     return allocator;
   }
@@ -205,6 +207,7 @@ public class QueryContext implements AutoCloseable, UdfUtilities {
     return drillbitContext.getConfig();
   }
 
+  @Override
   public FunctionImplementationRegistry getFunctionRegistry() {
     return drillbitContext.getFunctionImplementationRegistry();
   }

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRuleSets.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRuleSets.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRuleSets.java
index daa7276..a821a62 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRuleSets.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillRuleSets.java
@@ -32,7 +32,7 @@ import org.apache.calcite.rel.rules.UnionToDistinctRule;
 import org.apache.calcite.tools.RuleSet;
 
 import org.apache.calcite.rel.rules.FilterMergeRule;
-import org.apache.drill.exec.ops.QueryContext;
+import org.apache.drill.exec.ops.OptimizerRulesContext;
 import org.apache.drill.exec.planner.logical.partition.PruneScanRule;
 import org.apache.drill.exec.planner.physical.ConvertCountToDirectScan;
 import org.apache.drill.exec.planner.physical.FilterPrule;
@@ -71,15 +71,15 @@ public class DrillRuleSets {
    * If a rule is intended to always be included with the logical set, it should be added
    * to the immutable list created in the getDrillBasicRules() method below.
    *
-   * @param queryContext - used to get the list of planner settings, other rules may
-   *                     also in the future need to get other query state from this,
-   *                     such as the available list of UDFs (as is used by the
-   *                     DrillMergeProjectRule created in getDrillBasicRules())
+   * @param optimizerRulesContext - used to get the list of planner settings, other rules may
+   *                                also in the future need to get other query state from this,
+   *                                such as the available list of UDFs (as is used by the
+   *                                DrillMergeProjectRule created in getDrillBasicRules())
    * @return - a list of rules that have been filtered to leave out
    *         rules that have been turned off by system or session settings
    */
-  public static RuleSet getDrillUserConfigurableLogicalRules(QueryContext queryContext) {
-    PlannerSettings ps = queryContext.getPlannerSettings();
+  public static RuleSet getDrillUserConfigurableLogicalRules(OptimizerRulesContext optimizerRulesContext) {
+    PlannerSettings ps = optimizerRulesContext.getPlannerSettings();
 
     // This list is used to store rules that can be turned on an off
     // by user facing planning options
@@ -110,15 +110,15 @@ public class DrillRuleSets {
    * it on and off with a system/session option, add it in the
    * getDrillUserConfigurableLogicalRules() method instead of here.
    *
-   * @param context - shared state used during planning, currently used here
-   *                to gain access to the fucntion registry described above.
+   * @param optimizerRulesContext - shared state used during planning, currently used here
+   *                                to gain access to the function registry described above.
    * @return - a RuleSet containing the logical rules that will always
    *           be used, either by VolcanoPlanner directly, or
    *           used VolcanoPlanner as pre-processing for LOPTPlanner.
    *
    * Note : Join permutation rule is excluded here.
    */
-  public static RuleSet getDrillBasicRules(QueryContext context) {
+  public static RuleSet getDrillBasicRules(OptimizerRulesContext optimizerRulesContext) {
     if (DRILL_BASIC_RULES == null) {
 
       DRILL_BASIC_RULES = new DrillRuleSet(ImmutableSet.<RelOptRule> builder().add( //
@@ -141,7 +141,8 @@ public class DrillRuleSets {
       ProjectRemoveRule.NAME_CALC_INSTANCE,
       SortRemoveRule.INSTANCE,
 
-      DrillMergeProjectRule.getInstance(true, RelFactories.DEFAULT_PROJECT_FACTORY, context.getFunctionRegistry()),
+      DrillMergeProjectRule.getInstance(true, RelFactories.DEFAULT_PROJECT_FACTORY,
+          optimizerRulesContext.getFunctionRegistry()),
       AggregateExpandDistinctAggregatesRule.INSTANCE,
       DrillReduceAggregatesRule.INSTANCE,
 
@@ -153,10 +154,10 @@ public class DrillRuleSets {
       DrillPushProjIntoScan.INSTANCE,
       DrillProjectSetOpTransposeRule.INSTANCE,
 
-      PruneScanRule.getFilterOnProject(context),
-      PruneScanRule.getFilterOnScan(context),
-      PruneScanRule.getFilterOnProjectParquet(context),
-      PruneScanRule.getFilterOnScanParquet(context),
+      PruneScanRule.getFilterOnProject(optimizerRulesContext),
+      PruneScanRule.getFilterOnScan(optimizerRulesContext),
+      PruneScanRule.getFilterOnProjectParquet(optimizerRulesContext),
+      PruneScanRule.getFilterOnScanParquet(optimizerRulesContext),
 
       /*
        Convert from Calcite Logical to Drill Logical Rules.
@@ -181,7 +182,7 @@ public class DrillRuleSets {
   }
 
   // Ruleset for join permutation, used only in VolcanoPlanner.
-  public static RuleSet getJoinPermRules(QueryContext context) {
+  public static RuleSet getJoinPermRules(OptimizerRulesContext optimizerRulesContext) {
     return new DrillRuleSet(ImmutableSet.<RelOptRule> builder().add( //
         JoinPushThroughJoinRule.RIGHT,
         JoinPushThroughJoinRule.LEFT
@@ -193,10 +194,10 @@ public class DrillRuleSets {
 
     ));
 
-  public static final RuleSet getPhysicalRules(QueryContext qcontext) {
+  public static final RuleSet getPhysicalRules(OptimizerRulesContext optimizerRulesContext) {
     List<RelOptRule> ruleList = new ArrayList<RelOptRule>();
 
-    PlannerSettings ps = qcontext.getPlannerSettings();
+    PlannerSettings ps = optimizerRulesContext.getPlannerSettings();
 
     ruleList.add(ConvertCountToDirectScan.AGG_ON_PROJ_ON_SCAN);
     ruleList.add(ConvertCountToDirectScan.AGG_ON_SCAN);

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/PruneScanRule.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/PruneScanRule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/PruneScanRule.java
index 5b5e4bc..eb0889a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/PruneScanRule.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/PruneScanRule.java
@@ -37,8 +37,8 @@ import java.util.BitSet;
  import org.apache.drill.exec.expr.TypeHelper;
  import org.apache.drill.exec.expr.fn.interpreter.InterpreterEvaluator;
  import org.apache.drill.exec.memory.BufferAllocator;
- import org.apache.drill.exec.ops.QueryContext;
- import org.apache.drill.exec.physical.base.FileGroupScan;
+import org.apache.drill.exec.ops.OptimizerRulesContext;
+import org.apache.drill.exec.physical.base.FileGroupScan;
  import org.apache.drill.exec.physical.base.GroupScan;
  import org.apache.drill.exec.planner.FileSystemPartitionDescriptor;
 import org.apache.drill.exec.planner.ParquetPartitionDescriptor;
@@ -74,11 +74,11 @@ import org.apache.drill.exec.vector.NullableBitVector;
 public abstract class PruneScanRule extends RelOptRule {
    static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(PruneScanRule.class);
 
-   public static final RelOptRule getFilterOnProject(QueryContext context){
+   public static final RelOptRule getFilterOnProject(OptimizerRulesContext optimizerRulesContext){
        return new PruneScanRule(
            RelOptHelper.some(DrillFilterRel.class, RelOptHelper.some(DrillProjectRel.class, RelOptHelper.any(DrillScanRel.class))),
            "PruneScanRule:Filter_On_Project",
-           context) {
+           optimizerRulesContext) {
 
        @Override
          public boolean matches(RelOptRuleCall call) {
@@ -136,10 +136,10 @@ public abstract class PruneScanRule extends RelOptRule {
        };
    }
 
-   public static final RelOptRule getFilterOnScan(QueryContext context){
+   public static final RelOptRule getFilterOnScan(OptimizerRulesContext optimizerRulesContext){
      return new PruneScanRule(
            RelOptHelper.some(DrillFilterRel.class, RelOptHelper.any(DrillScanRel.class)),
-           "PruneScanRule:Filter_On_Scan", context) {
+           "PruneScanRule:Filter_On_Scan", optimizerRulesContext) {
 
        @Override
          public boolean matches(RelOptRuleCall call) {
@@ -196,11 +196,11 @@ public abstract class PruneScanRule extends RelOptRule {
      };
    }
 
-  public static final RelOptRule getFilterOnProjectParquet(QueryContext context){
+  public static final RelOptRule getFilterOnProjectParquet(OptimizerRulesContext optimizerRulesContext){
     return new PruneScanRule(
         RelOptHelper.some(DrillFilterRel.class, RelOptHelper.some(DrillProjectRel.class, RelOptHelper.any(DrillScanRel.class))),
         "PruneScanRule:Filter_On_Project_Parquet",
-        context) {
+        optimizerRulesContext) {
 
       @Override
       public boolean matches(RelOptRuleCall call) {
@@ -258,10 +258,10 @@ public abstract class PruneScanRule extends RelOptRule {
   // Using separate rules for Parquet column based partition pruning. In the future, we may want to see if we can combine these into
   // a single rule which handles both types of pruning
 
-  public static final RelOptRule getFilterOnScanParquet(QueryContext context){
+  public static final RelOptRule getFilterOnScanParquet(OptimizerRulesContext optimizerRulesContext){
     return new PruneScanRule(
         RelOptHelper.some(DrillFilterRel.class, RelOptHelper.any(DrillScanRel.class)),
-        "PruneScanRule:Filter_On_Scan_Parquet", context) {
+        "PruneScanRule:Filter_On_Scan_Parquet", optimizerRulesContext) {
 
       @Override
       public boolean matches(RelOptRuleCall call) {
@@ -315,11 +315,11 @@ public abstract class PruneScanRule extends RelOptRule {
     };
   }
 
-   final QueryContext context;
+   final OptimizerRulesContext optimizerContext;
 
-   private PruneScanRule(RelOptRuleOperand operand, String id, QueryContext context) {
+   private PruneScanRule(RelOptRuleOperand operand, String id, OptimizerRulesContext optimizerContext) {
      super(operand, id);
-     this.context = context;
+     this.optimizerContext = optimizerContext;
    }
 
    protected abstract PartitionDescriptor getPartitionDescriptor(PlannerSettings settings, DrillScanRel scanRel);
@@ -327,7 +327,7 @@ public abstract class PruneScanRule extends RelOptRule {
    protected void doOnMatch(RelOptRuleCall call, DrillFilterRel filterRel, DrillProjectRel projectRel, DrillScanRel scanRel) {
      final PlannerSettings settings = PrelUtil.getPlannerSettings(call.getPlanner());
      PartitionDescriptor descriptor = getPartitionDescriptor(settings, scanRel);
-     final BufferAllocator allocator = context.getAllocator();
+     final BufferAllocator allocator = optimizerContext.getAllocator();
 
 
      RexNode condition = null;
@@ -411,13 +411,13 @@ public abstract class PruneScanRule extends RelOptRule {
        logger.debug("Attempting to prune {}", pruneCondition);
        LogicalExpression expr = DrillOptiq.toDrill(new DrillParseContext(settings), scanRel, pruneCondition);
        ErrorCollectorImpl errors = new ErrorCollectorImpl();
-       LogicalExpression materializedExpr = ExpressionTreeMaterializer.materialize(expr, container, errors, context.getFunctionRegistry());
+       LogicalExpression materializedExpr = ExpressionTreeMaterializer.materialize(expr, container, errors, optimizerContext.getFunctionRegistry());
        if (errors.getErrorCount() != 0) {
          logger.warn("Failure while materializing expression [{}].  Errors: {}", expr, errors);
        }
 
        output.allocateNew(partitions.size());
-       InterpreterEvaluator.evaluate(partitions.size(), context, container, output, materializedExpr);
+       InterpreterEvaluator.evaluate(partitions.size(), optimizerContext, container, output, materializedExpr);
        int record = 0;
 
        List<String> newFiles = Lists.newArrayList();

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java
index 2d1bac2..bc79cff 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java
@@ -121,7 +121,7 @@ public class DrillSqlWorker {
         DrillRuleSets.getDrillUserConfigurableLogicalRules(context));
     RuleSet drillPhysicalMem = DrillRuleSets.mergedRuleSets(
         DrillRuleSets.getPhysicalRules(context),
-        storagePluginRegistry.getStoragePluginRuleSet());
+        storagePluginRegistry.getStoragePluginRuleSet(context));
 
     // Following is used in LOPT join OPT.
     RuleSet logicalConvertRules = DrillRuleSets.mergedRuleSets(

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractStoragePlugin.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractStoragePlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractStoragePlugin.java
index 58c8622..822a210 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractStoragePlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractStoragePlugin.java
@@ -23,6 +23,7 @@ import java.util.Set;
 
 import org.apache.drill.common.JSONOptions;
 import org.apache.drill.common.expression.SchemaPath;
+import org.apache.drill.exec.ops.OptimizerRulesContext;
 import org.apache.drill.exec.physical.base.AbstractGroupScan;
 
 import com.google.common.collect.ImmutableSet;
@@ -44,7 +45,7 @@ public abstract class AbstractStoragePlugin implements StoragePlugin{
   }
 
   @Override
-  public Set<StoragePluginOptimizerRule> getOptimizerRules() {
+  public Set<StoragePluginOptimizerRule> getOptimizerRules(OptimizerRulesContext optimizerRulesContext) {
     return ImmutableSet.of();
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePlugin.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePlugin.java
index b60c16f..eef63a2 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePlugin.java
@@ -24,6 +24,7 @@ import java.util.Set;
 import org.apache.drill.common.JSONOptions;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.logical.StoragePluginConfig;
+import org.apache.drill.exec.ops.OptimizerRulesContext;
 import org.apache.drill.exec.physical.base.AbstractGroupScan;
 
 public interface StoragePlugin extends SchemaFactory {
@@ -31,7 +32,7 @@ public interface StoragePlugin extends SchemaFactory {
 
   public boolean supportsWrite();
 
-  public Set<StoragePluginOptimizerRule> getOptimizerRules();
+  public Set<StoragePluginOptimizerRule> getOptimizerRules(OptimizerRulesContext optimizerContext);
 
   /**
    * Get the physical scan operator for the particular GroupScan (read) node.

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRegistry.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRegistry.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRegistry.java
index 80a0876..9ca419d 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRegistry.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRegistry.java
@@ -42,6 +42,7 @@ import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.common.util.PathScanner;
 import org.apache.drill.exec.ExecConstants;
 import org.apache.drill.exec.exception.DrillbitStartupException;
+import org.apache.drill.exec.ops.OptimizerRulesContext;
 import org.apache.drill.exec.ops.QueryContext;
 import org.apache.drill.exec.ops.ViewExpansionContext;
 import org.apache.drill.exec.planner.logical.DrillRuleSets;
@@ -283,11 +284,11 @@ public class StoragePluginRegistry implements Iterable<Map.Entry<String, Storage
     return plugins.entrySet().iterator();
   }
 
-  public RuleSet getStoragePluginRuleSet() {
+  public RuleSet getStoragePluginRuleSet(OptimizerRulesContext optimizerRulesContext) {
     // query registered engines for optimizer rules and build the storage plugin RuleSet
     Builder<RelOptRule> setBuilder = ImmutableSet.builder();
     for (StoragePlugin plugin : this.plugins.values()) {
-      Set<StoragePluginOptimizerRule> rules = plugin.getOptimizerRules();
+      Set<StoragePluginOptimizerRule> rules = plugin.getOptimizerRules(optimizerRulesContext);
       if (rules != null && rules.size() > 0) {
         setBuilder.addAll(rules);
       }

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/FileSystemPlugin.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/FileSystemPlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/FileSystemPlugin.java
index 4ae0cc8..6f3ce27 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/FileSystemPlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/FileSystemPlugin.java
@@ -29,6 +29,7 @@ import org.apache.drill.common.exceptions.ExecutionSetupException;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.logical.FormatPluginConfig;
 import org.apache.drill.common.logical.StoragePluginConfig;
+import org.apache.drill.exec.ops.OptimizerRulesContext;
 import org.apache.drill.exec.ops.QueryContext;
 import org.apache.drill.exec.physical.base.AbstractGroupScan;
 import org.apache.drill.exec.server.DrillbitContext;
@@ -144,7 +145,7 @@ public class FileSystemPlugin extends AbstractStoragePlugin{
   }
 
   @Override
-  public Set<StoragePluginOptimizerRule> getOptimizerRules() {
+  public Set<StoragePluginOptimizerRule> getOptimizerRules(OptimizerRulesContext optimizerRulesContext) {
     Builder<StoragePluginOptimizerRule> setBuilder = ImmutableSet.builder();
     for(FormatPlugin plugin : this.formatPluginsByName.values()){
       Set<StoragePluginOptimizerRule> rules = plugin.getOptimizerRules();

http://git-wip-us.apache.org/repos/asf/drill/blob/f8197cfe/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaStoragePlugin.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaStoragePlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaStoragePlugin.java
index 597d24c..f939ba8 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaStoragePlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaStoragePlugin.java
@@ -30,6 +30,7 @@ import static org.apache.drill.exec.store.ischema.InfoSchemaConstants.*;
 import org.apache.drill.common.JSONOptions;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.logical.StoragePluginConfig;
+import org.apache.drill.exec.ops.OptimizerRulesContext;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.store.AbstractSchema;
 import org.apache.drill.exec.store.AbstractStoragePlugin;
@@ -107,7 +108,7 @@ public class InfoSchemaStoragePlugin extends AbstractStoragePlugin {
   }
 
   @Override
-  public Set<StoragePluginOptimizerRule> getOptimizerRules() {
+  public Set<StoragePluginOptimizerRule> getOptimizerRules(OptimizerRulesContext optimizerRulesContext) {
     return ImmutableSet.of(
         InfoSchemaPushFilterIntoRecordGenerator.IS_FILTER_ON_PROJECT,
         InfoSchemaPushFilterIntoRecordGenerator.IS_FILTER_ON_SCAN);