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

Reply via email to