次のページに進むと、「次のページ」のみを許可し、任意のページングを許可しないことでユースケースを簡素化できます。あなたは、LIMIT句を使ってSimpleDBの中でこれを行うことができます:
SELECT title, summary, votecount FROM posts WHERE userid = '000022656' LIMIT 25
はすでには、NextTokenを処理する方法を知っていますが、この戦術を使用する場合は、次のトークンのパンくずリストを格納することによって、「前のページ」をサポートすることができます(例えば、Webセッションで)、次のトークンではなく前のNextTokenを使用してクエリを再発行します。
ただし、SimpleDBの任意のページ番号を扱う一般的なケースは、前と次のページで同じです。一般的には、ユーザーはページ4または6を訪れていなくても、5などの任意のページ番号をクリックできます。
これは、NextTokenでWHERE句のみが必要であるという事実を使用してSimpleDBで処理します同じように正しく動作する。そのため、介入するすべてのアイテムを順番にすべてのページを照会するのではなく、通常は2つのステップで実行できます。
- 目的のページを開始する場所の制限値と、実際の属性の代わりにSELECTカウント(*)を使用してクエリを発行します。
- 使用は、NextToken LIMITそこで擬似コードで
として所望の属性とページ・サイズを使用して、実際のページデータを取得するステップ1から:
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呼び出しを含む架空のメソッドです。
コードで示されているように、2回のSimpleDBの呼び出しでこれを実行できるかどうかは、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ページを除く、任意のページのために動作します。
あなたの徹底的な対応に感謝します! – royco
偉大な答え、ありがとう – theosp
私は限界にカウントするために文を実行するとき、私は結果の最後にトークンを取得しない(私はトークンをループするときでも)何かが不足している? –