fdb-record-layer icon indicating copy to clipboard operation
fdb-record-layer copied to clipboard

Using query on an Enum field and Sorting KeyExpression fails

Open manish-2014 opened this issue 1 year ago • 1 comments

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

manish-2014 avatar Aug 08 '23 16:08 manish-2014