Repository: spark
Updated Branches:
  refs/heads/branch-1.3 298ef5ba4 -> b22d5b5f8


http://git-wip-us.apache.org/repos/asf/spark/blob/b22d5b5f/sql/core/src/main/scala/org/apache/spark/sql/UdfRegistration.scala
----------------------------------------------------------------------
diff --git a/sql/core/src/main/scala/org/apache/spark/sql/UdfRegistration.scala 
b/sql/core/src/main/scala/org/apache/spark/sql/UdfRegistration.scala
deleted file mode 100644
index 1beb194..0000000
--- a/sql/core/src/main/scala/org/apache/spark/sql/UdfRegistration.scala
+++ /dev/null
@@ -1,774 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.spark.sql
-
-import java.util.{List => JList, Map => JMap}
-
-import scala.reflect.runtime.universe.TypeTag
-
-import org.apache.spark.{Accumulator, Logging}
-import org.apache.spark.api.python.PythonBroadcast
-import org.apache.spark.broadcast.Broadcast
-import org.apache.spark.sql.api.java._
-import org.apache.spark.sql.catalyst.ScalaReflection
-import org.apache.spark.sql.catalyst.expressions.{Expression, ScalaUdf}
-import org.apache.spark.sql.execution.PythonUDF
-import org.apache.spark.sql.types.DataType
-
-
-/**
- * Functions for registering user-defined functions.
- */
-class UDFRegistration(sqlContext: SQLContext) extends Logging {
-
-  private val functionRegistry = sqlContext.functionRegistry
-
-  protected[sql] def registerPython(
-      name: String,
-      command: Array[Byte],
-      envVars: JMap[String, String],
-      pythonIncludes: JList[String],
-      pythonExec: String,
-      broadcastVars: JList[Broadcast[PythonBroadcast]],
-      accumulator: Accumulator[JList[Array[Byte]]],
-      stringDataType: String): Unit = {
-    log.debug(
-      s"""
-        | Registering new PythonUDF:
-        | name: $name
-        | command: ${command.toSeq}
-        | envVars: $envVars
-        | pythonIncludes: $pythonIncludes
-        | pythonExec: $pythonExec
-        | dataType: $stringDataType
-      """.stripMargin)
-
-
-    val dataType = sqlContext.parseDataType(stringDataType)
-
-    def builder(e: Seq[Expression]) =
-      PythonUDF(
-        name,
-        command,
-        envVars,
-        pythonIncludes,
-        pythonExec,
-        broadcastVars,
-        accumulator,
-        dataType,
-        e)
-
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  // scalastyle:off
-
-  /* registerFunction 0-22 were generated by this script
-
-    (0 to 22).map { x =>
-      val types = (1 to x).foldRight("RT")((i, s) => {s"A$i, $s"})
-      val typeTags = (1 to x).map(i => s"A${i}: TypeTag").foldLeft("RT: 
TypeTag")(_ + ", " + _)
-      val argDocs = (1 to x).map(i => s"         * @tparam A$i type of the UDF 
argument at position $i.").foldLeft("")(_ + "\n" + _)
-      println(s"""
-        /**
-         * Register a Scala closure of ${x} arguments as user-defined function 
(UDF).
-         * @tparam RT return type of UDF.$argDocs
-         */
-        def register[$typeTags](name: String, func: Function$x[$types]): Unit 
= {
-          def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-          functionRegistry.registerFunction(name, builder)
-        }""")
-    }
-
-    (1 to 22).foreach { i =>
-      val extTypeArgs = (1 to i).map(_ => "_").mkString(", ")
-      val anyTypeArgs = (1 to i).map(_ => "Any").mkString(", ")
-      val anyCast = s".asInstanceOf[UDF$i[$anyTypeArgs, Any]]"
-      val anyParams = (1 to i).map(_ => "_: Any").mkString(", ")
-      println(s"""
-         |/**
-         | * Register a user-defined function with ${i} arguments.
-         | */
-         |def register(name: String, f: UDF$i[$extTypeArgs, _], returnType: 
DataType) = {
-         |  functionRegistry.registerFunction(
-         |    name,
-         |    (e: Seq[Expression]) => ScalaUdf(f$anyCast.call($anyParams), 
returnType, e))
-         |}""".stripMargin)
-    }
-    */
-
-  /**
-   * Register a Scala closure of 0 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   */
-  def register[RT: TypeTag](name: String, func: Function0[RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 1 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   */
-  def register[RT: TypeTag, A1: TypeTag](name: String, func: Function1[A1, 
RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 2 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag](name: String, func: 
Function2[A1, A2, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 3 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag](name: 
String, func: Function3[A1, A2, A3, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 4 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag](name: String, func: Function4[A1, A2, A3, A4, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 5 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag](name: String, func: Function5[A1, A2, A3, A4, A5, RT]): 
Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 6 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag](name: String, func: Function6[A1, A2, A3, 
A4, A5, A6, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 7 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag](name: String, func: 
Function7[A1, A2, A3, A4, A5, A6, A7, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 8 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag](name: String, 
func: Function8[A1, A2, A3, A4, A5, A6, A7, A8, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 9 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag](name: 
String, func: Function9[A1, A2, A3, A4, A5, A6, A7, A8, A9, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 10 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   * @tparam A10 type of the UDF argument at position 10.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag, A10: 
TypeTag](name: String, func: Function10[A1, A2, A3, A4, A5, A6, A7, A8, A9, 
A10, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 11 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   * @tparam A10 type of the UDF argument at position 10.
-   * @tparam A11 type of the UDF argument at position 11.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag, A10: 
TypeTag, A11: TypeTag](name: String, func: Function11[A1, A2, A3, A4, A5, A6, 
A7, A8, A9, A10, A11, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 12 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   * @tparam A10 type of the UDF argument at position 10.
-   * @tparam A11 type of the UDF argument at position 11.
-   * @tparam A12 type of the UDF argument at position 12.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag, A10: 
TypeTag, A11: TypeTag, A12: TypeTag](name: String, func: Function12[A1, A2, A3, 
A4, A5, A6, A7, A8, A9, A10, A11, A12, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 13 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   * @tparam A10 type of the UDF argument at position 10.
-   * @tparam A11 type of the UDF argument at position 11.
-   * @tparam A12 type of the UDF argument at position 12.
-   * @tparam A13 type of the UDF argument at position 13.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag, A10: 
TypeTag, A11: TypeTag, A12: TypeTag, A13: TypeTag](name: String, func: 
Function13[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, RT]): Unit = 
{
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 14 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   * @tparam A10 type of the UDF argument at position 10.
-   * @tparam A11 type of the UDF argument at position 11.
-   * @tparam A12 type of the UDF argument at position 12.
-   * @tparam A13 type of the UDF argument at position 13.
-   * @tparam A14 type of the UDF argument at position 14.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag, A10: 
TypeTag, A11: TypeTag, A12: TypeTag, A13: TypeTag, A14: TypeTag](name: String, 
func: Function14[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, 
RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 15 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   * @tparam A10 type of the UDF argument at position 10.
-   * @tparam A11 type of the UDF argument at position 11.
-   * @tparam A12 type of the UDF argument at position 12.
-   * @tparam A13 type of the UDF argument at position 13.
-   * @tparam A14 type of the UDF argument at position 14.
-   * @tparam A15 type of the UDF argument at position 15.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag, A10: 
TypeTag, A11: TypeTag, A12: TypeTag, A13: TypeTag, A14: TypeTag, A15: 
TypeTag](name: String, func: Function15[A1, A2, A3, A4, A5, A6, A7, A8, A9, 
A10, A11, A12, A13, A14, A15, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 16 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   * @tparam A10 type of the UDF argument at position 10.
-   * @tparam A11 type of the UDF argument at position 11.
-   * @tparam A12 type of the UDF argument at position 12.
-   * @tparam A13 type of the UDF argument at position 13.
-   * @tparam A14 type of the UDF argument at position 14.
-   * @tparam A15 type of the UDF argument at position 15.
-   * @tparam A16 type of the UDF argument at position 16.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag, A10: 
TypeTag, A11: TypeTag, A12: TypeTag, A13: TypeTag, A14: TypeTag, A15: TypeTag, 
A16: TypeTag](name: String, func: Function16[A1, A2, A3, A4, A5, A6, A7, A8, 
A9, A10, A11, A12, A13, A14, A15, A16, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 17 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   * @tparam A10 type of the UDF argument at position 10.
-   * @tparam A11 type of the UDF argument at position 11.
-   * @tparam A12 type of the UDF argument at position 12.
-   * @tparam A13 type of the UDF argument at position 13.
-   * @tparam A14 type of the UDF argument at position 14.
-   * @tparam A15 type of the UDF argument at position 15.
-   * @tparam A16 type of the UDF argument at position 16.
-   * @tparam A17 type of the UDF argument at position 17.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag, A10: 
TypeTag, A11: TypeTag, A12: TypeTag, A13: TypeTag, A14: TypeTag, A15: TypeTag, 
A16: TypeTag, A17: TypeTag](name: String, func: Function17[A1, A2, A3, A4, A5, 
A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 18 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   * @tparam A10 type of the UDF argument at position 10.
-   * @tparam A11 type of the UDF argument at position 11.
-   * @tparam A12 type of the UDF argument at position 12.
-   * @tparam A13 type of the UDF argument at position 13.
-   * @tparam A14 type of the UDF argument at position 14.
-   * @tparam A15 type of the UDF argument at position 15.
-   * @tparam A16 type of the UDF argument at position 16.
-   * @tparam A17 type of the UDF argument at position 17.
-   * @tparam A18 type of the UDF argument at position 18.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag, A10: 
TypeTag, A11: TypeTag, A12: TypeTag, A13: TypeTag, A14: TypeTag, A15: TypeTag, 
A16: TypeTag, A17: TypeTag, A18: TypeTag](name: String, func: Function18[A1, 
A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, 
RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 19 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   * @tparam A10 type of the UDF argument at position 10.
-   * @tparam A11 type of the UDF argument at position 11.
-   * @tparam A12 type of the UDF argument at position 12.
-   * @tparam A13 type of the UDF argument at position 13.
-   * @tparam A14 type of the UDF argument at position 14.
-   * @tparam A15 type of the UDF argument at position 15.
-   * @tparam A16 type of the UDF argument at position 16.
-   * @tparam A17 type of the UDF argument at position 17.
-   * @tparam A18 type of the UDF argument at position 18.
-   * @tparam A19 type of the UDF argument at position 19.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag, A10: 
TypeTag, A11: TypeTag, A12: TypeTag, A13: TypeTag, A14: TypeTag, A15: TypeTag, 
A16: TypeTag, A17: TypeTag, A18: TypeTag, A19: TypeTag](name: String, func: 
Function19[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, 
A16, A17, A18, A19, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 20 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   * @tparam A10 type of the UDF argument at position 10.
-   * @tparam A11 type of the UDF argument at position 11.
-   * @tparam A12 type of the UDF argument at position 12.
-   * @tparam A13 type of the UDF argument at position 13.
-   * @tparam A14 type of the UDF argument at position 14.
-   * @tparam A15 type of the UDF argument at position 15.
-   * @tparam A16 type of the UDF argument at position 16.
-   * @tparam A17 type of the UDF argument at position 17.
-   * @tparam A18 type of the UDF argument at position 18.
-   * @tparam A19 type of the UDF argument at position 19.
-   * @tparam A20 type of the UDF argument at position 20.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag, A10: 
TypeTag, A11: TypeTag, A12: TypeTag, A13: TypeTag, A14: TypeTag, A15: TypeTag, 
A16: TypeTag, A17: TypeTag, A18: TypeTag, A19: TypeTag, A20: TypeTag](name: 
String, func: Function20[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, 
A13, A14, A15, A16, A17, A18, A19, A20, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 21 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   * @tparam A10 type of the UDF argument at position 10.
-   * @tparam A11 type of the UDF argument at position 11.
-   * @tparam A12 type of the UDF argument at position 12.
-   * @tparam A13 type of the UDF argument at position 13.
-   * @tparam A14 type of the UDF argument at position 14.
-   * @tparam A15 type of the UDF argument at position 15.
-   * @tparam A16 type of the UDF argument at position 16.
-   * @tparam A17 type of the UDF argument at position 17.
-   * @tparam A18 type of the UDF argument at position 18.
-   * @tparam A19 type of the UDF argument at position 19.
-   * @tparam A20 type of the UDF argument at position 20.
-   * @tparam A21 type of the UDF argument at position 21.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag, A10: 
TypeTag, A11: TypeTag, A12: TypeTag, A13: TypeTag, A14: TypeTag, A15: TypeTag, 
A16: TypeTag, A17: TypeTag, A18: TypeTag, A19: TypeTag, A20: TypeTag, A21: 
TypeTag](name: String, func: Function21[A1, A2, A3, A4, A5, A6, A7, A8, A9, 
A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a Scala closure of 22 arguments as user-defined function (UDF).
-   * @tparam RT return type of UDF.
-   * @tparam A1 type of the UDF argument at position 1.
-   * @tparam A2 type of the UDF argument at position 2.
-   * @tparam A3 type of the UDF argument at position 3.
-   * @tparam A4 type of the UDF argument at position 4.
-   * @tparam A5 type of the UDF argument at position 5.
-   * @tparam A6 type of the UDF argument at position 6.
-   * @tparam A7 type of the UDF argument at position 7.
-   * @tparam A8 type of the UDF argument at position 8.
-   * @tparam A9 type of the UDF argument at position 9.
-   * @tparam A10 type of the UDF argument at position 10.
-   * @tparam A11 type of the UDF argument at position 11.
-   * @tparam A12 type of the UDF argument at position 12.
-   * @tparam A13 type of the UDF argument at position 13.
-   * @tparam A14 type of the UDF argument at position 14.
-   * @tparam A15 type of the UDF argument at position 15.
-   * @tparam A16 type of the UDF argument at position 16.
-   * @tparam A17 type of the UDF argument at position 17.
-   * @tparam A18 type of the UDF argument at position 18.
-   * @tparam A19 type of the UDF argument at position 19.
-   * @tparam A20 type of the UDF argument at position 20.
-   * @tparam A21 type of the UDF argument at position 21.
-   * @tparam A22 type of the UDF argument at position 22.
-   */
-  def register[RT: TypeTag, A1: TypeTag, A2: TypeTag, A3: TypeTag, A4: 
TypeTag, A5: TypeTag, A6: TypeTag, A7: TypeTag, A8: TypeTag, A9: TypeTag, A10: 
TypeTag, A11: TypeTag, A12: TypeTag, A13: TypeTag, A14: TypeTag, A15: TypeTag, 
A16: TypeTag, A17: TypeTag, A18: TypeTag, A19: TypeTag, A20: TypeTag, A21: 
TypeTag, A22: TypeTag](name: String, func: Function22[A1, A2, A3, A4, A5, A6, 
A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, 
RT]): Unit = {
-    def builder(e: Seq[Expression]) = ScalaUdf(func, 
ScalaReflection.schemaFor[RT].dataType, e)
-    functionRegistry.registerFunction(name, builder)
-  }
-
-  /**
-   * Register a user-defined function with 1 arguments.
-   */
-  def register(name: String, f: UDF1[_, _], returnType: DataType) = {
-    functionRegistry.registerFunction(
-      name,
-      (e: Seq[Expression]) => ScalaUdf(f.asInstanceOf[UDF1[Any, Any]].call(_: 
Any), returnType, e))
-  }
-
-  /**
-   * Register a user-defined function with 2 arguments.
-   */
-  def register(name: String, f: UDF2[_, _, _], returnType: DataType) = {
-    functionRegistry.registerFunction(
-      name,
-      (e: Seq[Expression]) => ScalaUdf(f.asInstanceOf[UDF2[Any, Any, 
Any]].call(_: Any, _: Any), returnType, e))
-  }
-
-  /**
-   * Register a user-defined function with 3 arguments.
-   */
-  def register(name: String, f: UDF3[_, _, _, _], returnType: DataType) = {
-    functionRegistry.registerFunction(
-      name,
-      (e: Seq[Expression]) => ScalaUdf(f.asInstanceOf[UDF3[Any, Any, Any, 
Any]].call(_: Any, _: Any, _: Any), returnType, e))
-  }
-
-  /**
-   * Register a user-defined function with 4 arguments.
-   */
-  def register(name: String, f: UDF4[_, _, _, _, _], returnType: DataType) = {
-    functionRegistry.registerFunction(
-      name,
-      (e: Seq[Expression]) => ScalaUdf(f.asInstanceOf[UDF4[Any, Any, Any, Any, 
Any]].call(_: Any, _: Any, _: Any, _: Any), returnType, e))
-  }
-
-  /**
-   * Register a user-defined function with 5 arguments.
-   */
-  def register(name: String, f: UDF5[_, _, _, _, _, _], returnType: DataType) 
= {
-    functionRegistry.registerFunction(
-      name,
-      (e: Seq[Expression]) => ScalaUdf(f.asInstanceOf[UDF5[Any, Any, Any, Any, 
Any, Any]].call(_: Any, _: Any, _: Any, _: Any, _: Any), returnType, e))
-  }
-
-  /**
-   * Register a user-defined function with 6 arguments.
-   */
-  def register(name: String, f: UDF6[_, _, _, _, _, _, _], returnType: 
DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 7 arguments.
-   */
-  def register(name: String, f: UDF7[_, _, _, _, _, _, _, _], returnType: 
DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 8 arguments.
-   */
-  def register(name: String, f: UDF8[_, _, _, _, _, _, _, _, _], returnType: 
DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 9 arguments.
-   */
-  def register(name: String, f: UDF9[_, _, _, _, _, _, _, _, _, _], 
returnType: DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 10 arguments.
-   */
-  def register(name: String, f: UDF10[_, _, _, _, _, _, _, _, _, _, _], 
returnType: DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 11 arguments.
-   */
-  def register(name: String, f: UDF11[_, _, _, _, _, _, _, _, _, _, _, _], 
returnType: DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 12 arguments.
-   */
-  def register(name: String, f: UDF12[_, _, _, _, _, _, _, _, _, _, _, _, _], 
returnType: DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 13 arguments.
-   */
-  def register(name: String, f: UDF13[_, _, _, _, _, _, _, _, _, _, _, _, _, 
_], returnType: DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 14 arguments.
-   */
-  def register(name: String, f: UDF14[_, _, _, _, _, _, _, _, _, _, _, _, _, 
_, _], returnType: DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 15 arguments.
-   */
-  def register(name: String, f: UDF15[_, _, _, _, _, _, _, _, _, _, _, _, _, 
_, _, _], returnType: DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 16 arguments.
-   */
-  def register(name: String, f: UDF16[_, _, _, _, _, _, _, _, _, _, _, _, _, 
_, _, _, _], returnType: DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 17 arguments.
-   */
-  def register(name: String, f: UDF17[_, _, _, _, _, _, _, _, _, _, _, _, _, 
_, _, _, _, _], returnType: DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 18 arguments.
-   */
-  def register(name: String, f: UDF18[_, _, _, _, _, _, _, _, _, _, _, _, _, 
_, _, _, _, _, _], returnType: DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 19 arguments.
-   */
-  def register(name: String, f: UDF19[_, _, _, _, _, _, _, _, _, _, _, _, _, 
_, _, _, _, _, _, _], returnType: DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 20 arguments.
-   */
-  def register(name: String, f: UDF20[_, _, _, _, _, _, _, _, _, _, _, _, _, 
_, _, _, _, _, _, _, _], returnType: DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 21 arguments.
-   */
-  def register(name: String, f: UDF21[_, _, _, _, _, _, _, _, _, _, _, _, _, 
_, _, _, _, _, _, _, _, _], returnType: DataType) = {
-    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))
-  }
-
-  /**
-   * Register a user-defined function with 22 arguments.
-   */
-  def register(name: String, f: UDF22[_, _, _, _, _, _, _, _, _, _, _, _, _, 
_, _, _, _, _, _, _, _, _, _], returnType: DataType) = {
-    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))
-  }
-
-  // scalastyle:on
-}

http://git-wip-us.apache.org/repos/asf/spark/blob/b22d5b5f/sql/core/src/main/scala/org/apache/spark/sql/UserDefinedFunction.scala
----------------------------------------------------------------------
diff --git 
a/sql/core/src/main/scala/org/apache/spark/sql/UserDefinedFunction.scala 
b/sql/core/src/main/scala/org/apache/spark/sql/UserDefinedFunction.scala
new file mode 100644
index 0000000..8d7c2a1
--- /dev/null
+++ b/sql/core/src/main/scala/org/apache/spark/sql/UserDefinedFunction.scala
@@ -0,0 +1,39 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*    http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package org.apache.spark.sql
+
+import org.apache.spark.sql.catalyst.expressions.ScalaUdf
+import org.apache.spark.sql.types.DataType
+
+/**
+ * A user-defined function. To create one, use the `udf` functions in [[Dsl]].
+ * As an example:
+ * {{{
+ *   // Defined a UDF that returns true or false based on some numeric score.
+ *   val predict = udf((score: Double) => if (score > 0.5) true else false)
+ *
+ *   // Projects a column that adds a prediction column based on the score 
column.
+ *   df.select( predict(df("score")) )
+ * }}}
+ */
+case class UserDefinedFunction(f: AnyRef, dataType: DataType) {
+
+  def apply(exprs: Column*): Column = {
+    Column(ScalaUdf(f, dataType, exprs.map(_.expr)))
+  }
+}

http://git-wip-us.apache.org/repos/asf/spark/blob/b22d5b5f/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala
----------------------------------------------------------------------
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala 
b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala
index f6b65a8..19d4f34 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala
@@ -21,7 +21,7 @@ import org.apache.spark.sql.Dsl._
 import org.apache.spark.sql.types._
 
 /* Implicits */
-import org.apache.spark.sql.test.TestSQLContext._
+import org.apache.spark.sql.test.TestSQLContext.{createDataFrame, 
logicalPlanToSparkQuery}
 
 import scala.language.postfixOps
 
@@ -280,11 +280,11 @@ class DataFrameSuite extends QueryTest {
   }
 
   test("udf") {
-    val foo = (a: Int, b: String) => a.toString + b
+    val foo = udf((a: Int, b: String) => a.toString + b)
 
     checkAnswer(
       // SELECT *, foo(key, value) FROM testData
-      testData.select($"*", callUDF(foo, 'key, 'value)).limit(3),
+      testData.select($"*", foo('key, 'value)).limit(3),
       Row(1, "1", "11") :: Row(2, "2", "22") :: Row(3, "3", "33") :: Nil
     )
   }

http://git-wip-us.apache.org/repos/asf/spark/blob/b22d5b5f/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
----------------------------------------------------------------------
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala 
b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
index 0501b47..8f3d426 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
@@ -19,6 +19,7 @@ package org.apache.spark.sql
 
 import java.util.TimeZone
 
+import org.apache.spark.sql.test.TestSQLContext
 import org.scalatest.BeforeAndAfterAll
 
 import org.apache.spark.sql.Dsl._
@@ -26,9 +27,8 @@ import org.apache.spark.sql.catalyst.errors.TreeNodeException
 import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan
 import org.apache.spark.sql.types._
 
-/* Implicits */
 import org.apache.spark.sql.TestData._
-import org.apache.spark.sql.test.TestSQLContext._
+import org.apache.spark.sql.test.TestSQLContext.{udf => _, _}
 
 
 class SQLQuerySuite extends QueryTest with BeforeAndAfterAll {
@@ -794,7 +794,7 @@ class SQLQuerySuite extends QueryTest with 
BeforeAndAfterAll {
   }
 
   test("SPARK-3371 Renaming a function expression with group by gives error") {
-    udf.register("len", (s: String) => s.length)
+    TestSQLContext.udf.register("len", (s: String) => s.length)
     checkAnswer(
       sql("SELECT len(value) as temp FROM testData WHERE key = 1 group by 
len(value)"),
       Row(1))

http://git-wip-us.apache.org/repos/asf/spark/blob/b22d5b5f/sql/core/src/test/scala/org/apache/spark/sql/UserDefinedTypeSuite.scala
----------------------------------------------------------------------
diff --git 
a/sql/core/src/test/scala/org/apache/spark/sql/UserDefinedTypeSuite.scala 
b/sql/core/src/test/scala/org/apache/spark/sql/UserDefinedTypeSuite.scala
index 0696a23..117a511 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/UserDefinedTypeSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/UserDefinedTypeSuite.scala
@@ -21,7 +21,8 @@ import scala.beans.{BeanInfo, BeanProperty}
 
 import org.apache.spark.rdd.RDD
 import org.apache.spark.sql.Dsl._
-import org.apache.spark.sql.test.TestSQLContext._
+import org.apache.spark.sql.test.TestSQLContext
+import org.apache.spark.sql.test.TestSQLContext.{udf => _, _}
 import org.apache.spark.sql.types._
 
 
@@ -83,7 +84,7 @@ class UserDefinedTypeSuite extends QueryTest {
   }
 
   test("UDTs and UDFs") {
-    udf.register("testType", (d: MyDenseVector) => 
d.isInstanceOf[MyDenseVector])
+    TestSQLContext.udf.register("testType", (d: MyDenseVector) => 
d.isInstanceOf[MyDenseVector])
     pointsRDD.registerTempTable("points")
     checkAnswer(
       sql("SELECT testType(features) from points"),


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org
For additional commands, e-mail: commits-h...@spark.apache.org

Reply via email to