Domanda

Non riesco a capire come effettuare tutte le query della gamma Ho bisogno di usare ASTYANAX. Ho provato ciò che è spiegato qui ma Non sembra funzionare.

Fyi Vengo dal mondo di Hector dove ho fatto tutto ciò che lavora bene e per ragioni che non spiegherò, abbiamo deciso di passare a Astytanax.

Ho una famiglia di colonna descritta come segue. Nota il "reversedtype" che ci consente di avere l'ultimo timeuuuid prima. Non dovrebbe influire sul resto, a Litore, non ha mai fatto 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))
.

Ed ecco la definizione come 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;
}
.

Io uso per essere in grado di eseguire una query utilizzando compositi parziali come descritto qui . Quello di cui ho davvero bisogno è essere in grado di eseguire le seguenti query della gamma:

# 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
.

Ecco i 3 modi che ho provato:

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

Sulla base del mio background Hector, il composito che do (classi annotate) mancano il parametro di uguaglianza. Code 3 non farebbe esattamente ciò di cui ho bisogno come il prefisso si applica sia all'inizio che per la fine e a quelli che potrebbero essere diversi se volessi, per intanziare, a intervallo di interrogazione da (COL1, TIMUUID1) a (COL2, TIMUUID2).

Sono riuscito a far funzionare Range 4 con tutti e tre i codici.

Sono riuscito a far funzionare Range 1 con tutti e tre i codici:

    .
  • In Code 1 ho dato null come param per l'inizio e la fine
  • In Code 2 ho evitato di chiamare Setstart e Seend
  • in Code 3 ho evitato di chiamare con prefrefix o qualsiasi metodo di uguaglianza.

Sono riuscito a rendere il lavoro Range 2 solo con Code 3:

    .
  • Ho fornito greaterThanEquals(columnStart.colname) o lessThanEquals(columnStart.colname) e nessun altro metodo di uguaglianza / prefisso

Non è riuscito a rendere Range 3.

Autorizzato, vorrei usare solo Code 1 come in realtà non conosco la famiglia della colonna che interrogarò. Qui sto solo usando un esempio con una colonna composita ma potrebbe non essere composito o avere più di 2 campi.

A Hector è davvero così facile come questo e vorrei un po '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 e BANEND AVEING di qualsiasi tipo e se composito, consentendo compositi parziali con un'uguaglianza definita su ciascun componente.

Grazie per il tuo aiuto.

È stato utile?

Soluzione

Non sono stato in grado di fare tutto ciò che volevo usare i metodi di cui sopra, ma ho trovato un 4 ° che anche se non fa piacere, funziona.

Sto usando la versione ByteBuffer di withColumnRange in Code 1.Il buffer di avvio e fine è costruito utilizzando la classe composita effettiva come segue:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top