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]

Reply via email to