Astyanax를 사용하여 필요한 모든 범위 쿼리를 만드는 방법을 알 수 없습니다. 나는 설명 된 것을 시도했다. here하지만 작동하지 않는 것 같다.부분 합성 열에 대한 범위 쿼리
참고 나는이 모든 것이 잘 작동하는 헥터 세계에서 왔고 내가 설명하지 않을 이유 때문에 Astyanax로 전환하기로 결정했다.
다음과 같이 열 패밀리가 있습니다. 먼저 최신 TimeUUID를 가질 수있는 "ReversedType"에 유의하십시오. 그것은 헥터했던 적이 잎에, 나머지에 영향을주지해야합니다
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))
을 그리고 여기에 아 스티 아낙 스 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;
}
복합 재료는 here으로 기술되어있다.
# 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();
, 내가주는 복합은 (주석 내가 정말 필요한 것은 다음 범위 쿼리를 할 수있을 것입니다 클래스)는 EQUALITY 매개 변수를 놓친다. Code 3
접두어가 시작과 끝 모두에 적용되고 intance에 대해 (col1, timUUID1)에서 (col2, TimeUUID2)까지 범위 쿼리를 원할 경우 접두사가 적용될 때마다 정확하게 필요하지 않습니다.
Range 4
은 세 코드 모두를 easely로 처리 할 수있었습니다.
Range 1
작동하도록 관리 :
Code 2
에서
- 이
Code 1
에서 내가 시작을위한 PARAM null를주고 끝내고에서 - 을 SETEND
Code 3
withPrefix 또는 동등한 methode를 호출하는 것을 피했습니다.-
내가 제공
- 중 하나
greaterThanEquals(columnStart.colname)
또는lessThanEquals(columnStart.colname)
내가Range 3
을 전혀 할 관리하지 않았다
다른 평등/접두사 방법 :
- 중 하나
나는 Range 2
만 Code 3
와 작동하도록 관리 .
Clearely, 내가 실제로 쿼리 할 열 패밀리를 모르는만큼 Code 1
만 사용하고 싶습니다. 여기서는 복합 열과 함께 예제를 사용하고 있지만 복합 요소가 아니거나 둘 이상의 필드가있을 수 있습니다.
헥터에서는이 한 쉽게 정말 내가 어떤 동등한 싶습니다
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 및 colEnd 각 구성 요소에 정의 된 평등과 부분 합성을 허용, 모든 유형의 복합 경우 beeing는와있다.
도움 주셔서 감사합니다.