This is an automated email from the ASF dual-hosted git repository.

xiangfu pushed a commit to branch handle_predicate_right_side_expression
in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git

commit e406b59b360f4ad7143d9e2c34d084f6f33bcc7b
Author: Xiang Fu <fx19880...@gmail.com>
AuthorDate: Fri Feb 14 01:13:43 2020 -0800

    Update predicate expression
---
 .../pinot/common/utils/request/RequestUtils.java   | 29 ++++++++++++-
 .../apache/pinot/sql/parsers/CalciteSqlParser.java | 50 +++++++++++++++++++++-
 2 files changed, 76 insertions(+), 3 deletions(-)

diff --git 
a/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java
 
b/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java
index a82eb6a..d1e3eda 100644
--- 
a/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java
+++ 
b/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java
@@ -126,14 +126,39 @@ public class RequestUtils {
     return expression;
   }
 
-  public static Expression getLiteralExpression(String value) {
+  public static Expression createNewLiteralExpression() {
     Expression expression = new Expression(ExpressionType.LITERAL);
     Literal literal = new Literal();
-    literal.setStringValue(value);
     expression.setLiteral(literal);
     return expression;
   }
 
+  public static Expression getLiteralExpression(String value) {
+    Expression expression = createNewLiteralExpression();
+    expression.getLiteral().setStringValue(value);
+    return expression;
+  }
+
+  public static Expression getLiteralExpression(Integer value) {
+    return getLiteralExpression(value.longValue());
+  }
+
+  public static Expression getLiteralExpression(Long value) {
+    Expression expression = createNewLiteralExpression();
+    expression.getLiteral().setLongValue(value);
+    return expression;
+  }
+
+  public static Expression getLiteralExpression(Float value) {
+    return getLiteralExpression(value.doubleValue());
+  }
+
+  public static Expression getLiteralExpression(Double value) {
+    Expression expression = createNewLiteralExpression();
+    expression.getLiteral().setDoubleValue(value);
+    return expression;
+  }
+
   public static Expression getFunctionExpression(String operator) {
     Expression expression = new Expression(ExpressionType.FUNCTION);
     Function function = new Function(operator);
diff --git 
a/pinot-common/src/main/java/org/apache/pinot/sql/parsers/CalciteSqlParser.java 
b/pinot-common/src/main/java/org/apache/pinot/sql/parsers/CalciteSqlParser.java
index 5a85b38..be32173 100644
--- 
a/pinot-common/src/main/java/org/apache/pinot/sql/parsers/CalciteSqlParser.java
+++ 
b/pinot-common/src/main/java/org/apache/pinot/sql/parsers/CalciteSqlParser.java
@@ -273,7 +273,7 @@ public class CalciteSqlParser {
         }
 
         if (selectSqlNode.getWhere() != null) {
-          
pinotQuery.setFilterExpression(toExpression(selectSqlNode.getWhere()));
+          
pinotQuery.setFilterExpression(rewritePredicate(toExpression(selectSqlNode.getWhere())));
         }
         if (selectSqlNode.getGroup() != null) {
           
pinotQuery.setGroupByList(convertSelectList(selectSqlNode.getGroup()));
@@ -289,6 +289,54 @@ public class CalciteSqlParser {
     return pinotQuery;
   }
 
+  private static Expression rewritePredicate(Expression expression) {
+    Function functionCall = expression.getFunctionCall();
+    if (functionCall != null) {
+      switch (SqlKind.valueOf(functionCall.getOperator().toUpperCase())) {
+        case EQUALS:
+        case NOT_EQUALS:
+        case GREATER_THAN:
+        case GREATER_THAN_OR_EQUAL:
+        case LESS_THAN:
+        case LESS_THAN_OR_EQUAL:
+          Expression comparisonFunction = 
RequestUtils.getFunctionExpression(functionCall.getOperator());
+          List<Expression> exprList = new ArrayList<>();
+          exprList.add(getLeftOperand(functionCall));
+          exprList.add(RequestUtils.getLiteralExpression(0));
+          comparisonFunction.getFunctionCall().setOperands(exprList);
+          return comparisonFunction;
+        default:
+          List<Expression> operands = functionCall.getOperands();
+          List<Expression> newOperands = new ArrayList<>();
+          for (int i = 0; i < operands.size(); i++) {
+            newOperands.add(rewritePredicate(operands.get(i)));
+          }
+          functionCall.setOperands(newOperands);
+      }
+    }
+    return expression;
+  }
+
+  private static Expression getLeftOperand(Function functionCall) {
+    Expression minusFunction = 
RequestUtils.getFunctionExpression(SqlKind.MINUS.toString());
+    List<Expression> updatedOperands = new ArrayList<>();
+    for (Expression operand : functionCall.getOperands()) {
+      updatedOperands.add(rewritePredicate(operand));
+    }
+    minusFunction.getFunctionCall().setOperands(updatedOperands);
+    return minusFunction;
+  }
+
+  private static Expression getRightOperand(Function functionCall) {
+    Expression minusFunction = 
RequestUtils.getFunctionExpression(SqlKind.MINUS.toString());
+    List<Expression> updatedOperands = new ArrayList<>();
+    for (Expression operand : functionCall.getOperands()) {
+      updatedOperands.add(rewritePredicate(operand));
+    }
+    minusFunction.getFunctionCall().setOperands(updatedOperands);
+    return minusFunction;
+  }
+
   private static void applyAlias(Map<Identifier, Expression> aliasMap, 
PinotQuery pinotQuery) {
     if (pinotQuery.isSetFilterExpression()) {
       applyAlias(aliasMap, pinotQuery.getFilterExpression());


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org
For additional commands, e-mail: commits-h...@pinot.apache.org

Reply via email to