Pergunta

Eu não consigo descobrir como fazer tudo o intervalo de consultas preciso utilizar Astyanax.Eu tentei o que é explicado aqui mas ele não parece funcionar.

FYI, eu estou vindo de Hector mundo de onde eu tirei isso tudo funcionando muito bem e que, por razões eu não vou explicar, decidimos mudar para Astyanax.

Eu tenho uma coluna de família descrito como a seguir.Observação o "ReversedType" que nos permite ter a última TimeUUID primeiro.Ele não deva existir impacto para o resto, em leat ele nunca fez com Hector:

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))

E aqui é a definição de como 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;
}

Eu uso para ser capaz de fazer uma consulta usando parcial compósitos, conforme descrito aqui.O que eu realmente preciso é ser capaz de fazer o seguinte intervalo de consultas:

# Range 1
# Should get the 10 first elements of the rowkey
colstart: null
colend: null
limit: 10

# Range 2
# Should get the 10 first elements of the rowkey
# that has as first part of the composite the string "mycol"
colstart: Column("mycol", null)
colend: Column("mycol", null)
limit: 10

# Range 3
# Should get the 10 first elements of the rowkey
# that has as first part of the composite the string "mycol"
# and with a timeuuid created with a timstamp between 'timestampStart' and 'timestampEnd'
colstart: Column("mycol", TimeUUID(timestampStart))
colend: Column("mycol", TimeUUID(timestampEnd))
limit: 10

# Range 4, not actually a range
# Should get the 1 column composed of "mycol" and existingTimeUUID
colstart: Column("mycol", existingTimeUUID)
colend: Column("mycol", existingTimeUUID)
limit: 10

Aqui está o 3 maneiras que eu tentei:

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

Com base na minha Hector fundo, o composto dou (Anotado Classes) perder o parâmetro de IGUALDADE.Code 3 não iria fazer exatamente o que eu preciso como o prefixo aplica-se tanto de início e de fim e pode ser diferente se eu queria, para intance, para o intervalo de consulta do (col1, timUUID1) para (col2, TimeUUID2).

Eu consegui fazer Range 4 trabalho com todos os três códigos easely.

Eu consegui fazer Range 1 trabalho com todos os três códigos fazendo isso:

  • No Code 1 eu dei null como parâmetro para o início e fim
  • No Code 2 evitei chamar setStart e setEnd
  • No Code 3 evitei chamar withPrefix ou qualquer igualdade methode.

Eu consegui fazer Range 2 trabalho apenas com Code 3:

  • Eu quer greaterThanEquals(columnStart.colname) ou lessThanEquals(columnStart.colname) e nenhum outro igualdade/prefixo do método

Eu não consegui fazer Range 3 em tudo.

Clearely, eu gostaria de usar apenas Code 1 como eu realmente não sei a coluna de família eu vou ser a consultar.Aqui eu estou usando um exemplo com um composto de coluna, mas não pode ser composto ou ter mais de 2 campos.

Em hector, é realmente tão fácil como isso e eu gostaria de algumas equivalente:

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

Com colStart e colEnd sendo de qualquer tipo, e se composto, permitindo parcial compósitos com uma Igualdade definida em cada componente.

Obrigado por sua ajuda.

Foi útil?

Solução

Eu não era capaz de fazer tudo o que eu queria usando os métodos acima, mas eu achei um 4 que, apesar de não agradar-me, funciona.

Eu estou usando o ByteBuffer versão withColumnRange no Code 1.O início e o fim da memória intermédia são construídos utilizando real de classe Composto da seguinte forma:

public static <T> ByteBuffer toRangeStart(List<Object> list, boolean reversed) {
    return toRangeValue(list, reversed ? ComponentEquality.GREATER_THAN_EQUAL : ComponentEquality.EQUAL);
}

public static <T> ByteBuffer toRangeEnd(List<Object> list, boolean reversed) {
    return toRangeValue(list, reversed ? ComponentEquality.EQUAL : ComponentEquality.GREATER_THAN_EQUAL);
}

public static <T> ByteBuffer toRangeValue(List<Object> list, ComponentEquality eq) {
    // We use a real composite as we didn't find any other way to build those ranges
    Composite c = new Composite();

    int i;
    for (i = 0; i < list.size() - 1; i++) {
        c.addComponent(list.get(i), SerializerTypeInferer.getSerializer(list.get(i)), ComponentEquality.EQUAL);
    }
    c.addComponent(list.get(i), SerializerTypeInferer.getSerializer(list.get(i)), eq);

    return c.serialize();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top