2014-01-10 2 views
0

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에서
  • 내가 setStart를 호출 피할

    • Code 1에서 내가 시작을위한 PARAM null를주고 끝내고에서
    • 을 SETEND Code 3 withPrefix 또는 동등한 methode를 호출하는 것을 피했습니다.

        내가 제공
      • 중 하나 greaterThanEquals(columnStart.colname) 또는 lessThanEquals(columnStart.colname) 내가 Range 3을 전혀 할 관리하지 않았다

      다른 평등/접두사 방법 :

    나는 Range 2Code 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는와있다.

    도움 주셔서 감사합니다.

  • 답변

    0

    나는 위의 방법을 사용하고 싶었지만 제게 네가 저를 기쁘게하지는 않지만 네 번째 것을 발견했습니다.

    나는 의 ByteBuffer 버전을 Code 1에 사용하고 있습니다. 시작 및 종료 버퍼는 다음과 같이 실제 Composite 클래스를 사용하여 작성됩니다.

    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(); 
    } 
    
    관련 문제