You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@drill.apache.org by ja...@apache.org on 2014/04/20 03:18:17 UTC
[09/51] [abbrv] git commit: Support CASE statement in query 1.
Pending testcases
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 <ve...@gmail.com>
Authored: Mon Mar 31 14:30:55 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
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()));
}