On 2013-06-06 11:36, Sylvain Lebresne wrote:
We indeed don't support that kind of syntax. We might someday
(seehttps://issues.apache.org/jira/browse/CASSANDRA-4851
<http://issues.apache.org/jira/browse/CASSANDRA-4851>, even though the
description is more general, this kind of would introduce that kind of
syntax).

*But* another solution is just to do 2 (or more) separate queries
(instead of using a IN). And *no*, in general using a IN will not really
be much faster in that case because Cassandra doesn't really optimize
this kind of IN queries (IN queries on the partition key that is).
Provided you make sure to parallelize the queries client side, it may
even end up being faster in practice because the client will be able to
start processing query responses as they come back.

--
Sylvain


Thank you, Eric and Sylvain.

Sorin


On Wed, Jun 5, 2013 at 7:18 PM, Eric Stevens <migh...@gmail.com
<mailto:migh...@gmail.com>> wrote:

    Hi Sorin,

    I'm not aware of CQL supporting Cartesian set notation, and like you
    when I tried it, the CQL parser bailed at the first parenthesis -
    "*(*k1, k2)"

    You cannot use SELECT in a BATCH statement, see
    http://cassandra.apache.org/doc/cql/CQL.html#BATCH

    So I'm not sure what your options are other than to manually
    composite your K1, K2 pairs into a separate column, /which is part
    of the primary key /(necessary for the IN() clause to work).  If you
    still need to query separately on k1 and/or k2, you can also
    preserve these as independent columns with indices.

    cqlsh:test> drop table tbl;
    cqlsh:test> create table tbl (
             ...   k1k2 text,
             ...   k1 int,
             ...   k2 text,
             ...   k3 text,
             ...   m blob,
             ...   PRIMARY KEY (k1k2, k3)
             ... );
    cqlsh:test> CREATE INDEX ON tbl (k1);
    cqlsh:test> CREATE INDEX ON tbl (k2);
    cqlsh:test>
    cqlsh:test> INSERT INTO tbl (k1, k2, k3, m, k1k2) VALUES (0, 'abc',
    'def', 'deadbeef', '0|abc');
    cqlsh:test> INSERT INTO tbl (k1, k2, k3, m, k1k2) VALUES (1, 'xyz',
    'uvw', '8badf00d', '1|xyz');
    cqlsh:test> SELECT * FROM tbl WHERE k1k2 IN ('0|abc','1|xyz');

      k1k2  | k3  | k1 | k2  | m
    -------+-----+----+-----+------------
      0|abc | def |  0 | abc | 0xdeadbeef
      1|xyz | uvw |  1 | xyz | 0x8badf00d

    cqlsh:test> SELECT * FROM tbl WHERE k1=0;

      k1k2  | k3  | k1 | k2  | m
    -------+-----+----+-----+------------
      0|abc | def |  0 | abc | 0xdeadbeef


    -Eric Stevens
    ProtectWise, Inc.



    On Wed, Jun 5, 2013 at 9:29 AM, Sorin Manolache <sor...@gmail.com
    <mailto:sor...@gmail.com>> wrote:

        Hello,

        Is it possible to use the "where partition_key in (...)" clause
        if the partition key has a composite type?

        I have a schema as follows:

        create table tbl (
            k1 int,
            k2 varchar,
            k3 varchar,
            m blob,
            primary key((k1, k2), k3)
        )

        I would like to be able to do something like

        select m from tbl where (k1, k2) in ((0, 'abc'), (1, 'xyz'));

        I think though that I'll have to use the more verbose

        begin unlogged batch
        select m from tbl where k1=0 and k2='abc'
        select m from tbl where k1=1 and k2='xyz'
        apply batch;

        Thanks,
        Sorin




Reply via email to