fdb-record-layer
fdb-record-layer copied to clipboard
Using query on an Enum field and Sorting KeyExpression fails
I am facing a peculiar case when I run a query which uses Enum in querycomponent and also use sorting
when I use enum in query but do not use sort , the query executes fine.
when I use any other field in the query which is not of type enum and also pass a sort expression, the query executes fine.
when I use an enum field in my query and also pass a sort field, I get this error:
com.apple.foundationdb.record.RecordCoreException: com.apple.foundationdb.record.RecordCoreException: Tried to compare non-comparable object class com.google.protobuf.Descriptors$EnumValueDescriptor
at com.apple.foundationdb.record.RecordCursor.getNext(RecordCursor.java:243)
Use Cases: This is fine: no sort field
QueryComponent filter1 = Query.or(
Query.field("status").equalsValue(SampleRecords.SampleStatus.SAMPLEREC_STATUS_OK),
Query.field("status").equalsValue(SampleRecords.SampleStatus.SAMPLEREC_STATUS_1)
);
List<Message> retList1 = dao.getPaginatedList(tenantId, VCMRecordNames.PUBLISHED_SAMPLEREC,
filter1, null, true, 10, 10);
This is also fine : sort but query filter on a non enum
QueryComponent filter2 = Query.field("created_by").matches(Query.field("id").equalsValue("contact1"));
KeyExpression sortKeyExpression = Key.Expressions.field("created_date").nest("seconds");
List<Message> retList1 = dao.getPaginatedList(tenantId, VCMRecordNames.PUBLISHED_SAMPLEREC,
filter2, sortKeyExpression, true, 10, 10);
This is gives the error : query on enum with sort field
KeyExpression sortKeyExpression = Key.Expressions.field("created_date").nest("seconds");
QueryComponent filter1 = Query.or(
Query.field("status").equalsValue(SampleRecords.SampleStatus.SAMPLEREC_STATUS_OK),
Query.field("status").equalsValue(SampleRecords.SampleStatus.SAMPLEREC_STATUS_1)
);
List<Message> retList1 = dao.getPaginatedList(tenantId, VCMRecordNames.PUBLISHED_SAMPLEREC,
filter1, sortKeyExpression, true, 10, 10);
(I have simple index on status field and also one on created_date.seconds field)
My dao code:
public List<Message> getPaginatedList(String tenantID,
String recordType,
QueryComponent filter,
KeyExpression sortKeyExpression ,
Boolean sortAscending,
int skip, int limit
) {
if(sortKeyExpression!=null) {
System.out.println("getPaginatedList , sort"+ sortKeyExpression.toString() + " asc "+sortAscending);
System.out.println("getPaginatedList , sort"+ sortKeyExpression.getClass() );
}
if(recordType!=null){
System.out.println("getPaginatedList , recordType "+ recordType );
}
if(filter!=null){
System.out.println("getPaginatedList , filter "+ filter.toString() );
System.out.println("getPaginatedList , filter "+ filter.getClass() );
}
RecordQuery.Builder queryBuilder = RecordQuery.newBuilder()
.setRecordType(recordType);
if (filter != null) {
queryBuilder.setFilter(filter);
}
if ((sortKeyExpression != null) && (sortAscending != null)) {
System.out.println("sortKeyExpression is not null getPaginatedList , sort"+ sortKeyExpression.toString() + " asc "+sortAscending);
queryBuilder.setSort(sortKeyExpression, !sortAscending);
}
RecordQuery query=queryBuilder.build();
System.out.println("getPaginatedList , query "+ query.toString());
return getFDBDatabase().run(context -> {
FDBRecordStore fdbRecordStore = OrgRecordManager.getInstance().createFDBRecordStore(context, tenantID);
List<Message> items= new ArrayList<>();
try (RecordCursor<FDBQueriedRecord<Message>> cursor = fdbRecordStore.executeQuery(query)) {
RecordCursorResult<FDBQueriedRecord<Message>> result;
RecordCursor<FDBQueriedRecord<Message>> cursor2 =cursor.skipThenLimit(skip, limit);
do {
result = cursor2.getNext();
if (result.hasNext()) {
FDBQueriedRecord<Message> record = result.get();
items.add(record.getRecord());
}
} while (result.hasNext());
return items;
}
});
}