2013-10-09 2 views
2

Astyanax는 AnnotatedCompositeSerializer을 통해 카산드라의 복합 열을 지원합니다. 내가 Astyanax's documentation에서 적응이 예와 유사한 3 필드 복합 열 이름과 열 가족,가 (열이 실제로 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

카산드라의 열은 순서대로 저장됩니다. 귀하의 예에서 sessionId는 가장 중요하고, 그 다음으로 토큰이 있으며, timestamp는 가장 중요하지 않습니다. 즉, 열은 sessionId, 토큰, 시간 소인별로 정렬됩니다.

정확하게 이해하면 지정된 sessionId와 토큰을 사용하여 언제든지 열을 쿼리하려고합니다. 위의 이유로 인해 sessionId와 token이 일치하는 열은 연속적으로 저장됩니다. 다음과 같은 방법으로 최소/최대 날짜를 사용하여 날짜를 쿼리 할 수 ​​있습니다.

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을 null로 설정하십시오. 이를 반영하기 위해 위 코드를 수정했습니다. – pscuderi

+1

그것은 나를 위해 일하지 않는 것 같습니다; 나는 기둥을 돌려받지 않는다. : ( –