Порядок DynamoDB по убыванию на основе ключа сортировки - PullRequest
0 голосов
/ 22 марта 2019

В настоящее время я использую загрузку Spring с DynamoDB и использую DynamoDBMapper для всех операций с БД. Сейчас сортировка происходит в порядке возрастания на основе ключа сортировки (имя поля id). Как сортировать в порядке убывания по значению ключа сортировки?

Текущий код:

@Override
public PageImpl<Order> getCustomerOrders(Pageable pageable) {

    List<Order> orders = new ArrayList<>();


    Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();


    DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
    List<String> exp = new ArrayList<>();


    // filters

    if (!exp.isEmpty())
        scanExpression
                .withFilterExpression(String.join(" AND ", exp)).withExpressionAttributeValues(eav);


    PaginatedScanList<Order> scan = mapper.scan(Order.class, scanExpression);




    int start = (int) pageable.getOffset();
    int size = scan.size();
    int end = (start + pageable.getPageSize()) > size ? size : (start + pageable.getPageSize());

    if (start < size)
        for (Order o : scan.subList(start, end)) {
            orders.add(o);
        }

    return new PageImpl<Order>(orders, pageable, size);
}

После некоторого поиска в Google я обнаружил, что мне нужно установить ScanIndexForward равным true, но все же я запутался, что как я могу добиться этого с помощью DynamoDBMApper?

Или мне нужно использовать какой-либо класс низкого уровня, такой как DynamoDB или AmazonDynamoDb?

1 Ответ

0 голосов
/ 22 марта 2019

Наконец-то я сам нашел решение, спасибо @ ydrall за подсказку. Согласно его комментарию, ScanIndexForward может использоваться только с опцией запроса, поэтому я только что обновил с помощью query . Я создал объект DynamoDBQueryExpression и обновил свойство, используя метод setScanIndexForward (false).

Полный код Java:

@Override
public PageImpl<Order> getAllProgramOrder(Pageable pageable, OrderFilter filter) {
    List<Order> orders = new ArrayList<>();


    DynamoDBQueryExpression<Order> queryExpression = new DynamoDBQueryExpression<Order>();

    queryExpression.setScanIndexForward(false);


    Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
    eav.put(":val1", new AttributeValue().withS(authenticationFacade.getProgramId()));

    queryExpression.withKeyConditionExpression("hashKey = :val1 ")
            .withExpressionAttributeValues(eav);

    PaginatedQueryList<Order> scan = mapper.query(Order.class, queryExpression);


    int start = (int) pageable.getOffset();
    int size = scan.size();
    int end = (start + pageable.getPageSize()) > size ? size : (start + pageable.getPageSize());

    if (start < size)
        for (Order o : scan.subList(start, end)) {
            orders.add(o);
        }

    return new PageImpl<Order>(orders, pageable, size);
}

Ссылка: Как сканировать индекс в обратном порядке в DynamoDB?

...