-
Notifications
You must be signed in to change notification settings - Fork 28.9k
[SPARK-9435][SQL] Reuse function in Java UDF to correctly support expressions that require equality comparison between ScalaUDF #16553
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
30ed14f
3dea44f
2ea071a
0d5b586
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -109,9 +109,10 @@ class UDFRegistration private[sql] (functionRegistry: FunctionRegistry) extends | |
| | * @since 1.3.0 | ||
| | */ | ||
| |def register(name: String, f: UDF$i[$extTypeArgs, _], returnType: DataType): Unit = { | ||
| | val func = f$anyCast.call($anyParams) | ||
| | functionRegistry.registerFunction( | ||
| | name, | ||
| | (e: Seq[Expression]) => ScalaUDF(f$anyCast.call($anyParams), returnType, e)) | ||
| | (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| |}""".stripMargin) | ||
| } | ||
| */ | ||
|
|
@@ -488,219 +489,241 @@ class UDFRegistration private[sql] (functionRegistry: FunctionRegistry) extends | |
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF1[_, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF1[Any, Any]].call(_: Any) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There is commented out code above thats used to generate these functions. We should update it or delete it.
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah, sure. Thanks! |
||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF1[Any, Any]].call(_: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 2 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF2[_, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF2[Any, Any, Any]].call(_: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF2[Any, Any, Any]].call(_: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 3 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF3[_, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF3[Any, Any, Any, Any]].call(_: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF3[Any, Any, Any, Any]].call(_: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 4 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF4[_, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF4[Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF4[Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 5 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF5[_, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF5[Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF5[Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 6 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF6[_, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF6[Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF6[Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 7 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF7[_, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF7[Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF7[Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 8 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF8[_, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF8[Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF8[Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 9 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF9[_, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF9[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF9[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 10 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF10[_, _, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF10[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF10[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 11 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF11[_, _, _, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF11[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF11[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 12 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF12[_, _, _, _, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF12[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF12[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 13 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF13[_, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF13[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF13[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 14 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF14[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF14[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF14[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 15 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF15[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF15[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF15[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 16 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF16[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF16[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF16[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 17 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF17[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF17[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF17[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 18 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF18[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF18[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF18[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 19 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF19[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF19[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF19[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 20 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF20[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF20[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF20[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 21 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF21[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF21[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF21[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| /** | ||
| * Register a user-defined function with 22 arguments. | ||
| * @since 1.3.0 | ||
| */ | ||
| def register(name: String, f: UDF22[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType: DataType): Unit = { | ||
| val func = f.asInstanceOf[UDF22[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any) | ||
| functionRegistry.registerFunction( | ||
| name, | ||
| (e: Seq[Expression]) => ScalaUDF(f.asInstanceOf[UDF22[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any, _: Any), returnType, e)) | ||
| (e: Seq[Expression]) => ScalaUDF(func, returnType, e)) | ||
| } | ||
|
|
||
| // scalastyle:on line.size.limit | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -18,6 +18,7 @@ | |
| package test.org.apache.spark.sql; | ||
|
|
||
| import java.io.Serializable; | ||
| import java.util.List; | ||
|
|
||
| import org.junit.After; | ||
| import org.junit.Assert; | ||
|
|
@@ -108,4 +109,25 @@ public void udf3Test() { | |
| result = spark.sql("SELECT stringLengthTest('test', 'test2')").head(); | ||
| Assert.assertEquals(9, result.getInt(0)); | ||
| } | ||
|
|
||
| @SuppressWarnings("unchecked") | ||
| @Test | ||
| public void udf4Test() { | ||
| spark.udf().register("inc", new UDF1<Long, Long>() { | ||
| @Override | ||
| public Long call(Long i) { | ||
| return i + 1; | ||
| } | ||
| }, DataTypes.LongType); | ||
|
|
||
| spark.range(10).toDF("x").createOrReplaceTempView("tmp"); | ||
| // This tests when Java UDFs are required to be the semantically same (See SPARK-9435). | ||
| List<Row> results = spark.sql("SELECT inc(x) FROM tmp GROUP BY inc(x)").collectAsList(); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This test is not so obvious what it goes to test for. Can we add few comments showing that?
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure, makes sense. Thanks! |
||
| Assert.assertEquals(10, results.size()); | ||
| long sum = 0; | ||
| for (Row result : results) { | ||
| sum += result.getLong(0); | ||
| } | ||
| Assert.assertEquals(55, sum); | ||
| } | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I verified this by overwriting the current changes after copying and pasting and checking no diff.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can confirm they are the same.