2013-10-09 3 views
2

Astyanax supporte les colonnes composites dans Cassandra à travers ses AnnotatedCompositeSerializer. J'ai une famille de colonne avec les noms de colonnes composite 3-champ, semblable à cet exemple, adaptés à partir Astyanax's documentation (les colonnes ne sont pas réellement sessionId et token, prétendre qu'ils sont à cause de l'argument):Comment faire une requête sur plusieurs préfixes de colonnes composites avec 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(); 

Le problème est : Je veux interroger pour toutes les colonnes avec deux colonnes composites (dans ce cas, sessionId et token) dans le préfixe, pas un seul, et pour tous les horodatages, pas seulement dans une plage. Ceci est clairement possible et facile à faire avec CQL3, mais je suis coincé sur Cassandra 1.0.x et ne trouve pas un moyen qu'Ashyanax acceptera (en appelant deux fois withPrefix(UUID) ou en lui passant une structure de données composite).

Est-il possible de faire cela avec Astyanax? Puis-je en quelque sorte utiliser un RangeBuilder de base et sérialiser le début et la fin manuellement, peut-être?

Répondre

1

Les colonnes de Cassandra sont stockées dans l'ordre. Dans votre exemple, sessionId est le plus significatif, suivi de token, et timestamp est le moins significatif. En d'autres termes, les colonnes sont triées par sessionId, puis par jeton, puis par horodatage. Si je comprends bien, vous essayez d'interroger les colonnes avec un identificateur de session spécifié ainsi qu'un jeton et à tout moment. Pour les raisons ci-dessus, les colonnes avec sessionId et token correspondants sont stockées de manière contiguë. Vous pouvez les interroger avec n'importe quelle date en utilisant les dates min/max de la façon suivante:

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

Mon erreur; J'ai manqué une partie clé de la question, que je ne connais pas les horodateurs de début et de fin et que je veux les obtenir tous. –

+0

Ensuite, définissez startTime et endTime sur null. J'ai modifié le code ci-dessus pour refléter cela. – pscuderi

+1

Cela ne semble pas fonctionner pour moi; Je n'ai pas de colonnes en arrière. :( –

Questions connexes