[
https://issues.apache.org/jira/browse/DRILL-3232?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14981889#comment-14981889
]
ASF GitHub Bot commented on DRILL-3232:
---------------------------------------
Github user jacques-n commented on a diff in the pull request:
https://github.com/apache/drill/pull/207#discussion_r43471835
--- Diff:
exec/java-exec/src/main/java/org/apache/drill/exec/expr/ExpressionTreeMaterializer.java
---
@@ -308,10 +334,115 @@ public LogicalExpression
visitFunctionCall(FunctionCall call, FunctionLookupCont
return matchedNonDrillFuncHolder.getExpr(call.getName(),
extArgsWithCast, call.getPosition());
}
+ if (hasUnionInput(call)) {
+ return rewriteUnionFunction(call, functionLookupContext);
+ }
+
logFunctionResolutionError(errorCollector, call);
return NullExpression.INSTANCE;
}
+ private static final Set<String> UNION_FUNCTIONS;
+
+ static {
+ UNION_FUNCTIONS = new HashSet<>();
+ for (MinorType t : MinorType.values()) {
+ UNION_FUNCTIONS.add("assert_" + t.name().toLowerCase());
+ UNION_FUNCTIONS.add("is_" + t.name().toLowerCase());
+ }
+ UNION_FUNCTIONS.add("typeof");
+ }
+
+ private boolean hasUnionInput(FunctionCall call) {
+ for (LogicalExpression arg : call.args) {
+ if (arg.getMajorType().getMinorType() == MinorType.UNION) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private LogicalExpression rewriteUnionFunction(FunctionCall call,
FunctionLookupContext functionLookupContext) {
+ LogicalExpression[] args = new LogicalExpression[call.args.size()];
+ call.args.toArray(args);
+
+ for (int i = 0; i < args.length; i++) {
+ LogicalExpression arg = call.args.get(i);
+ MajorType majorType = arg.getMajorType();
+
+ if (majorType.getMinorType() != MinorType.UNION) {
+ continue;
+ }
+
+ List<MinorType> subTypes = majorType.getSubTypeList();
+ Preconditions.checkState(subTypes.size() > 0, "Union type has no
subtypes");
+
+ Queue<IfCondition> ifConditions = Lists.newLinkedList();
+
+ for (MinorType minorType : subTypes) {
+ LogicalExpression ifCondition =
getIsTypeExpressionForType(minorType, arg.accept(new CloneVisitor(), null));
+ args[i] = getUnionCastExpressionForType(minorType,
arg.accept(new CloneVisitor(), null));
+
+ List<LogicalExpression> newArgs = Lists.newArrayList();
+ for (LogicalExpression e : args) {
+ newArgs.add(e.accept(new CloneVisitor(), null));
+ }
+
+ errorCollectors.push(errorCollector);
+ errorCollector = new ErrorCollectorImpl();
+
+ LogicalExpression thenExpression = new
FunctionCall(call.getName(), newArgs, call.getPosition()).accept(this,
functionLookupContext);
+
+ if (errorCollector.hasErrors()) {
+ thenExpression =
getExceptionFunction(errorCollector.toErrorString());
+ }
+
+ errorCollector = errorCollectors.pop();
+
+ IfExpression.IfCondition condition = new
IfCondition(ifCondition, thenExpression);
+ ifConditions.add(condition);
+ }
+
+ LogicalExpression ifExpression = ifConditions.poll().expression;
+
+ while (!ifConditions.isEmpty()) {
+ ifExpression =
IfExpression.newBuilder().setIfCondition(ifConditions.poll()).setElse(ifExpression).build();
+ }
+
+ args[i] = ifExpression;
+ return ifExpression.accept(this, functionLookupContext);
+ }
+ throw new UnsupportedOperationException("Did not find any Union
input types");
+ }
+
+ private LogicalExpression getExceptionFunction(String message) {
+ QuotedString msg = new QuotedString(message,
ExpressionPosition.UNKNOWN);
+ List<LogicalExpression> args = Lists.newArrayList();
+ args.add(msg);
+ FunctionCall call = new
FunctionCall(ExceptionFunction.EXCEPTION_FUNCTION_NAME, args,
ExpressionPosition.UNKNOWN);
+ return call;
+ }
+
+ private LogicalExpression getUnionCastExpressionForType(MinorType
type, LogicalExpression arg) {
--- End diff --
javadoc
> Modify existing vectors to allow type promotion
> -----------------------------------------------
>
> Key: DRILL-3232
> URL: https://issues.apache.org/jira/browse/DRILL-3232
> Project: Apache Drill
> Issue Type: Sub-task
> Components: Execution - Codegen, Execution - Data Types, Execution -
> Relational Operators, Functions - Drill
> Reporter: Steven Phillips
> Assignee: Hanifi Gunes
> Fix For: 1.3.0
>
>
> Support the ability for existing vectors to be promoted similar to supported
> implicit casting rules.
> For example:
> INT > DOUBLE > STRING > EMBEDDED
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)