Support CASE statement in query 1. Pending testcases
Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/3b9df0de Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/3b9df0de Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/3b9df0de Branch: refs/heads/master Commit: 3b9df0de7ae9f6cff0a5726f1ac7929ff5dbcbda Parents: eae6fa4 Author: vkorukanti <[email protected]> Authored: Mon Mar 31 14:30:55 2014 -0700 Committer: Jacques Nadeau <[email protected]> Committed: Sat Apr 19 18:07:08 2014 -0700 ---------------------------------------------------------------------- .../drill/exec/planner/logical/DrillOptiq.java | 29 +++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/3b9df0de/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java index 752f31d..405b059 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java @@ -24,6 +24,8 @@ import java.util.List; import org.apache.drill.common.expression.ExpressionPosition; import org.apache.drill.common.expression.FieldReference; import org.apache.drill.common.expression.FunctionCallFactory; +import org.apache.drill.common.expression.IfExpression; +import org.apache.drill.common.expression.IfExpression.IfCondition; import org.apache.drill.common.expression.LogicalExpression; import org.apache.drill.common.expression.SchemaPath; import org.apache.drill.common.expression.ValueExpressions; @@ -120,6 +122,23 @@ public class DrillOptiq { case LIKE: case SIMILAR: return getDrillFunctionFromOptiqCall(call); + case CASE: + List<LogicalExpression> caseArgs = Lists.newArrayList(); + for(RexNode r : call.getOperands()){ + caseArgs.add(r.accept(this)); + } + + caseArgs = Lists.reverse(caseArgs); + // number of arguements are always going to be odd, because + // Optiq adds "null" for the missing else expression at the end + assert caseArgs.size()%2 == 1; + LogicalExpression elseExpression = caseArgs.get(0); + for (int i=1; i<caseArgs.size(); i=i+2) { + elseExpression = IfExpression.newBuilder() + .setElse(elseExpression) + .addCondition(new IfCondition(caseArgs.get(i + 1), caseArgs.get(i))).build(); + } + return elseExpression; } if (call.getOperator() == SqlStdOperatorTable.ITEM) { @@ -227,13 +246,15 @@ public class DrillOptiq { case DATE: return (ValueExpressions.getDate((GregorianCalendar)literal.getValue())); case TIME: - return (ValueExpressions.getTime((GregorianCalendar)literal.getValue())); + return (ValueExpressions.getTime((GregorianCalendar)literal.getValue())); case TIMESTAMP: - return (ValueExpressions.getTimeStamp((GregorianCalendar) literal.getValue())); + return (ValueExpressions.getTimeStamp((GregorianCalendar) literal.getValue())); case INTERVAL_YEAR_MONTH: - return (ValueExpressions.getIntervalYear(((BigDecimal) (literal.getValue())).intValue())); + return (ValueExpressions.getIntervalYear(((BigDecimal) (literal.getValue())).intValue())); case INTERVAL_DAY_TIME: - return (ValueExpressions.getIntervalDay(((BigDecimal) (literal.getValue())).longValue())); + return (ValueExpressions.getIntervalDay(((BigDecimal) (literal.getValue())).longValue())); + case NULL: + return NullExpression.INSTANCE; default: throw new UnsupportedOperationException(String.format("Unable to convert the value of %s and type %s to a Drill constant expression.", literal, literal.getTypeName())); }
