DOAN DuyHai created CASSANDRA-11052:
---------------------------------------

             Summary: Cannot use Java 8 lambda expression inside UDF code body
                 Key: CASSANDRA-11052
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-11052
             Project: Cassandra
          Issue Type: Bug
          Components: CQL
            Reporter: DOAN DuyHai


When creating the following **UDF** using Java 8 lambda syntax

{code:sql}
 CREATE FUNCTION IF NOT EXISTS music.udf(state map<text,bigint>, styles 
list<text>)
 RETURNS NULL ON NULL INPUT
 RETURNS map<text,bigint>
 LANGUAGE java
 AS $$
   styles.forEach((Object o) -> {
       String style = (String)o;
       if(state.containsKey(style)) {
            state.put(style, (Long)state.get(style)+1);
       } else {
            state.put(style, 1L);   
       }
   });
   
   return state;
 $$;
{code}

 I got the following exception:

{code:java}
Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: Could not 
compile function 'music.udf' from Java source: 
org.apache.cassandra.exceptions.InvalidRequestException: Java source 
compilation failed:
Line 2: The type java.util.function.Consumer cannot be resolved. It is 
indirectly referenced from required .class files
Line 2: The method forEach(Consumer) from the type Iterable refers to the 
missing type Consumer
Line 2: The target type of this expression must be a functional interface

        at 
com.datastax.driver.core.Responses$Error.asException(Responses.java:136)
        at 
com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:179)
        at 
com.datastax.driver.core.RequestHandler.setFinalResult(RequestHandler.java:184)
        at 
com.datastax.driver.core.RequestHandler.access$2500(RequestHandler.java:43)
        at 
com.datastax.driver.core.RequestHandler$SpeculativeExecution.setFinalResult(RequestHandler.java:798)
        at 
com.datastax.driver.core.RequestHandler$SpeculativeExecution.onSet(RequestHandler.java:617)
        at 
com.datastax.driver.core.Connection$Dispatcher.channelRead0(Connection.java:1005)
        at 
com.datastax.driver.core.Connection$Dispatcher.channelRead0(Connection.java:928)
        at 
io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318)
        at 
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304)
        at 
io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:266)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318)
        at 
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304)
        at 
io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318)
        at 
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304)
        at 
io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:276)
        at 
io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:263)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318)
        at 
io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304)
        at 
io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
        at 
io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
        at 
io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
        at 
io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
        at 
io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
        at 
io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
        ... 1 more
{code}

 It looks like the compiler requires importing java.util.Consumer but I have 
checked the source code and compiler options already support Java 8 source code 
so I'm pretty puzzled here ...
/cc [~snazy]



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to