Как запросить несколько префиксов составных столбцов с помощью Astyanax?

Astyanax поддерживает составные столбцы в Cassandra через файл AnnotatedCompositeSerializer. У меня есть семейство столбцов с составными именами столбцов из 3 полей, аналогично этому примеру, адаптированному из Astyanax. документация (столбцы на самом деле не sessionId и token, притворитесь, что это так):

// 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();

Проблема в том, что я хочу запросить все столбцы с двумя составными столбцами (в данном случае и sessionId, и token) в префиксе, а не только один, и для всех временных меток, а не только в пределах диапазона. Это вполне возможно и легко сделать с помощью CQL3, но я застрял на Cassandra 1.0.x и не могу найти способ, который принял бы Astyanax (либо дважды вызвав withPrefix(UUID), либо передав ему составную структуру данных).

Есть ли способ сделать это с Astyanax? Могу ли я как-то использовать базовый RangeBuilder и, возможно, сериализовать начало и конец вручную?


person Michael Louis Thaler    schedule 09.10.2013    source источник


Ответы (1)


Столбцы в Cassandra хранятся по порядку. В вашем примере 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();
person pscuderi    schedule 10.10.2013
comment
Моя ошибка; Я пропустил ключевую часть вопроса, что я не знаю временных меток начала и окончания и хочу получить их все. - person Michael Louis Thaler; 10.10.2013
comment
Затем просто установите для startTime и endTime значение null. Я изменил приведенный выше код, чтобы отразить это. - person pscuderi; 11.10.2013
comment
Кажется, это не работает для меня; Я не получаю столбцы обратно. :( - person Michael Louis Thaler; 12.10.2013
comment
Очень странно, учитывая, что я делал это много раз. Возможно, мы используем разные версии Cassandra? В любом случае, можно попробовать только то, что показано выше... - person pscuderi; 12.10.2013
comment
А-ха, видите, вы изменили его на правильное решение, которое я только что понял за последний час: установите для endTime значение MAX_VALUE. :) Если вы обновите описание над источником, я приму это. - person Michael Louis Thaler; 12.10.2013
comment
@pscuderi, что я должен указать, если мой третий компонент является строкой? - person S Kr; 22.05.2014