Quando si passa alla pagina successiva è possibile semplificare il caso d'uso consentendo solo una "pagina successiva" e una paginazione non arbitraria. È possibile farlo in SimpleDB utilizzando la clausola LIMIT:
SELECT title, summary, votecount FROM posts WHERE userid = '000022656' LIMIT 25
Sapete già come gestire la nextToken, ma se si utilizza questa tattica, è possibile sostenere "pagina precedente" memorizzando il filo di Arianna di prossimi gettoni (ad esempio nella sessione Web) e ri-emettere la query con un NextToken precedente anziché successivo.
Tuttavia, il caso generale per la gestione dell'impaginazione arbitraria in SimpleDB è lo stesso per precedente e successivo. Nel caso generale, l'utente può fare clic su un numero di pagina arbitrario, ad esempio 5, senza aver mai visitato la pagina 4 o 6.
Si gestisce questo in SimpleDB utilizzando il fatto che NextToken richiede solo la clausola WHERE per essere il lo stesso per funzionare correttamente. Quindi, piuttosto che interrogare ogni pagina in sequenza tirando giù tutti gli elementi intermedi, di solito è possibile farlo in due passaggi.
- Emettere la query con un valore limite di dove deve essere avviata la pagina desiderata e SELECT count (*) invece degli attributi effettivi desiderati.
- Utilizza la nextToken dal punto uno per recuperare i dati della pagina effettivi utilizzando gli attributi desiderati e la dimensione di pagina come limite
Così in pseudo-codice:
int targetPage, pageSize;
...
int jumpLimit = pageSize * (targetPage - 1);
String query = "SELECT %1 FROM posts WHERE userid = '000022656' LIMIT %2";
String output = "title, summary, votecount";
Result temp = sdb.select(query, "count(*)", jumpLimit);
Result data = sdb.select(query, output, pageSize, temp.getToken());
Dove% 1 e% 2 sono sostituzioni di stringhe e "sdb.select()" è un metodo fittizio che include il codice di sostituzione delle stringhe insieme alla chiamata SimpleDB.
Se è possibile eseguire questa operazione in due chiamate a SimpleDB (come mostrato nel codice), dipenderà dalla complessità della clausola WHERE e dalla dimensione del set di dati. Il codice sopra riportato è semplificato in quanto il risultato temporaneo potrebbe aver restituito un conteggio parziale se la query impiegava più di 5 secondi per essere eseguita. Si vorrebbe davvero mettere quella linea in un ciclo finché non si raggiunge il conteggio corretto.Per rendere il codice un po 'più realistico lo metterò all'interno dei metodi e sbarazzarsi delle sostituzioni String:
private Result fetchPage(String query, int targetPage)
{
int pageSize = extractLimitValue(query);
int skipLimit = pageSize * (targetPage - 1);
String token = skipAhead(query, skipLimit);
return sdb.select(query, token);
}
private String skipAhead(String query, int skipLimit)
{
String tempQuery = replaceClause(query, "SELECT", "count(*)");
int accumulatedCount = 0;
String token = "";
do {
int tempLimit = skipLimit - accumulatedCount;
tempQuery = replaceClause(tempQuery , "LIMIT", tempLimit + "");
Result tempResult = sdb.select(query, token);
token = tempResult.getToken();
accumulatedCount += tempResult.getCount();
} while (accumulatedCount < skipLimit);
return token;
}
private int extractLimitValue(String query) {...}
private String replaceClause(String query, String clause, String value){...}
Questa è l'idea generale senza gestione degli errori, e funziona per qualsiasi pagina definita, escludendo Pagina 1.
Grazie per la tua risposta completa! – royco
Ottima risposta, grazie – theosp
quando eseguo una dichiarazione per contare fino a un limite, non ottengo un token alla fine dei miei risultati (anche quando eseguo il loop dei token) Mi manca qualcosa? –