[ 
https://issues.apache.org/jira/browse/FLINK-5826?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Zhuoluo Yang updated FLINK-5826:
--------------------------------
    Description: 
In some cases, UDF/UDTF should support variable types and variable arguments. 
Many UDF/UDTF developers wish to make the # of arguments and types flexible to 
users. They try to make their functions flexible.

Thus, we should support the following styles of UDF/UDTFs.

for example 1, in Java
{code:java}
public class SimpleUDF extends ScalarFunction {
        public int eval(Object... args) {
                // do something
        }
}
{code}

for example 2, in Scala
{code}
class SimpleUDF extends ScalarFunction {
  def eval(args: Any*): Int = {
    // do something
  }
}
{code}

If we modify the code in UserDefinedFunctionUtils.getSignature() and make both 
signatures pass. The first example will work normally. However, the second 
example will raise an exception.

{noformat}
Caused by: org.codehaus.commons.compiler.CompileException: Line 58, Column 0: 
No applicable constructor/method found for actual parameters 
"java.lang.String"; candidates are: "public java.lang.Object 
test.SimpleUDF.eval(scala.collection.Seq)"
  at org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:11523) 
~[janino-3.0.6.jar:?]
  at 
org.codehaus.janino.UnitCompiler.findMostSpecificIInvocable(UnitCompiler.java:8679)
 ~[janino-3.0.6.jar:?]
  at org.codehaus.janino.UnitCompiler.findIMethod(UnitCompiler.java:8539) 
~[janino-3.0.6.jar:?]
{noformat} 

The reason is that Scala will do a *sugary* modification to the signature of 
the method. The mothod {code} def eval(args: Any*){code} will become {code}def 
eval(args: scala.collection.Seq<Any>){code} in the class file. 

The code generation has been done in Java. If we use java style 
{code}eval(Object... args){code} to call the Scala method, it will raise the 
above exception.

However, I can't always restrict users to use Java to write a UDF/UDTF. Any 
ideas in variable types and variable arguments of Scala UDF/UDTFs to prevent 
the compilation failure?

  was:
In some cases, UDF/UDTF should support variable types and variable arguments. 
Many UDF/UDTF developers wish to make the # of arguments and types flexible to 
users. They try to make their functions flexible.

Thus, we should support the following styles of UDF/UDTFs.

for example 1, in Java
{code:java}
public class SimpleUDF extends ScalarFunction {
        public int eval(Object... args) {
                // do something
        }
}
{code}

for example 2, in Scala
{code}
class SimpleUDF extends ScalarFunction {
  def eval(args: Any*): Int = {
    // do something
  }
}
{code}

If we modify the code in UserDefinedFunctionUtils.getSignature() and make both 
signatures pass. The first example will work normally. However, the second 
example will raise an exception.

{noformat}
Caused by: org.codehaus.commons.compiler.CompileException: Line 58, Column 0: 
No applicable constructor/method found for actual parameters 
"java.lang.String"; candidates are: "public java.lang.Object 
test.SimpleUDF.eval(scala.collection.Seq)"
  at org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:11523) 
~[janino-3.0.6.jar:?]
  at 
org.codehaus.janino.UnitCompiler.findMostSpecificIInvocable(UnitCompiler.java:8679)
 ~[janino-3.0.6.jar:?]
  at org.codehaus.janino.UnitCompiler.findIMethod(UnitCompiler.java:8539) 
~[janino-3.0.6.jar:?]
{noformat} 

The reason is that Scala will do a sugary modification to the signature of the 
method. The mothod {code} def eval(args: Any*){code} will become {code}def 
eval(args: scala.collection.Seq<Any>){code} in the class file. 

The code generation has been done in Java. If we use java style 
{code}eval(Object... args){code} to call the Scala method, it will raise the 
above exception.

However, I can't always restrict users to use Java to write a UDF/UDTF. Any 
ideas in variable types and variable arguments of Scala UDF/UDTFs to prevent 
the compilation failure?


> UDF/UDTF should support variable types and variable arguments
> -------------------------------------------------------------
>
>                 Key: FLINK-5826
>                 URL: https://issues.apache.org/jira/browse/FLINK-5826
>             Project: Flink
>          Issue Type: Improvement
>            Reporter: Zhuoluo Yang
>            Assignee: Zhuoluo Yang
>
> In some cases, UDF/UDTF should support variable types and variable arguments. 
> Many UDF/UDTF developers wish to make the # of arguments and types flexible 
> to users. They try to make their functions flexible.
> Thus, we should support the following styles of UDF/UDTFs.
> for example 1, in Java
> {code:java}
> public class SimpleUDF extends ScalarFunction {
>       public int eval(Object... args) {
>               // do something
>       }
> }
> {code}
> for example 2, in Scala
> {code}
> class SimpleUDF extends ScalarFunction {
>   def eval(args: Any*): Int = {
>     // do something
>   }
> }
> {code}
> If we modify the code in UserDefinedFunctionUtils.getSignature() and make 
> both signatures pass. The first example will work normally. However, the 
> second example will raise an exception.
> {noformat}
> Caused by: org.codehaus.commons.compiler.CompileException: Line 58, Column 0: 
> No applicable constructor/method found for actual parameters 
> "java.lang.String"; candidates are: "public java.lang.Object 
> test.SimpleUDF.eval(scala.collection.Seq)"
>   at org.codehaus.janino.UnitCompiler.compileError(UnitCompiler.java:11523) 
> ~[janino-3.0.6.jar:?]
>   at 
> org.codehaus.janino.UnitCompiler.findMostSpecificIInvocable(UnitCompiler.java:8679)
>  ~[janino-3.0.6.jar:?]
>   at org.codehaus.janino.UnitCompiler.findIMethod(UnitCompiler.java:8539) 
> ~[janino-3.0.6.jar:?]
> {noformat} 
> The reason is that Scala will do a *sugary* modification to the signature of 
> the method. The mothod {code} def eval(args: Any*){code} will become 
> {code}def eval(args: scala.collection.Seq<Any>){code} in the class file. 
> The code generation has been done in Java. If we use java style 
> {code}eval(Object... args){code} to call the Scala method, it will raise the 
> above exception.
> However, I can't always restrict users to use Java to write a UDF/UDTF. Any 
> ideas in variable types and variable arguments of Scala UDF/UDTFs to prevent 
> the compilation failure?



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to