10

Dalla documentazione API dynamo db supporta l'impaginazione per le operazioni di scansione e query. Il problema qui è impostare la ExclusiveStartIndex della richiesta corrente sul valore della LastEvaluatedIndex della richiesta precedente per ottenere il prossimo set (pagina logica) dei risultati.Paginazione con DynamoDBMapper Java AWS SDK

Sto cercando di implementare lo stesso, ma sto usando DynamoDBMapper, che sembra avere molti più vantaggi come l'accoppiamento stretto con i modelli di dati. Quindi, se volevo fare quanto sopra, sto assumendo che vorrei fare qualcosa di simile di seguito:

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

Spero che la mia sopra comprensione è corretta impaginazione utilizzando DynamoDBMapper. In secondo luogo, come potrei sapere che ho raggiunto la fine dei risultati. Dalla documentazione se uso il seguente api:

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

Tornando a utilizzare DynamoDBMapper, come faccio a sapere se ho raggiunto la fine dei risultati in questo caso.

risposta

22

Hai un paio di opzioni diverse con il DynamoDBMapper, a seconda del modo in cui vuoi andare.

La parte qui è capire la differenza tra il metodi e quale funzionalità hanno restituito gli oggetti incapsulare.

I'll go over PaginatedScanList e ScanResultPage, ma questi metodi/oggetti fondamentalmente si rispecchiano a vicenda.

Il PaginatedScanList dice il miniera di seguito, l'accento:

Attuazione della interfaccia List che rappresenta i risultati di una scansione in AWS DynamoDB. I risultati impaginati vengono caricati su richiesta quando l'utente esegue un'operazione che li richiede. Alcune operazioni, come la dimensione(), devono recuperare l'intero elenco, ma i risultati vengono recuperati pigramente pagina per pagina quando possibile.

Questo dice che i risultati vengono caricati mentre si scorre l'elenco. Quando superi la prima pagina, la seconda pagina viene recuperata automaticamente senza che tu debba fare esplicitamente un'altra richiesta. Il caricamento lento dei risultati è il metodo predefinito, ma può essere sovrascritto se si richiamano i metodi sovraccaricati e si fornisce un DynamoDBMapperConfig con un diverso DynamoDBMapperConfig.PaginationLoadingStrategy.

Questo è diverso dallo ScanResultPage. Ti viene data una pagina di risultati e tocca a te occuparti personalmente dell'impaginazione.

Ecco esempio di codice rapido che mostra un esempio di utilizzo di entrambi i metodi che mi sono imbattuto con un tavolo di 5 articoli con 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); 

E l'output:

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

Se 'limit' è impostato per dire 2 quando si usa 'query', sta ancora restituendo tutti i record. Perché è così? – user7

+1

@ user7 Sembra solo che stia restituendo tutti i record, quando in realtà l'implementazione sottostante ('PaginatedQueryList') sta gestendo l'impaginazione per voi. Guarda la documentazione di ['PaginatedQueryList'] (https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/PaginatedQueryList.html). Si comporta nello stesso modo in cui ho postato su 'scan' sopra. Fondamentalmente, se si itera su di esso, alla fine recupererà tutti gli elementi perché sta facendo automaticamente le chiamate di impaginazione. – mkobit

+0

Quindi 'withLimit' non si applica per questo? – user7