10

Z dokumentacji dynamo interfejsu API doc obsługuje obsługę stronicowania dla operacji skanowania i kwerend. Połów tutaj polega na ustawieniu ExclusiveStartIndex bieżącego żądania na wartość LastEvaluatedIndex poprzedniego żądania, aby uzyskać następny zestaw (strona logiczna) wyników.Tworzenie stron z DynamoDBMapper Java AWS SDK

Próbuję wdrożyć to samo, ale używam DynamoDBMapper, który wydaje się mieć dużo więcej zalet, takich jak ścisłe połączenie z modelami danych. Więc gdybym chciał zrobić z powyższym, jestem przy założeniu, chciałbym zrobić coś jak poniżej:

// Mapping of hashkey of the last item in previous query operation 
Map<String, AttributeValue> lastHashKey = .. 
DynamoDBQueryExpression expression = new DynamoDBQueryExpression(); 

... 
expression.setExclusiveStartKey(); 
List<Table> nextPageResults = mapper.query(Table.class, expression); 

Mam nadzieję, że powyższe rozumienie jest właściwe Stronicowanie za pomocą DynamoDBMapper. Po drugie, skąd mam wiedzieć, że osiągnąłem koniec wyników. Od docs, jeśli mogę użyć następujące API:

QueryResult result = dynamoDBClient.query((QueryRequest) request); 
boolean isEndOfResults = StringUtils.isEmpty(result.getLastEvaluatedKey()); 

Wracając do korzystania DynamoDBMapper, jak mogę wiedzieć, czy został osiągnięty koniec wyników w tej sprawie.

Odpowiedz

22

Masz kilka różnych opcji z DynamoDBMapper, w zależności od tego, w którą stronę chcesz jechać.

The część tutaj jest zrozumienie różnicy między metody i jaka funkcjonalność ich zwróconych obiektów hermetyzować.

Pójdę po PaginatedScanList i ScanResultPage, ale te metody/obiekty w zasadzie odzwierciedlają się nawzajem.

PaginatedScanList mówi kopalni dodaje nacisk:

implementacji interfejsu listy, która reprezentuje wyniki skanowania w AWS DynamoDB. Wyniki podzielone na strony są ładowane na żądanie, gdy użytkownik wykona operację, która ich wymaga. Niektóre operacje, takie jak size(), muszą pobrać całą listę, ale wyniki są leniwie pobierane strona po stronie, jeśli to możliwe.

Oznacza to, że wyniki są ładowane podczas przeglądania listy. Kiedy przejdziesz przez pierwszą stronę, druga strona jest automatycznie pobierana bez konieczności wyraźnego składania kolejnego żądania. Leniwe ładowanie wyników jest metodą domyślną, ale można je przesłonić, jeśli wywołasz przeciążone metody i dostarczysz DynamoDBMapperConfig z innym DynamoDBMapperConfig.PaginationLoadingStrategy.

Różni się od ScanResultPage. Dostajesz stronę z wynikami, a sam zajmiesz się stroną.

Oto krótki przykładowy kod pokazujący przykład użycia obu metod, że wpadłem z tabeli 5 pozycji przy użyciu DynamoDBLocal:

final DynamoDBMapper mapper = new DynamoDBMapper(client); 

// Using 'PaginatedScanList' 
final DynamoDBScanExpression paginatedScanListExpression = new DynamoDBScanExpression() 
     .withLimit(limit); 
final PaginatedScanList<MyClass> paginatedList = mapper.scan(MyClass.class, paginatedScanListExpression); 
paginatedList.forEach(System.out::println); 

System.out.println(); 
// using 'ScanResultPage' 
final DynamoDBScanExpression scanPageExpression = new DynamoDBScanExpression() 
     .withLimit(limit); 
do { 
    ScanResultPage<MyClass> scanPage = mapper.scanPage(MyClass.class, scanPageExpression); 
    scanPage.getResults().forEach(System.out::println); 
    System.out.println("LastEvaluatedKey=" + scanPage.getLastEvaluatedKey()); 
    scanPageExpression.setExclusiveStartKey(scanPage.getLastEvaluatedKey()); 

} while (scanPageExpression.getExclusiveStartKey() != null); 

a wyjście:

MyClass{hash=2} 
MyClass{hash=1} 
MyClass{hash=3} 
MyClass{hash=0} 
MyClass{hash=4} 

MyClass{hash=2} 
MyClass{hash=1} 
LastEvaluatedKey={hash={N: 1,}} 
MyClass{hash=3} 
MyClass{hash=0} 
LastEvaluatedKey={hash={N: 0,}} 
MyClass{hash=4} 
LastEvaluatedKey=null 
+0

Jeśli jest 'limit' ustawione na say 2 przy użyciu 'query', nadal zwraca wszystkie rekordy. Dlaczego tak jest? – user7

+1

@ user7 Wygląda na to, że zwraca wszystkie rekordy, podczas gdy w rzeczywistości podstawowa implementacja ('PaginatedQueryList') obsługuje tę funkcję. Zobacz dokumentację dla ['PaginatedQueryList'] (https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/PaginatedQueryList.html). Zachowuje się w taki sam sposób jak napisałem o 'scan' powyżej. Zasadniczo, jeśli przejdziesz przez to iterację, ostatecznie pobierze wszystkie elementy, ponieważ automatycznie wykonuje wywołania w paginacji. – mkobit

+0

Więc 'withLimit' nie dotyczy? – user7