次のページに移動するときは、「次のページ」のみを許可し、任意のページングを許可しないことで、ユースケースを簡素化できる場合があります。SimpleDBでこれを行うには、LIMIT句を使用します。
SELECT title, summary, votecount FROM posts WHERE userid = '000022656' LIMIT 25
NextTokenの処理方法はすでに知っていますが、この戦術を使用すると、次のトークンのブレッドクラムトレイルを保存し(Webセッションなど)、前のNextTokenではなく前のNextTokenでクエリを再発行することで、「前のページ」をサポートできます。後続のもの。
ただし、SimpleDBで任意のページネーションを処理する一般的なケースは、前と次で同じです。一般的な場合、ユーザーは4ページまたは6ページにアクセスすることなく、5などの任意のページ番号をクリックできます。
SimpleDBでこれを処理するには、NextTokenが正しく機能するためにWHERE句が同じである必要があるだけであるという事実を使用します。したがって、すべてのページを順番にクエリして、介在するすべてのアイテムをプルダウンするのではなく、通常は2つのステップで実行できます。
- 目的のページを開始する場所の制限値と、必要な実際の属性の代わりにSELECT count(*)を使用してクエリを発行します。
- ステップ1のNextTokenを使用して、目的の属性とページサイズをLIMITとして使用して実際のページデータをフェッチします
したがって、擬似コードでは:
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());
ここで、%1と%2は文字列置換であり、「sdb.select()」はSimpleDB呼び出しとともに文字列置換コードを含む架空のメソッドです。
SimpleDBへの2回の呼び出しでこれを実行できるかどうか(コードに示されているように)は、WHERE句の複雑さとデータセットのサイズによって異なります。上記のコードは、クエリの実行に5秒以上かかった場合に、一時的な結果が部分的なカウントを返す可能性があるという点で単純化されています。適切なカウントに達するまで、その行をループに入れたいと思うでしょう。コードをもう少し現実的にするために、メソッド内にコードを配置し、文字列の置換を取り除きます。
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){...}
これはエラー処理なしの一般的な考え方であり、ページ1を除く任意のページで機能します。