Pregunta

No puedo entender cómo realizar todas las consultas de alcance necesito usar Astyanax.He probado lo explica aquí pero no parece funcionar.

FYI vengo de la de Héctor mundo en donde tengo todo esto trabajando muy bien y por razones que no voy a explicar, se decidió cambiar a Astyanax.

Tengo una familia de columna se describe como sigue.Nota el "ReversedType" que nos permite tener la última TimeUUID primera.Esto no debería afectar al resto, en leat nunca lo hizo con 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))

Y he aquí que la definición como un 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;
}

Yo uso para ser capaz de hacer una consulta mediante parcial de compuestos como se describe aquí.Lo que realmente necesita es ser capaz de hacer las siguientes 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

He aquí las 3 maneras que he probado:

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

Basado en mi Hector fondo, el compuesto doy (Anotado Clases) pierda la IGUALDAD de parámetro.Code 3 no hacer exactamente lo que yo necesito como el prefijo se aplica tanto a los de inicio y término de los puede ser diferente si yo quería, para intance, a la consulta de rango de (col1, timUUID1) a (col2, TimeUUID2).

Me las arreglé para hacer Range 4 el trabajo con los tres códigos de facilidad.

Me las arreglé para hacer Range 1 el trabajo con los tres códigos de hacerlo:

  • En Code 1 me dio null como parámetro para el inicio y el final
  • En Code 2 he evitado llamar setStart y setEnd
  • En Code 3 he evitado llamar withPrefix o cualquier igualdad methode.

Me las arreglé para hacer Range 2 trabajar sólo con Code 3:

  • Yo siempre que sea greaterThanEquals(columnStart.colname) o lessThanEquals(columnStart.colname) y no hay igualdad/prefijo método

No pude hacer Range 3 en todos los.

Clearely, me gustaría usar sólo Code 1 como en realidad yo no sé la columna de la familia voy a estar consultando.Aquí estoy usando un ejemplo con un compuesto de la columna pero no puede ser compuesto o tener más de 2 campos.

En héctor es realmente tan fácil como esto y me gustaría algún 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();

Con colStart y colEnd beeing de cualquier tipo y si el compuesto, lo que permite parcial de compuestos con una Igualdad que se define en cada componente.

Gracias por tu ayuda.

¿Fue útil?

Solución

Yo no era capaz de hacer todo lo que quería utilizando los métodos anteriores, pero me he encontrado con un 4º que a pesar de que no por favor me funciona.

Estoy usando el ByteBuffer la versión de withColumnRange en Code 1.El inicio y el final del búfer, se construyen con el real Compuesto de la clase de la siguiente manera:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top