You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ja...@apache.org on 2021/02/19 19:10:46 UTC

[incubator-pinot] branch master updated: Support validating jsonExtractKey and jsonExtractScalar with underscore (#6594)

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 d74224a  Support validating jsonExtractKey and jsonExtractScalar with underscore (#6594)
d74224a is described below

commit d74224a14b07bbe3e5c4909b51856886e29510df
Author: Xiaotian (Jackie) Jiang <17...@users.noreply.github.com>
AuthorDate: Fri Feb 19 11:10:23 2021 -0800

    Support validating jsonExtractKey and jsonExtractScalar with underscore (#6594)
---
 .../apache/pinot/sql/parsers/CalciteSqlParser.java | 20 ++++----
 .../JsonExtractScalarTransformFunctionTest.java    | 53 ++++++++++++++--------
 2 files changed, 46 insertions(+), 27 deletions(-)

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 418a902..602530b 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
@@ -910,30 +910,32 @@ public class CalciteSqlParser {
   }
 
   private static void validateFunction(String functionName, List<Expression> operands) {
-    switch (functionName.toUpperCase()) {
-      case "JSONEXTRACTSCALAR":
-        validateJsonExtractScalarFunction(functionName, operands);
+    switch (canonicalize(functionName)) {
+      case "jsonextractscalar":
+        validateJsonExtractScalarFunction(operands);
         break;
-      case "JSONEXTRACTKEY":
-        validateJsonExtractKeyFunction(functionName, operands);
+      case "jsonextractkey":
+        validateJsonExtractKeyFunction(operands);
         break;
     }
   }
 
-  private static void validateJsonExtractScalarFunction(String functionName, List<Expression> operands) {
+  private static void validateJsonExtractScalarFunction(List<Expression> operands) {
+    int numOperands = operands.size();
+
     // Check that there are exactly 3 or 4 arguments
-    if (operands.size() != 3 && operands.size() != 4) {
+    if (numOperands != 3 && numOperands != 4) {
       throw new SqlCompilationException(
           "Expect 3 or 4 arguments for transform function: jsonExtractScalar(jsonFieldName, 'jsonPath', 'resultsType', ['defaultValue'])");
     }
-    if (!operands.get(1).isSetLiteral() || !operands.get(2).isSetLiteral() || (operands.size() == 4 && !operands.get(3)
+    if (!operands.get(1).isSetLiteral() || !operands.get(2).isSetLiteral() || (numOperands == 4 && !operands.get(3)
         .isSetLiteral())) {
       throw new SqlCompilationException(
           "Expect the 2nd/3rd/4th argument of transform function: jsonExtractScalar(jsonFieldName, 'jsonPath', 'resultsType', ['defaultValue']) to be a single-quoted literal value.");
     }
   }
 
-  private static void validateJsonExtractKeyFunction(String functionName, List<Expression> operands) {
+  private static void validateJsonExtractKeyFunction(List<Expression> operands) {
     // Check that there are exactly 2 arguments
     if (operands.size() != 2) {
       throw new SqlCompilationException(
diff --git a/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/function/JsonExtractScalarTransformFunctionTest.java b/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/function/JsonExtractScalarTransformFunctionTest.java
index fe50a14..79c9a3f 100644
--- a/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/function/JsonExtractScalarTransformFunctionTest.java
+++ b/pinot-core/src/test/java/org/apache/pinot/core/operator/transform/function/JsonExtractScalarTransformFunctionTest.java
@@ -100,13 +100,22 @@ public class JsonExtractScalarTransformFunctionTest extends BaseTransformFunctio
 
   @DataProvider(name = "testJsonPathTransformFunctionArguments")
   public Object[][] testJsonPathTransformFunctionArguments() {
-    if (new Random(System.currentTimeMillis()).nextBoolean()) {
-      return new Object[][]{new Object[]{"jsonExtractScalar(json,'$.intSV','INT')", FieldSpec.DataType.INT, true}, new Object[]{"jsonExtractScalar(json,'$.intMV','INT_ARRAY')", FieldSpec.DataType.INT, false}, new Object[]{"jsonExtractScalar(json,'$.longSV','LONG')", FieldSpec.DataType.LONG, true}, new Object[]{"jsonExtractScalar(json,'$.floatSV','FLOAT')", FieldSpec.DataType.FLOAT, true}, new Object[]{"jsonExtractScalar(json,'$.doubleSV','DOUBLE')", FieldSpec.DataType.DOUBLE, true}, new  [...]
-    }
-    if (new Random(System.currentTimeMillis()).nextBoolean()) {
-      return new Object[][]{new Object[]{"json_extract_scalar(json,'$.intSV','INT', '0')", FieldSpec.DataType.INT, true}, new Object[]{"json_extract_scalar(json,'$.intMV','INT_ARRAY', ['0'])", FieldSpec.DataType.INT, false}, new Object[]{"json_extract_scalar(json,'$.longSV','LONG', '0')", FieldSpec.DataType.LONG, true}, new Object[]{"json_extract_scalar(json,'$.floatSV','FLOAT', '0.0')", FieldSpec.DataType.FLOAT, true}, new Object[]{"json_extract_scalar(json,'$.doubleSV','DOUBLE', '0.0') [...]
-    }
-    return new Object[][]{new Object[]{"json_extract_scalar(json,'$.intSV','INT')", FieldSpec.DataType.INT, true}, new Object[]{"json_extract_scalar(json,'$.intMV','INT_ARRAY')", FieldSpec.DataType.INT, false}, new Object[]{"json_extract_scalar(json,'$.longSV','LONG')", FieldSpec.DataType.LONG, true}, new Object[]{"json_extract_scalar(json,'$.floatSV','FLOAT')", FieldSpec.DataType.FLOAT, true}, new Object[]{"json_extract_scalar(json,'$.doubleSV','DOUBLE')", FieldSpec.DataType.DOUBLE, tru [...]
+    //@formatter:off
+    return new Object[][]{
+        new Object[]{"jsonExtractScalar(json,'$.intSV','INT')", FieldSpec.DataType.INT, true},
+        new Object[]{"jsonExtractScalar(json,'$.intMV','INT_ARRAY')", FieldSpec.DataType.INT, false},
+        new Object[]{"jsonExtractScalar(json,'$.longSV','LONG')", FieldSpec.DataType.LONG, true},
+        new Object[]{"jsonExtractScalar(json,'$.floatSV','FLOAT')", FieldSpec.DataType.FLOAT, true},
+        new Object[]{"jsonExtractScalar(json,'$.doubleSV','DOUBLE')", FieldSpec.DataType.DOUBLE, true},
+        new Object[]{"jsonExtractScalar(json,'$.stringSV','STRING')", FieldSpec.DataType.STRING, true},
+        new Object[]{"json_extract_scalar(json,'$.intSV','INT', '0')", FieldSpec.DataType.INT, true},
+        new Object[]{"json_extract_scalar(json,'$.intMV','INT_ARRAY', ['0'])", FieldSpec.DataType.INT, false},
+        new Object[]{"json_extract_scalar(json,'$.longSV','LONG', '0')", FieldSpec.DataType.LONG, true},
+        new Object[]{"json_extract_scalar(json,'$.floatSV','FLOAT', '0.0')", FieldSpec.DataType.FLOAT, true},
+        new Object[]{"json_extract_scalar(json,'$.doubleSV','DOUBLE', '0.0')", FieldSpec.DataType.DOUBLE, true},
+        new Object[]{"json_extract_scalar(json,'$.stringSV','STRING', 'null')", FieldSpec.DataType.STRING, true}
+    };
+    //@formatter:on
   }
 
   @Test
@@ -242,20 +251,28 @@ public class JsonExtractScalarTransformFunctionTest extends BaseTransformFunctio
 
   @DataProvider(name = "testIllegalArguments")
   public Object[][] testIllegalArguments() {
-    return new Object[][]{new Object[]{String.format("jsonExtractScalar(%s)",
-        JSON_COLUMN)}, new Object[]{"jsonExtractScalar(5,'$.store.book[0].author','$.store.book[0].author')"}, new Object[]{String.format(
-        "jsonExtractScalar(%s,'$.store.book[0].author')", INT_MV_COLUMN)}, new Object[]{String.format(
-        "jsonExtractScalar(%s,'$.store.book[0].author')", STRING_SV_COLUMN)}, new Object[]{String.format(
-        "jsonExtractScalar(%s,'$.store.book[0].author', 'STRINGARRAY')", STRING_SV_COLUMN)}, new Object[]{String.format(
-        "jsonExtractScalar(%s,%s,'$.store.book[0].author', 'String','abc')", JSON_COLUMN, INT_SV_COLUMN)}};
+    //@formatter:off
+    return new Object[][]{
+        new Object[]{String.format("jsonExtractScalar(%s)", JSON_COLUMN)},
+        new Object[]{"jsonExtractScalar(5,'$.store.book[0].author','$.store.book[0].author')"},
+        new Object[]{String.format("jsonExtractScalar(%s,'$.store.book[0].author')", INT_MV_COLUMN)},
+        new Object[]{String.format("jsonExtractScalar(%s,'$.store.book[0].author')", STRING_SV_COLUMN)},
+        new Object[]{String.format("jsonExtractScalar(%s,'$.store.book[0].author', 'STRINGARRAY')", STRING_SV_COLUMN)},
+        new Object[]{String.format("jsonExtractScalar(%s,%s,'$.store.book[0].author', 'String','abc')", JSON_COLUMN, INT_SV_COLUMN)}
+    };
+    //@formatter:on
   }
 
   @DataProvider(name = "testParsingIllegalQueries")
   public Object[][] testParsingIllegalQueries() {
-    return new Object[][]{new Object[]{String.format("jsonExtractScalar(%s, \"$.store.book[0].author\", 'String')",
-        JSON_COLUMN, INT_SV_COLUMN)}, new Object[]{String.format(
-        "jsonExtractScalar(%s, '$.store.book[0].author', \"String\")", JSON_COLUMN,
-        INT_SV_COLUMN)}, new Object[]{String.format("jsonExtractScalar(%s, \"$.store.book[0].author\", 'String','abc')",
-        JSON_COLUMN, INT_SV_COLUMN)}};
+    //@formatter:off
+    return new Object[][]{
+        new Object[]{String.format("jsonExtractScalar(%s, \"$.store.book[0].author\", 'String')", JSON_COLUMN)},
+        new Object[]{String.format("jsonExtractScalar(%s, '$.store.book[0].author', \"String\")", JSON_COLUMN)},
+        new Object[]{String.format("json_extract_scalar(%s, \"$.store.book[0].author\", 'String','abc')", JSON_COLUMN)},
+        new Object[]{String.format("jsonExtractKey(%s, \"$.*\")", JSON_COLUMN)},
+        new Object[]{String.format("json_extract_key(%s, \"$.*\")", JSON_COLUMN)}
+    };
+    //@formatter:on
   }
 }


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