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

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


The following commit(s) were added to refs/heads/master by this push:
     new c139488  Support expression as the left-hand side for BETWEEN and IN 
clause (#5502)
c139488 is described below

commit c139488a6c33e4328b13c24fbfd689848c816849
Author: Xiaotian (Jackie) Jiang <17555551+jackie-ji...@users.noreply.github.com>
AuthorDate: Mon Jun 8 11:44:24 2020 -0700

    Support expression as the left-hand side for BETWEEN and IN clause (#5502)
    
    Add PQL compiler support for left-hand expression for BETWEEN and IN
---
 .../parsers/pql2/ast/BetweenPredicateAstNode.java  |  8 +--
 .../pql/parsers/pql2/ast/InPredicateAstNode.java   |  2 +
 .../tests/OfflineClusterIntegrationTest.java       | 63 +++++++++++-----------
 3 files changed, 36 insertions(+), 37 deletions(-)

diff --git 
a/pinot-common/src/main/java/org/apache/pinot/pql/parsers/pql2/ast/BetweenPredicateAstNode.java
 
b/pinot-common/src/main/java/org/apache/pinot/pql/parsers/pql2/ast/BetweenPredicateAstNode.java
index 4f11372..8d216be 100644
--- 
a/pinot-common/src/main/java/org/apache/pinot/pql/parsers/pql2/ast/BetweenPredicateAstNode.java
+++ 
b/pinot-common/src/main/java/org/apache/pinot/pql/parsers/pql2/ast/BetweenPredicateAstNode.java
@@ -22,6 +22,7 @@ import java.util.Collections;
 import org.apache.pinot.common.request.Expression;
 import org.apache.pinot.common.request.FilterOperator;
 import org.apache.pinot.common.request.Function;
+import org.apache.pinot.common.request.transform.TransformExpressionTree;
 import org.apache.pinot.common.utils.request.FilterQueryTree;
 import org.apache.pinot.common.utils.request.HavingQueryTree;
 import org.apache.pinot.common.utils.request.RequestUtils;
@@ -39,6 +40,7 @@ public class BetweenPredicateAstNode extends PredicateAstNode 
{
       _identifier = node.getName();
     } else if (childNode instanceof FunctionCallAstNode) {
       _function = (FunctionCallAstNode) childNode;
+      _identifier = TransformExpressionTree.getStandardExpression(childNode);
     } else {
       super.addChild(childNode);
     }
@@ -102,8 +104,7 @@ public class BetweenPredicateAstNode extends 
PredicateAstNode {
         
rangeFuncCall.addToOperands(RequestUtils.createLiteralExpression(right));
         return betweenExpr;
       } catch (ClassCastException e) {
-        throw new Pql2CompilationException(
-            "BETWEEN clause was expecting two literal AST nodes, got " + 
getChildren());
+        throw new Pql2CompilationException("BETWEEN clause was expecting two 
literal AST nodes, got " + getChildren());
       }
     } else {
       throw new Pql2CompilationException("BETWEEN clause does not have two 
children nodes");
@@ -123,8 +124,7 @@ public class BetweenPredicateAstNode extends 
PredicateAstNode {
             Collections.singletonList("[" + left.getValueAsString() + "\t\t" + 
right.getValueAsString() + "]"),
             FilterOperator.RANGE, null);
       } catch (ClassCastException e) {
-        throw new Pql2CompilationException(
-            "BETWEEN clause was expecting two literal AST nodes, got " + 
getChildren());
+        throw new Pql2CompilationException("BETWEEN clause was expecting two 
literal AST nodes, got " + getChildren());
       }
     } else {
       throw new Pql2CompilationException("BETWEEN clause does not have two 
children nodes");
diff --git 
a/pinot-common/src/main/java/org/apache/pinot/pql/parsers/pql2/ast/InPredicateAstNode.java
 
b/pinot-common/src/main/java/org/apache/pinot/pql/parsers/pql2/ast/InPredicateAstNode.java
index 82007c5..39a28c2 100644
--- 
a/pinot-common/src/main/java/org/apache/pinot/pql/parsers/pql2/ast/InPredicateAstNode.java
+++ 
b/pinot-common/src/main/java/org/apache/pinot/pql/parsers/pql2/ast/InPredicateAstNode.java
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.TreeSet;
 import org.apache.pinot.common.request.Expression;
 import org.apache.pinot.common.request.FilterOperator;
+import org.apache.pinot.common.request.transform.TransformExpressionTree;
 import org.apache.pinot.common.utils.request.FilterQueryTree;
 import org.apache.pinot.common.utils.request.HavingQueryTree;
 import org.apache.pinot.common.utils.request.RequestUtils;
@@ -68,6 +69,7 @@ public class InPredicateAstNode extends PredicateAstNode {
     } else if (childNode instanceof FunctionCallAstNode) {
       if (_function == null && _identifier == null) {
         _function = (FunctionCallAstNode) childNode;
+        _identifier = TransformExpressionTree.getStandardExpression(childNode);
       } else if (_function != null) {
         throw new Pql2CompilationException("IN predicate has more than one 
function.");
       } else {
diff --git 
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java
 
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java
index 223602c..beda97c 100644
--- 
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java
+++ 
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java
@@ -46,15 +46,11 @@ import org.apache.pinot.spi.utils.JsonUtils;
 import org.apache.pinot.spi.utils.builder.TableConfigBuilder;
 import org.apache.pinot.spi.utils.builder.TableNameBuilder;
 import org.apache.pinot.util.TestUtils;
-import org.testng.Assert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
+import static org.testng.Assert.*;
 
 
 /**
@@ -319,7 +315,7 @@ public class OfflineClusterIntegrationTest extends 
BaseClusterIntegrationTestSet
     String todayStr = 
response.get("resultTable").get("rows").get(0).get(0).asText();
     String expectedTodayStr =
         
Instant.now().atZone(ZoneId.of("UTC")).format(DateTimeFormatter.ofPattern("yyyy-MM-dd
 z"));
-    Assert.assertEquals(todayStr, expectedTodayStr);
+    assertEquals(todayStr, expectedTodayStr);
   }
 
   @Test
@@ -677,26 +673,26 @@ public class OfflineClusterIntegrationTest extends 
BaseClusterIntegrationTestSet
     String pqlQuery = "SELECT DaysSinceEpoch, 
timeConvert(DaysSinceEpoch,'DAYS','SECONDS') FROM mytable";
     JsonNode response = postQuery(pqlQuery);
     ArrayNode selectionResults = (ArrayNode) 
response.get("selectionResults").get("results");
-    Assert.assertNotNull(selectionResults);
-    Assert.assertTrue(selectionResults.size() > 0);
+    assertNotNull(selectionResults);
+    assertTrue(selectionResults.size() > 0);
     for (int i = 0; i < selectionResults.size(); i++) {
       long daysSinceEpoch = selectionResults.get(i).get(0).asLong();
       long secondsSinceEpoch = selectionResults.get(i).get(1).asLong();
-      Assert.assertEquals(daysSinceEpoch * 24 * 60 * 60, secondsSinceEpoch);
+      assertEquals(daysSinceEpoch * 24 * 60 * 60, secondsSinceEpoch);
     }
 
     pqlQuery =
         "SELECT DaysSinceEpoch, timeConvert(DaysSinceEpoch,'DAYS','SECONDS') 
FROM mytable order by DaysSinceEpoch limit 10000";
     response = postQuery(pqlQuery);
     selectionResults = (ArrayNode) 
response.get("selectionResults").get("results");
-    Assert.assertNotNull(selectionResults);
-    Assert.assertTrue(selectionResults.size() > 0);
+    assertNotNull(selectionResults);
+    assertTrue(selectionResults.size() > 0);
     long prevValue = -1;
     for (int i = 0; i < selectionResults.size(); i++) {
       long daysSinceEpoch = selectionResults.get(i).get(0).asLong();
       long secondsSinceEpoch = selectionResults.get(i).get(1).asLong();
-      Assert.assertEquals(daysSinceEpoch * 24 * 60 * 60, secondsSinceEpoch);
-      Assert.assertTrue(daysSinceEpoch >= prevValue);
+      assertEquals(daysSinceEpoch * 24 * 60 * 60, secondsSinceEpoch);
+      assertTrue(daysSinceEpoch >= prevValue);
       prevValue = daysSinceEpoch;
     }
 
@@ -704,14 +700,14 @@ public class OfflineClusterIntegrationTest extends 
BaseClusterIntegrationTestSet
         "SELECT DaysSinceEpoch, timeConvert(DaysSinceEpoch,'DAYS','SECONDS') 
FROM mytable order by timeConvert(DaysSinceEpoch,'DAYS','SECONDS') DESC limit 
10000";
     response = postQuery(pqlQuery);
     selectionResults = (ArrayNode) 
response.get("selectionResults").get("results");
-    Assert.assertNotNull(selectionResults);
-    Assert.assertTrue(selectionResults.size() > 0);
+    assertNotNull(selectionResults);
+    assertTrue(selectionResults.size() > 0);
     prevValue = Long.MAX_VALUE;
     for (int i = 0; i < selectionResults.size(); i++) {
       long daysSinceEpoch = selectionResults.get(i).get(0).asLong();
       long secondsSinceEpoch = selectionResults.get(i).get(1).asLong();
-      Assert.assertEquals(daysSinceEpoch * 24 * 60 * 60, secondsSinceEpoch);
-      Assert.assertTrue(secondsSinceEpoch <= prevValue);
+      assertEquals(daysSinceEpoch * 24 * 60 * 60, secondsSinceEpoch);
+      assertTrue(secondsSinceEpoch <= prevValue);
       prevValue = secondsSinceEpoch;
     }
   }
@@ -724,32 +720,33 @@ public class OfflineClusterIntegrationTest extends 
BaseClusterIntegrationTestSet
 
     String pqlQuery;
     pqlQuery = "SELECT count(*) FROM mytable WHERE DaysSinceEpoch = " + 
daysSinceEpoch;
-    JsonNode response1 = postQuery(pqlQuery);
+    long expectedResult = 
postQuery(pqlQuery).get("aggregationResults").get(0).get("value").asLong();
+    System.out.println(expectedResult);
 
     pqlQuery = "SELECT count(*) FROM mytable WHERE 
timeConvert(DaysSinceEpoch,'DAYS','SECONDS') = " + secondsSinceEpoch;
-    JsonNode response2 = postQuery(pqlQuery);
+    
assertEquals(postQuery(pqlQuery).get("aggregationResults").get(0).get("value").asLong(),
 expectedResult);
 
     pqlQuery = "SELECT count(*) FROM mytable WHERE DaysSinceEpoch = " + 
daysSinceEpoch
         + " OR timeConvert(DaysSinceEpoch,'DAYS','SECONDS') = " + 
secondsSinceEpoch;
-    JsonNode response3 = postQuery(pqlQuery);
+    
assertEquals(postQuery(pqlQuery).get("aggregationResults").get(0).get("value").asLong(),
 expectedResult);
 
     pqlQuery = "SELECT count(*) FROM mytable WHERE DaysSinceEpoch = " + 
daysSinceEpoch
         + " AND timeConvert(DaysSinceEpoch,'DAYS','SECONDS') = " + 
secondsSinceEpoch;
-    JsonNode response4 = postQuery(pqlQuery);
+    
assertEquals(postQuery(pqlQuery).get("aggregationResults").get(0).get("value").asLong(),
 expectedResult);
 
     pqlQuery =
         "SELECT count(*) FROM mytable WHERE 
DIV(timeConvert(DaysSinceEpoch,'DAYS','SECONDS'),1) = " + secondsSinceEpoch;
-    JsonNode response5 = postQuery(pqlQuery);
-
-    double val1 = 
response1.get("aggregationResults").get(0).get("value").asDouble();
-    double val2 = 
response2.get("aggregationResults").get(0).get("value").asDouble();
-    double val3 = 
response3.get("aggregationResults").get(0).get("value").asDouble();
-    double val4 = 
response4.get("aggregationResults").get(0).get("value").asDouble();
-    double val5 = 
response5.get("aggregationResults").get(0).get("value").asDouble();
-    Assert.assertEquals(val1, val2);
-    Assert.assertEquals(val1, val3);
-    Assert.assertEquals(val1, val4);
-    Assert.assertEquals(val1, val5);
+    
assertEquals(postQuery(pqlQuery).get("aggregationResults").get(0).get("value").asLong(),
 expectedResult);
+
+    pqlQuery = String
+        .format("SELECT count(*) FROM mytable WHERE 
timeConvert(DaysSinceEpoch,'DAYS','SECONDS') IN (%d, %d)",
+            secondsSinceEpoch - 100, secondsSinceEpoch);
+    
assertEquals(postQuery(pqlQuery).get("aggregationResults").get(0).get("value").asLong(),
 expectedResult);
+
+    pqlQuery = String
+        .format("SELECT count(*) FROM mytable WHERE 
timeConvert(DaysSinceEpoch,'DAYS','SECONDS') BETWEEN %d AND %d",
+            secondsSinceEpoch - 100, secondsSinceEpoch);
+    
assertEquals(postQuery(pqlQuery).get("aggregationResults").get(0).get("value").asLong(),
 expectedResult);
   }
 
   @Test
@@ -772,7 +769,7 @@ public class OfflineClusterIntegrationTest extends 
BaseClusterIntegrationTestSet
       //System.out.println(response2);
       double val1 = 
response1.get("aggregationResults").get(0).get("value").asDouble();
       double val2 = 
response2.get("aggregationResults").get(0).get("value").asDouble();
-      Assert.assertEquals(val1, val2);
+      assertEquals(val1, val2);
     }
   }
 


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

Reply via email to