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