Closed
Description
UDFs are currently defined for example like:
val stringArrayMerger: UDFWrapper1 = udf.register<WrappedArray<String>, String>("stringArrayMerger") {
it.asIterable().joinToString(" ")
}
They can then be invoked from SQL or directly in code like: stringArrayMerger(testData.col("value"))
.
Obviously the thing I notice is that stringArrayMerger
is typed twice. This can of course be rewritten using delegates :)
This is possible
val stringArrayMerger: UDFWrapper1 by udf.register<WrappedArray<String>, String> {
it.toIterable().asKotlinIterable().joinToString(" ")
}
when adding something like:
class UDFWrapperBuilderDelegate<UDF>(val getValue: (name: String) -> UDF) {
operator fun getValue(
thisRef: Any?,
property: KProperty<*>
): UDF = getValue(property.name)
}
and for each UDF register function:
inline fun <reified T0, reified R> UDFRegistration.register(noinline func: (T0) -> R): UDFWrapperBuilderDelegate<UDFWrapper1> =
UDFWrapperBuilderDelegate { name -> register(name, func) }
inline fun <reified T0, reified T1, reified R> UDFRegistration.register(noinline func: (T0, T1) -> R): UDFWrapperBuilderDelegate<UDFWrapper2> =
UDFWrapperBuilderDelegate { name -> register(name, func) }
...
Just a thought :)
Metadata
Metadata
Assignees
Labels
No labels