質問

ASTYANAXを使用する必要があるすべての範囲クエリの作成方法を理解することはできません。 説明されているものを試してみましたここうまくいかないようです。

FY私は私がこれをうまく働いていて、私が説明しない理由で、私たちはASTYANAXに切り替えることにしました。

私は以下のように説明されているカラムファミリーを持っています。最新のTimeUUIDを最初に持つことを可能にする「ReversedType」に注意してください。それは残りに影響を与えるべきではない、それは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))
.

そしてここでは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;
}
.

説明のように部分複合材料を使用してクエリを実行できるようにします。ここ。私が本当に必要なのは、次の範囲のクエリを実行できることです:

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

ここに私が試した3つの方法があります:

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

私のヘクトルの背景に基づいて、Composite Iを与える(注釈付きクラス)は、等価パラメータを逃します。 Code 3は、プレフィックスが開始と終了の両方に適用されるときに必要なものを正確にはしません(COL1、TIMUUID1)から(COL2、TimeUIID2)、照会の場合は、(COL1、TIMUUID2)から範囲のクエリに違う場合があります。

私は3つのコードすべてのコードを容易に作業することができました。

私は、3つのコードすべてを使用して作業することができました。

  • Range 4では、Start and End
  • のパラメータとしてnullがありました
  • Range 1では、SetStartとSetEnd
  • の呼び出しを回避しました
  • Code 1では、Prefixまたは任意の等価メソッドを呼び出すことを避けました。

Code 2を作成することが一般的なCode 3

  • 私はRange 2またはCode 3のいずれかを提供し、他の平等/接頭辞法
  • を提供しました

greaterThanEquals(columnStart.colname)をまったく作成しませんでした。

明確に、私は実際に列の家族が照会することを実際に知らないようにlessThanEquals(columnStart.colname)だけを使用したいと思います。ここでは複合列を持つ例を使っていますが、複合ではないか、2つ以上のフィールドを持つことができます。

Hectorでは、これは本当に簡単なので、私はいくつかの同等のものが欲しいです:

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

任意の種類とコンポジットのCOLSTARTと携帯電話で蜂蜜を継ぎさせ、各コンポーネントに定義された平等の部分複合材料を可能にします。

あなたの助けをありがとう。

役に立ちましたか?

解決

上記の方法を使って欲しいのを望んでいませんでしたが、私は4番目のものを見つけました。

ByteBufferwithColumnRangeCode 1を使用しています。開始バッファと終了バッファは、実際のコンポジットクラスを使用して次のように構築されています。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top