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

Benjamin Lerer edited comment on CASSANDRA-14344 at 1/22/19 2:28 PM:
---------------------------------------------------------------------

Sorry, for the delay in my response.

What I had in mind was simply to have the {{isSatisfiedBy}} method using 
{{AbstractType.compareForCQL}} to perform the contains check on the ByteBuffer 
values instead of deserializing the complete list each time.

If you add the following method to {{ListSerializer}}:
{code}
    public boolean anyMatch(ByteBuffer serializedList, Predicate<ByteBuffer> 
predicate)
    {
        try
        {
            ByteBuffer input = serializedList.duplicate();
            int limit = input.limit();
            int size = readCollectionSize(input, ProtocolVersion.V3);

            for (int i = 0; i < size; i++)
            {
                int elementSize = input.getInt();
                if (elementSize < 0)
                    continue;

                input.limit(input.position() + elementSize);
                if (predicate.test(input))
                    return true;

                input.limit(limit);
                input.position(input.position() + elementSize);
            }
            return false;
        }
        catch (BufferUnderflowException e)
        {
            throw new MarshalException("Not enough bytes to read a list");
        }
    }
{code} 

Then you can implements {{isSatisfied}} as :
{code}
        public boolean isSatisfiedBy(AbstractType<?> type, ByteBuffer 
leftOperand, ByteBuffer rightOperand)
        {
            ListSerializer<?> serializer = ListType.getInstance(type, 
false).getSerializer();
            return serializer.anyMatch(rightOperand, r -> 
type.compareForCQL(leftOperand, r) == 0);
        }
{code}

The problem with {{null}} can simply be handled by adding a check in the 
{{addRowFilterTo}} method. 




was (Author: blerer):
Sorry, for the delay in my response.

What I had in mind was simply to have the {{isSatisfiedBy}} method using 
{{AbstractType.compareForCQL}} to perform the contains check on instead of 
deserializing the complete list each time.

If you add the following method to {{ListSerializer}}:
{code}
    public boolean anyMatch(ByteBuffer serializedList, Predicate<ByteBuffer> 
predicate)
    {
        try
        {
            ByteBuffer input = serializedList.duplicate();
            int limit = input.limit();
            int size = readCollectionSize(input, ProtocolVersion.V3);

            for (int i = 0; i < size; i++)
            {
                int elementSize = input.getInt();
                if (elementSize < 0)
                    continue;

                input.limit(input.position() + elementSize);
                if (predicate.test(input))
                    return true;

                input.limit(limit);
                input.position(input.position() + elementSize);
            }
            return false;
        }
        catch (BufferUnderflowException e)
        {
            throw new MarshalException("Not enough bytes to read a list");
        }
    }
{code} 

Then you can implements {{isSatisfied}} as :
{code}
        public boolean isSatisfiedBy(AbstractType<?> type, ByteBuffer 
leftOperand, ByteBuffer rightOperand)
        {
            ListSerializer<?> serializer = ListType.getInstance(type, 
false).getSerializer();
            return serializer.anyMatch(rightOperand, r -> 
type.compareForCQL(leftOperand, r) == 0);
        }
{code}

The problem with {{null}} can simply be handled by adding a check in the 
{{addRowFilterTo}} method. 



> Support filtering using IN restrictions
> ---------------------------------------
>
>                 Key: CASSANDRA-14344
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-14344
>             Project: Cassandra
>          Issue Type: New Feature
>          Components: Legacy/CQL
>            Reporter: Dikang Gu
>            Assignee: Venkata Harikrishna Nukala
>            Priority: Major
>             Fix For: 4.x
>
>         Attachments: 14344-trunk-2.txt, 
> 14344-trunk-inexpression-approach-2.txt, 
> 14344-trunk-inexpression-approach.txt, 14344-trunk.txt
>
>
> Support IN filter query like this:
>  
> CREATE TABLE ks1.t1 (
>     key int,
>     col1 int,
>     col2 int,
>     value int,
>     PRIMARY KEY (key, col1, col2)
> ) WITH CLUSTERING ORDER BY (col1 ASC, col2 ASC)
>  
> cqlsh:ks1> select * from t1 where key = 1 and col2 in (1) allow filtering;
>  
>  key | col1 | col2 | value
> -----+------+------+-------
>    1 |    1 |    1 |     1
>    1 |    2 |    1 |     3
>  
> (2 rows)
> cqlsh:ks1> select * from t1 where key = 1 and col2 in (1, 2) allow filtering;
> *{color:#ff0000}InvalidRequest: Error from server: code=2200 [Invalid query] 
> message="IN restrictions are not supported on indexed columns"{color}*
> cqlsh:ks1>



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to