-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/16490/
-----------------------------------------------------------
Review request for drill.
Repository: drill-git
Description
-------
This patch is to provide implicit cast support in Drill.
The code change is mainly in two areas:
1. Function Resolver and related type cast rules : used to choose the best
matched function implementation corresponding to a function name and its list
of argument types. Type promotion would be implied, if there is no function
implementation whose parameter types exactly match the argument types. Type
promotion is implemented using the type precedence list. Type promotion is
checked against a rule which will help implement a isCastable(from, to) method.
New files: 1) DefaultFunctionResolver.java
2) FunctionResolver
3) FunctionResolverFactor.java
4) OperatorFunctionResolver.java : reserved for future use.
5) ResolverTypePrecedence.java
6) TypeCastRules.java
7) UDFFunctionResolver.java : reserved for future use.
2. ImplicitCastBuilder : to inject implicit cast whenever necessary. After the
function resolver returns a best matched function implementation, if the param
type does not match the argument type, an implicit cast will be inserted on top
of the argument.
- ImplicitCastBuilder uses a visitor to inject implicit cast.
- ImplicitCastBuilder will be part of ExpressionTreeMateralizer, after we
materialize the expression tree.
- ExpressionValidator will be called after implicit cast is injected, in
stead of after expression materialization.
- Because ImplicitCastBuilder requires a FunctionImplementationRegistry (to
decide the best matched function implementation), and ImplicitCastBuilder is
part of ExpressionTreeMaterializer, all the call of ExpressionTreeMaterializer
is modified by adding a FunctionImplementationRegistry.
New files or modified files:
1)CastFunctionDefs.java
2)ExpressionTreeMaterializer.java
3)ImplicitCastBuilder.java
4)DrillFuncHolder.java : expose param type and size
5)FunctionImplementationRegistry.java : expose the list of function
implementation.
6) other files because of the change to
ExpressionTreeMaterializer.java.
Some other minor changes:
1. ArgumentValidator.ComparableArguments :
change allSame from true to false, since currently we have comparison
operators defined over different types of inputs.
2. VectorUtil:
Add code to handle null value when display the result.
Diffs
-----
common/src/main/java/org/apache/drill/common/expression/ArgumentValidators.java
cd30a06
common/src/main/java/org/apache/drill/common/expression/fn/CastFunctionDefs.java
PRE-CREATION
exec/java-exec/src/main/java/org/apache/drill/exec/ExecConstants.java 5336c0e
exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
5d576b1
exec/java-exec/src/main/java/org/apache/drill/exec/expr/ImplicitCastBuilder.java
PRE-CREATION
exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFuncHolder.java
e001ffe
exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/FunctionImplementationRegistry.java
5bbab76
exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/MathFunctions.java
288760b
exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/aggregate/AggBatch.java
f652e35
exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/filter/FilterRecordBatch.java
fe298d6
exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/MergeJoinBatch.java
f3a32cd
exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/mergereceiver/MergingRecordBatch.java
fd392a3
exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/orderedpartitioner/OrderedPartitionRecordBatch.java
a3d1d09
exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/partitionsender/PartitionSenderRootExec.java
bc53bd2
exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/project/ProjectRecordBatch.java
41a4c4d
exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/sort/SortBatch.java
7881115
exec/java-exec/src/main/java/org/apache/drill/exec/resolver/DefaultFunctionResolver.java
PRE-CREATION
exec/java-exec/src/main/java/org/apache/drill/exec/resolver/FunctionResolver.java
PRE-CREATION
exec/java-exec/src/main/java/org/apache/drill/exec/resolver/FunctionResolverFactory.java
PRE-CREATION
exec/java-exec/src/main/java/org/apache/drill/exec/resolver/OperatorFunctionResolver.java
PRE-CREATION
exec/java-exec/src/main/java/org/apache/drill/exec/resolver/ResolverTypePrecedence.java
PRE-CREATION
exec/java-exec/src/main/java/org/apache/drill/exec/resolver/TypeCastRules.java
PRE-CREATION
exec/java-exec/src/main/java/org/apache/drill/exec/resolver/UDFFunctionResolver.java
PRE-CREATION
exec/java-exec/src/main/java/org/apache/drill/exec/util/VectorUtil.java
8b23bcd
exec/java-exec/src/test/java/org/apache/drill/exec/expr/ExpressionTest.java
4bff5a3
exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestImplicitCastFunctions.java
PRE-CREATION
exec/java-exec/src/test/java/org/apache/drill/exec/record/ExpressionTreeMaterializerTest.java
7ee1718
exec/java-exec/src/test/resources/functions/cast/testICastConstant.json
PRE-CREATION
exec/java-exec/src/test/resources/functions/cast/testICastMockCol.json
PRE-CREATION
exec/ref/src/test/resources/simple_plan.json c0837e6
Diff: https://reviews.apache.org/r/16490/diff/
Testing
-------
testImplicitCastFunctions.java is used for unit test. It uses two physical plans
1. testICastConstant.json : the input expression is a literal constants. eg, 1
+ 1.2, etc. Also, cover the nested function cases.
2. testICastMockCol.json : the input expression is a column from mock scan
operator.
Thanks,
Jinfeng Ni