Question

Je ne peux pas comprendre comment faire de l'ensemble de la gamme des requêtes j'ai besoin de l'aide d'Astyanax.J'ai essayé ce qui est expliqué ici mais il ne semble pas fonctionner.

Pour info, je viens de le Hector monde où j'ai obtenu tout cela fonctionne parfaitement et pour des raisons que je n'expliquerai pas, nous avons décidé de passer à Astyanax.

J'ai une famille de colonne décrit comme suit.Notez le "ReversedType" qui nous permet de disposer de la dernière TimeUUID premier.Il ne devrait pas avoir d'impact pour le reste, au moins il ne l'a jamais fait avec 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))

Et voici les définitions comme 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;
}

Je utiliser pour être en mesure de faire une requête à l'aide partielle composites comme décrit ici.Ce que j'ai vraiment besoin, c'est d'être en mesure de faire ce qui suit gamme des requêtes:

# 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

Voici les 3 façons j'ai essayé:

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

Basé sur mon Hector arrière-plan, le composite je donne (Annoté Classes) miss l'ÉGALITÉ paramètre.Code 3 ne pas faire exactement ce dont j'ai besoin comme le préfixe s'applique à la fois début et de fin et ceux qui peuvent être différents si je voulais, pour l'intance, à la requête de plage de colonnes (col1, timUUID1) à (col2, TimeUUID2).

J'ai réussi à faire Range 4 travailler avec tous les trois codes facilement.

J'ai réussi à faire Range 1 travailler avec tous les trois codes en faisant ainsi:

  • Dans Code 1 j'ai donné la valeur null comme paramètre pour le début et la fin
  • Dans Code 2 j'ai évité d'appeler setStart et setEnd
  • Dans Code 3 j'ai évité d'appeler withPrefix ou toute égalité methode.

J'ai réussi à faire Range 2 travailler uniquement avec des Code 3:

  • Je fournie greaterThanEquals(columnStart.colname) ou lessThanEquals(columnStart.colname) et pas d'autre de l'égalité/préfixe méthode

Je n'ai pas réussi à faire Range 3 à tous.

Clearely, je voudrais utiliser seulement Code 1 comme je n'en connais pas la famille de la colonne, je vais être de l'interrogation.Ici, je suis juste à l'aide d'un exemple avec un composite colonne, mais il ne peut pas être composite, ou avoir plus de 2 champs.

Dans hector c'est vraiment aussi simple que cela, et je voudrais quelques équivalent:

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

Avec colStart et colEnd être de tout type et si composite, permettant partielle composites avec une Égalité est définie sur chaque composant.

Merci pour votre aide.

Était-ce utile?

La solution

Je n'ai pas pu faire tout ce que je voulais en utilisant les méthodes ci-dessus, mais j'ai trouvé un 4e que même si ça ne me plaît, fonctionne.

Je suis à l'aide de la ByteBuffer la version de withColumnRange dans Code 1.Le début et la fin de la mémoire tampon sont construits à l'aide de la réelle Composite de classe comme suit:

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();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top