Skip to content

Define udf using by-delegate? #143

Closed
@Jolanrensen

Description

@Jolanrensen

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions