Cassandra 部分组合列的范围查询

Cassandra 部分组合列的范围查询,cassandra,composite,astyanax,Cassandra,Composite,Astyanax,我不知道如何使用Astyanax进行所有需要的范围查询。 我试过所解释的,但似乎不起作用 仅供参考,我来自赫克托世界,在那里我把这一切都做得很好,出于我不想解释的原因,我们决定改用Astyanax 我有一个列族,描述如下。请注意“ReversedType”,它允许我们首先获得最新的TimeUUID。这不应该影响其他人,至少对赫克托没有影响: ColumnFamily: mycf Key Validation Class: org.apache.cassandra.db.marshal

我不知道如何使用Astyanax进行所有需要的范围查询。 我试过所解释的,但似乎不起作用

仅供参考,我来自赫克托世界,在那里我把这一切都做得很好,出于我不想解释的原因,我们决定改用Astyanax

我有一个列族,描述如下。请注意“ReversedType”,它允许我们首先获得最新的TimeUUID。这不应该影响其他人,至少对赫克托没有影响:

ColumnFamily: mycf
      Key Validation Class: org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type)
      Default column value validator: org.apache.cassandra.db.marshal.UTF8Type
      Columns sorted by: org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.TimeUUIDType))
以下是它作为Astyanax CF的定义:

public static final CF = new ColumnFamily<Rowkey, Column>(
    NAME,
    new AnnotatedCompositeSerializer<Rowkey>(Rowkey.class),
    new AnnotatedCompositeSerializer<Column>(Column.class),
    StringSerializer.get()
);

public static class Column {
    @Component(ordinal = 0)
    public String    colname        = null;
    @Component(ordinal = 1)
    public UUID        timeUUID    = null;
}

public static class Rowkey {
    @Component(ordinal = 0)
    public String    aid;
    @Component(ordinal = 1)
    public String    cid;
}
以下是我尝试过的三种方法:

# Code 1
keyspace.prepareQuery(columnFamily)
    .getKey(rowkey)
    .withColumnRange(columnStart, columnEnd, false, 10)
    .execute()
    .getResult();

# Code 2
RangeBuilder rangeBuilder = new RangeBuilder()
    .setStart(columnStart, CF.getColumnSerializer())
    .setEnd(columnEnd, CF.getColumnSerializer())
    .setReversed(false)
    .setLimit(10);
keyspace.prepareQuery(columnFamily)
    .getKey(rowkey)
    .withColumnRange(rangeBuilder.build())
    .execute()
    .getResult();

# Code 3
CompositeRangeBuilder rangeBuilder = ((AnnotatedCompositeSerializer<Column>) colSerializer)
    .buildRange()
    .withPrefix(columnStart.colname)
    .greaterThanEquals(columnStart.timeUUID)
    .lessThanEquals(columnEnd.timeUUID)
    .limit(10);
keyspace.prepareQuery(columnFamily)
    .getKey(rowkey)
    .withColumnRange(rangeBuilder.build())
    .execute()
    .getResult();
对于任何类型的colStart和colEnd Being,如果是复合的,则允许在每个组件上定义相等的部分复合


谢谢你的帮助。

我无法使用上述方法完成所有我想做的事情,但我找到了第四种方法,尽管我不喜欢,但它仍然有效

我正在
code 1
中使用
ByteBuffer
版本的
with columnRange
。开始和结束缓冲区使用实际的复合类构建,如下所示:

公共静态ByteBuffer toRangeStart(列表,布尔值反转){
返回toRangeValue(列表,反转?ComponentEquality.GREATER_THAN_EQUAL:ComponentEquality.EQUAL);
}
公共静态ByteBuffer toRangeEnd(列表,布尔值反转){
返回toRangeValue(列表,反向?ComponentEquality.EQUAL:ComponentEquality.GREATER_大于_EQUAL);
}
公共静态ByteBuffer toRangeValue(列表、组件等式){
//我们使用了真正的复合材料,因为我们没有找到任何其他方法来构建这些范围
复合材料c=新复合材料();
int i;
对于(i=0;i
# Code 1
keyspace.prepareQuery(columnFamily)
    .getKey(rowkey)
    .withColumnRange(columnStart, columnEnd, false, 10)
    .execute()
    .getResult();

# Code 2
RangeBuilder rangeBuilder = new RangeBuilder()
    .setStart(columnStart, CF.getColumnSerializer())
    .setEnd(columnEnd, CF.getColumnSerializer())
    .setReversed(false)
    .setLimit(10);
keyspace.prepareQuery(columnFamily)
    .getKey(rowkey)
    .withColumnRange(rangeBuilder.build())
    .execute()
    .getResult();

# Code 3
CompositeRangeBuilder rangeBuilder = ((AnnotatedCompositeSerializer<Column>) colSerializer)
    .buildRange()
    .withPrefix(columnStart.colname)
    .greaterThanEquals(columnStart.timeUUID)
    .lessThanEquals(columnEnd.timeUUID)
    .limit(10);
keyspace.prepareQuery(columnFamily)
    .getKey(rowkey)
    .withColumnRange(rangeBuilder.build())
    .execute()
    .getResult();
MultigetSliceQuery<K, C, V> q = HFactory.createMultigetSliceQuery(connection.getKeyspace(), this.getRowKeySerializer(), this.getColumnNameSerializer(), this.getColumnValueSerializer());
q.setColumnFamily(this.getCfName());
q.setKeys(keys)
q.setRange(colStart, colEnd, reversed, count);
q.execute();