DynamoDbIndex.scan() с выражением фильтра не работаетJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 DynamoDbIndex.scan() с выражением фильтра не работает

Сообщение Anonymous »

В своем коде я использую этот класс как объект Java для таблицы DynamoDB:

Код: Выделить всё

@DynamoDbBean
@Data
public class RecordDynamoDB {
private String id;
private String customerIdHash;
private OffsetDateTime expirationTime;

@DynamoDbPartitionKey
public String getId() {
return id;
}

@DynamoDbSecondarySortKey(indexNames = {"expirationTime-index"})
@DynamoDbConvertedBy(DynamoDBTimestampConverter.class)
public OffsetDateTime getExpirationTime() {
return expirationTime;
}

@DynamoDbSecondaryPartitionKey(indexNames = "customerIdHash-index")
public String getCustomerIdHash() {
return customerIdHash;
}
}
Этот код позволяет нам искать элементы с желаемым статусом и сроком действия:

Код: Выделить всё

var attributeValueMap = Map.of(
":status", AttributeValue.fromS(Status.EXPIRED.getValue()),
":expirationTime", DATE_TIME_CONVERTER.transformFrom(now)
);

var scanRequest = ScanRequest.builder()
.tableName(TABLE_NAME)
.filterExpression("expirationTime < :expirationTime AND grant.#status = :status")
.expressionAttributeValues(attributeValueMap)
.expressionAttributeNames(Map.of("#status", "status"))
.build();

return dynamoDbClient.scan(scanRequest)
.items()
.stream()
.map(recordTableSchema::mapToItem)
.toList();
Приведенный выше код работает так, как ожидалось.
Теперь я хочу использовать индекс, чтобы быстрее загружать данные. Я создаю GSI с именем expirationTime-index с customerIdHash в качестве ключа раздела и expirationTime в качестве ключа сортировки. Затем я переписываю свой код:

Код: Выделить всё

var attributeValueMap = Map.of(
":status", AttributeValue.fromS(ConsentGrantStatus.EXPIRED.getValue()),
":expirationTime", DATE_TIME_CONVERTER.transformFrom(now)
);

DynamoDbIndex index = table(TABLE_NAME, ConsentRecordDynamoDB.class).index(INDEX_NAME);

var expression = Expression.builder()
.expression("expirationTime < :expirationTime AND grant.#status = :status")
.expressionNames(Map.of("#status", "status"))
.expressionValues(attributeValueMap)
.build();
return index.scan(builder -> builder.filterExpression(expression))
.stream()
.map(Page::items)
.flatMap(List::stream)
.toList();
Этот код, использующий index.scan(), не возвращает ни одной записи. Что я здесь делаю не так?


Подробнее здесь: https://stackoverflow.com/questions/787 ... oesnt-work
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»