Thanks, that explains what I'm seeing. Niels
On Tue, 26 Jan 2021, 20:57 Rui Wang, <ruw...@google.com> wrote: > Yes I think Calcite does not support varargs in for scalar function (so in > UDF). Please check this JIRA: > https://issues.apache.org/jira/browse/CALCITE-2772 > > > -Rui > > On Tue, Jan 26, 2021 at 2:04 AM Niels Basjes <ni...@basjes.nl> wrote: > >> Hi, >> >> I want to define a Beam SQL user defined function that accepts a variable >> list of arguments (which may be empty). >> >> What I essentially would like to have is >> >> public class ParseUserAgentJson implements BeamSqlUdf { >> >> public static String eval( String input, >> String... fields) { ... } >> >> } >> >> When I do this I get this on the case where the list is empty >> >> *Caused by: >> org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.sql.validate.SqlValidatorException: >> No match found for function signature ParseUserAgentJson(<CHARACTER>)* >> * at >> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native >> Method)* >> * at >> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)* >> * at >> java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)* >> * at >> java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)* >> >> >> So I tried >> public static String eval( @Parameter(name = "userAgent") String input, >> >> @Parameter(name = "Fields", optional = true) >> String ... fields >> ) >> >> Which gives >> >> >> *java.lang.AssertionError: No assign rules for OTHER defined* >> >> * at >> org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.sql.type.SqlTypeAssignmentRules.canCastFrom(SqlTypeAssignmentRules.java:389)* >> * at >> org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.sql.type.SqlTypeUtil.canCastFrom(SqlTypeUtil.java:864)* >> * at >> org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.sql.SqlUtil.lambda$filterRoutinesByParameterType$4(SqlUtil.java:620)* >> >> >> It seems this is Calcite that is unable to do the "Variable arguments" >> trick. >> >> So right now I have this workaround which works but limits it to a >> maximum of 10 arguments: >> >> public static String eval( // NOSONAR java:S107 Methods should not have >> too many parameters >> >> @Parameter(name = "userAgent") String input, >> @Parameter(name = "Field 1", optional = true) String field1, >> @Parameter(name = "Field 2", optional = true) String field2, >> @Parameter(name = "Field 3", optional = true) String field3, >> @Parameter(name = "Field 4", optional = true) String field4, >> @Parameter(name = "Field 5", optional = true) String field5, >> @Parameter(name = "Field 6", optional = true) String field6, >> @Parameter(name = "Field 7", optional = true) String field7, >> @Parameter(name = "Field 8", optional = true) String field8, >> @Parameter(name = "Field 9", optional = true) String field9, >> @Parameter(name = "Field 10", optional = true) String field10 >> ) { >> >> >> My question: Is there a better way to do this? >> >> -- >> Best regards / Met vriendelijke groeten, >> >> Niels Basjes >> >