Hi,

In my new project, I want to create a wide row CF with indexes in CQL3.

In my project, users can store multipurpose data and backed to Cassandra.

For example, my Profile CF has some user-defined properties as wide row.
And users can add indexes on columns which they want.
Of cource, we can create such a CF easily on Thrift as below.

=============================================================
[default] create column family profile_thrift
  with comparator = 'UTF8Type'
  and default_validation_class = 'UTF8Type'
  and key_validation_class = 'UTF8Type';

[default] update column family profile_thrift with column_metadata =
        [{
        column_name : gender,
        validation_class : UTF8Type,
        index_type : 0,
        index_name : idx_gender
    }];

[default] get profile_thrift where gender='m';
-------------------
RowKey: user002
=> (name=age, value=33, timestamp=1382524511829000)
=> (name=gender, value=m, timestamp=1382524519270000)
=> (name=name, value=bob, timestamp=1382524503605000)
-------------------
RowKey: user003
=> (name=gender, value=m, timestamp=1382524887595000)
=> (name=hobby, value=driving, timestamp=1382524567386000)
=> (name=name, value=charlie, timestamp=1382524545710000)

2 Rows Returned.
Elapsed time: 39 msec(s).

=============================================================

But now, Thrift looks likely to obsoleted sooner or later and I hesitate to 
adopt it to new project now.
 (cf. http://www.mail-archive.com/dev@cassandra.apache.org/msg06560.html )

Although I don't have any idea how create such a table in CQL3.
I can create wide row tables with index in CQL3 on *ALL* columns of profile.
I think it's too much. 
So I want to index on *specified* column.

=============================================================
CREATE TABLE profile_CQL3 (
  id text,
  column text,
  value text,
  PRIMARY KEY (id, column)
);
CREATE INDEX idx_profile_val ON profile_CQL3 (value);

INSERT INTO profile_CQL3 (id,column,value) VALUES('user001', name','alice');
INSERT INTO profile_CQL3 (id,column,value) VALUES('user001','age','18');
INSERT INTO profile_CQL3 (id,column,value) VALUES('user001','gender','f');

INSERT INTO profile_CQL3 (id,column,value) VALUES('user002', name','bob');
INSERT INTO profile_CQL3 (id,column,value) VALUES('user002','age','33');
INSERT INTO profile_CQL3 (id,column,value) VALUES('user002','gender','m');

INSERT INTO profile_CQL3 (id,column,value) VALUES('user003', name','charlie');
INSERT INTO profile_CQL3 (id,column,value) VALUES('user003','hobby','driving')
INSERT INTO profile_CQL3 (id,column,value) VALUES('user003','gender','m');

select * from profile_CQL3 where value='m' and column='gender';
=============================================================

So, do you know some good way to do this on CQL3? or should I adopt Thrift in 
this project?

(User-profile is just a example. we would like to provide versatile datastore 
which have property like this (i.e like thrift-api).)

Thanks.

Reply via email to