fsk119 commented on code in PR #24106:
URL: https://github.com/apache/flink/pull/24106#discussion_r1465797504
##########
flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/extraction/FunctionTemplate.java:
##########
@@ -63,11 +64,13 @@ private FunctionTemplate(
* types.
*/
static FunctionTemplate fromAnnotation(DataTypeFactory typeFactory,
FunctionHint hint) {
+
Review Comment:
nit: revert this empty line
##########
flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/extraction/FunctionTemplate.java:
##########
@@ -78,11 +81,13 @@ static FunctionTemplate fromAnnotation(DataTypeFactory
typeFactory, FunctionHint
* data types.
*/
static FunctionTemplate fromAnnotation(DataTypeFactory typeFactory,
ProcedureHint hint) {
+
Review Comment:
remove this empty line.
##########
flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/extraction/TypeInferenceExtractorTest.java:
##########
@@ -1585,4 +1659,143 @@ public void eval(CompletableFuture<Long> f, int[] i) {}
private static class DataTypeHintOnScalarFunctionAsync extends
AsyncScalarFunction {
public void eval(@DataTypeHint("ROW<i INT>")
CompletableFuture<RowData> f) {}
}
+
+ private static class ArgumentHintScalarFunction extends ScalarFunction {
+ @FunctionHint(
+ argument = {
+ @ArgumentHint(type = @DataTypeHint("STRING"), name = "f1"),
+ @ArgumentHint(type = @DataTypeHint("INTEGER"), name = "f2")
+ })
+ public String eval(String f1, int f2) {
+ return "";
+ }
+ }
+
+ private static class ArgumentHintMissingTypeScalarFunction extends
ScalarFunction {
+ @FunctionHint(argument = {@ArgumentHint(name = "f1"),
@ArgumentHint(name = "f2")})
+ public String eval(String f1, int f2) {
+ return "";
+ }
+ }
+
+ private static class ArgumentHintMissingNameScalarFunction extends
ScalarFunction {
+ @FunctionHint(
+ argument = {
+ @ArgumentHint(type = @DataTypeHint("STRING")),
+ @ArgumentHint(type = @DataTypeHint("INTEGER"))
+ })
+ public String eval(String f1, int f2) {
+ return "";
+ }
+ }
+
+ private static class ArgumentHintNameConflictScalarFunction extends
ScalarFunction {
+ @FunctionHint(
+ argument = {
+ @ArgumentHint(name = "in1", type =
@DataTypeHint("STRING")),
+ @ArgumentHint(name = "in1", type =
@DataTypeHint("INTEGER"))
+ })
+ public String eval(String f1, int f2) {
+ return "";
+ }
+ }
+
+ private static class ArgumentHintOnParameterScalarFunction extends
ScalarFunction {
+ public String eval(
+ @ArgumentHint(type = @DataTypeHint("STRING"), name = "in1")
String f1,
+ @ArgumentHint(type = @DataTypeHint("INTEGER"), name = "in2")
int f2) {
+ return "";
+ }
+ }
+
+ private static class ArgumentsAndInputsScalarFunction extends
ScalarFunction {
+ @FunctionHint(
+ argument = {
+ @ArgumentHint(type = @DataTypeHint("STRING"), name = "f1"),
+ @ArgumentHint(type = @DataTypeHint("INTEGER"), name = "f2")
+ },
+ input = {@DataTypeHint("STRING"), @DataTypeHint("INTEGER")})
+ public String eval(String f1, int f2) {
+ return "";
+ }
+ }
+
+ private static class ArgumentsHintAndDataTypeHintScalarFunction extends
ScalarFunction {
+
+ public String eval(
+ @DataTypeHint("STRING") @ArgumentHint(name = "f1", type =
@DataTypeHint("STRING"))
+ String f1,
+ @ArgumentHint(name = "f2", type = @DataTypeHint("INTEGER"))
int f2) {
+ return "";
+ }
+ }
+
+ @FunctionHint(
+ argument = {
+ @ArgumentHint(type = @DataTypeHint("STRING"), name = "f1"),
+ @ArgumentHint(type = @DataTypeHint("INTEGER"), name = "f2")
+ })
+ private static class InvalidFunctionHintOnClassAndMethod extends
ScalarFunction {
+ @FunctionHint(
+ argument = {
+ @ArgumentHint(type = @DataTypeHint("STRING"), name = "f1"),
+ @ArgumentHint(type = @DataTypeHint("INTEGER"), name = "f2")
+ },
+ input = {@DataTypeHint("STRING"), @DataTypeHint("INTEGER")})
+ public String eval(String f1, int f2) {
Review Comment:
BTW, if argument's DataType is not null, user can not specify optional =
true.
##########
flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/extraction/TypeInferenceExtractorTest.java:
##########
@@ -1585,4 +1659,143 @@ public void eval(CompletableFuture<Long> f, int[] i) {}
private static class DataTypeHintOnScalarFunctionAsync extends
AsyncScalarFunction {
public void eval(@DataTypeHint("ROW<i INT>")
CompletableFuture<RowData> f) {}
}
+
+ private static class ArgumentHintScalarFunction extends ScalarFunction {
+ @FunctionHint(
+ argument = {
+ @ArgumentHint(type = @DataTypeHint("STRING"), name = "f1"),
+ @ArgumentHint(type = @DataTypeHint("INTEGER"), name = "f2")
Review Comment:
argument `f2`'s type should INTEGER NOT NULL here.
##########
flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/extraction/FunctionTemplate.java:
##########
@@ -173,18 +183,47 @@ private static <T, H extends Annotation> T defaultAsNull(
private static @Nullable FunctionSignatureTemplate createSignatureTemplate(
DataTypeFactory typeFactory,
- @Nullable DataTypeHint[] input,
+ @Nullable DataTypeHint[] inputs,
@Nullable String[] argumentNames,
+ @Nullable ArgumentHint[] argumentHints,
boolean isVarArg) {
- if (input == null) {
+
+ String[] argumentHintNames;
+ DataTypeHint[] argumentHintTypes;
+
+ if (argumentHints != null && inputs != null) {
+ throw extractionError(
+ "Argument and input hints cannot be declared in the same
function hint.");
+ }
+
+ if (argumentHints != null) {
+ argumentHintNames = new String[argumentHints.length];
+ argumentHintTypes = new DataTypeHint[argumentHints.length];
+ for (int i = 0; i < argumentHints.length; i++) {
+ ArgumentHint argumentHint = argumentHints[i];
+ argumentHintNames[i] = defaultAsNull(argumentHint,
ArgumentHint::name);
+ argumentHintTypes[i] = defaultAsNull(argumentHint,
ArgumentHint::type);
+ if (argumentHintNames[i] == null || argumentHintTypes[i] ==
null) {
+ throw extractionError(
Review Comment:
I think arugment names can be null. For example,
```
public static class NamedArgumentsWithOverloadedScalarFunction extends
ScalarFunction {
@FunctionHint(
output = @DataTypeHint("STRING"),
argument = {
@ArgumentHint(type = @DataTypeHint("int")),
@ArgumentHint(type = @DataTypeHint("int"))
})
public String eval(Integer arg1, Integer arg2) {
return (arg1 + ": " + arg2);
}
}
```
is same as
```
public static class NamedArgumentsWithOverloadedScalarFunction extends
ScalarFunction {
@FunctionHint(
output = @DataTypeHint("STRING"),
input = { @DataTypeHint ...})
public String eval(Integer arg1, Integer arg2) {
return (arg1 + ": " + arg2);
}
}
```
##########
flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/inference/TypeInferenceOperandChecker.java:
##########
@@ -114,6 +119,40 @@ public boolean isOptional(int i) {
return false;
Review Comment:
Do we need correct the behaviour?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]