[ 
https://issues.apache.org/jira/browse/CASSANDRA-7395?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14041923#comment-14041923
 ] 

Robert Stupp commented on CASSANDRA-7395:
-----------------------------------------

bq. Let's not over-think it at first

just have that idea and keep it in mind


I currently have some "spec" for UDF declaration in mind which is not directly 
related to {{Function}} interface. 

A "UDF class scanner" collects all classes annotated with {{@UDFBundle}} and 
all methods annotated with {{@UDF}}. 
Methods' return types and parameter types are mapped to CQL types. Ambigious 
types (like UUID) can be specialized using an annotation parameter but have a 
default mapping (e.g. UUID = timeuuid, String = text).
Primitive Java types would be only allowed as return types. UDF method 
parameter types must use the "object" variant to allow {{null}} handling.
Means: (de)serialization is done outside of the UDF implementation if not 
explicitly requested.
This shall keep the UDF implementation itself "simple" without the need to 
explicitly build (de)serialization code - which may lead to a lot of 
copy-and-paste code in UDFs making them unnecessarily big.

{noformat}
@UDFBundle(name = "foobar")
public class MyUDFs {
    @UDF(
        name = "sin",
        deterministic = true      // flag which can be used later for "function 
based indexes"
    )
    public Double sinForDouble(Double input) {
        return input == null ? null : Math.sin(input);
    }
    @UDF(name = "sin", deterministic=true)
    public Float sinForFloat(Float input) {
        return input == null ? null : Math.sin(input);
    }

    @UDF(
        deterministic = true,
        paramTypes = { "timeuuid" }
    )
    public Date timeuuidToDate(UUID uuid) { ... }

    @UDF(
        deterministic = true,
        paramTypes = { "text" }
    )
    public Integer some(ByteBuffer blob)    // gets "raw" data

    @UDF(
        deterministic = true,
        paramTypes = { "list<timeuuid>" }
    )
    public List<Date> timeuuidToDate(List<UUID> uuid) { ... }

    @UDF(
        name = "mysuperhash",
        deterministic = true
    )
// a UDF that can handle any data type
    public Long someSpecialHashFunctionThatTakesAnyDataType( 
org.apache.cassandra.udf.TypeAndData anyType ) {
        AbstractType type = any.getType();
        ByteBuffer value = any.getValue();
    }
}
{noformat}

Is this something worth to discuss?

> Support for pure user-defined functions (UDF)
> ---------------------------------------------
>
>                 Key: CASSANDRA-7395
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-7395
>             Project: Cassandra
>          Issue Type: New Feature
>          Components: API, Core
>            Reporter: Jonathan Ellis
>             Fix For: 3.0
>
>         Attachments: 7395.diff
>
>
> We have some tickets for various aspects of UDF (CASSANDRA-4914, 
> CASSANDRA-5970, CASSANDRA-4998) but they all suffer from various degrees of 
> ocean-boiling.
> Let's start with something simple: allowing pure user-defined functions in 
> the SELECT clause of a CQL query.  That's it.
> By "pure" I mean, must depend only on the input parameters.  No side effects. 
>  No exposure to C* internals.  Column values in, result out.  
> http://en.wikipedia.org/wiki/Pure_function



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to