Lorsque vous allez à la page suivante, vous pourrez peut-être simplifier le cas d'utilisation en n'autorisant qu'une "page suivante" et non une pagination arbitraire. Vous pouvez le faire en SimpleDB en utilisant la clause LIMIT:
SELECT title, summary, votecount FROM posts WHERE userid = '000022656' LIMIT 25
Vous savez déjà comment gérer la NextToken, mais si vous utilisez cette tactique, vous pouvez soutenir « page précédente » en stockant la piste de navigation des jetons suivants (par exemple dans la session Web) et réémettre la requête avec un précédent NextToken plutôt qu'un suivant.
Toutefois, le cas général de la gestion de la pagination arbitraire dans SimpleDB est le même pour le précédent et le suivant. Dans le cas général, l'utilisateur peut cliquer sur un numéro de page arbitraire, comme 5, sans jamais avoir visité la page 4 ou 6.
Vous manipulez ceci dans SimpleDB en utilisant le fait que NextToken exige seulement que la clause WHERE soit la même pour fonctionner correctement. Donc, plutôt que d'interroger toutes les pages en séquence en tirant sur tous les éléments intermédiaires, vous pouvez généralement le faire en deux étapes.
- Émettez votre requête avec une valeur limite d'où la page souhaitée devrait commencer, et SELECT count (*) au lieu des attributs réels que vous voulez.
- Utilisation du NextToken de la première étape pour aller chercher les données de pages réelles en utilisant les attributs désirés et la taille de page en tant que LIMIT
Ainsi, dans le pseudo-code:
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());
où% 1 et% 2 sont des substitutions de chaînes et "sdb.select()" est une méthode fictive qui inclut le code de substitution de chaîne avec l'appel SimpleDB. Si vous pouvez accomplir cela en deux appels à SimpleDB (comme indiqué dans le code) dépendra de la complexité de votre clause WHERE et de la taille de votre ensemble de données. Le code ci-dessus est simplifié en ce que le résultat temporaire peut avoir retourné un compte partiel si la requête a duré plus de 5 secondes. Vous voudriez vraiment mettre cette ligne dans une boucle jusqu'à ce que le compte correct soit atteint.Pour rendre le code un peu plus réaliste que je vais le mettre dans les méthodes et se débarrasser des substitutions de chaîne:
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){...}
Telle est l'idée générale sans gestion des erreurs, et fonctionne pour une page quelconque, à l'exclusion page 1.
Merci pour votre réponse complète! – royco
Bonne réponse, merci – theosp
quand je lance une déclaration pour compter jusqu'à une limite, je n'obtiens pas de jeton à la fin de mes résultats (même quand je boucle des jetons) Ai-je raté quelque chose? –