2013-10-09 68 views
2

Astyanax通過其AnnotatedCompositeSerializer支持Cassandra中的複合柱。我有一個列族有3場複合列名,類似這樣的例子,從Astyanax's documentation改編(列實際上不是sessionIdtoken,假裝他們是爲了便於討論):如何使用Astyanax查詢多個組合列前綴?

// Annotated composite class 
public class SessionEvent { 
    @Component(ordinal=0) UUID sessionId; 
    @Component(ordinal=1) UUID token; 
    @Component(ordinal=2) UUID timestamp; 

    public SessionEvent() { } 
} 

static AnnotatedCompositeSerializer<SessionEvent> eventSerializer 
     = new AnnotatedCompositeSerializer<>(SessionEvent.class); 
static ColumnFamily<String, SessionEvent> CF_SESSION_EVENTS 
     = new ColumnFamily<>("SessionEvents", 
          StringSerializer.get(), eventSerializer); 

// Querying cassandra for a column slice on one prefix, but we want two! 
OperationResult<ColumnList<SessionEvent>> result = keyspace.prepareQuery(CF_SESSION_EVENTS) 
    .getKey("UserId1") 
    .withColumnRange(eventSerializer.buildRange() 
     .withPrefix("SessionId1") 
     .build()) 
    .execute(); 

的問題是:我想查詢包含兩個複合列(在這種情況下,包括sessionIdtoken)的所有列中的前綴,而不僅僅是一個,以及所有時間戳,而不僅僅是在一個範圍內。這對於CQL3來說顯然是可能的並且容易做到,但是我卡在Cassandra 1.0.x中,無法找到Astyanax將接受的方式(通過調用withPrefix(UUID)兩次或將它傳遞給複合數據結構)。

有沒有辦法與Astyanax做到這一點?我可以以某種方式使用基本的RangeBuilder並手動序列化開始和結束,也許?

回答

1

Cassandra中的列按順序存儲。在你的例子中,sessionId是最重要的,其次是令牌,時間戳是最不重要的。換句話說,列按照sessionId,token,然後是時間戳排序。

如果我理解正確,您試圖查詢具有指定sessionId以及令牌和任何時間的列。出於上述原因,具有匹配的sessionId和令牌的列是連續存儲的。您可以通過以下方式使用最小/最大日期查詢它們:

startTime = new Date(0); 
endTime = new Date(Long.MAX_VALUE); 

SessionEvent from = new SessionEvent(sessionId, token, startTime); 
SessionEvent to = new SessionEvent(sessionId, token, endTime); 

RangeBuilder rb = new RangeBuilder().setStart(from).setEnd(to); 

OperationResult<ColumnList<SessionEvent>> result = keyspace 
     .prepareQuery(CF_SESSION_EVENTS) 
     .getKey("UserId1") 
     .withColumnRange(rb.build()) 
     .execute(); 
+0

我的錯誤;我錯過了這個問題的一個關鍵部分,我不知道開始和結束時間戳,我想要得到所有這些時間戳。 –

+0

然後只需將startTime和endTime設置爲空。我修改了上面的代碼以反映這一點。 – pscuderi

+1

這似乎不適合我;我沒有收到專欄。 :( –