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()));
       }