incubator-cassandra-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Eric Stevens <migh...@gmail.com>
Subject Re: partition key of composite type and "where partition_key in (...)" clause
Date Wed, 05 Jun 2013 17:18:59 GMT
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 <sorinm@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
>

Mime
View raw message