私は過去数日間、GoogleAppEngineで適切なページングを行う方法を理解するために時間を費やしてきました。実行可能な解決策ができたら、多くの人がこれに苦労しているのを見て、グーグルコードでそれらを公開します。
目標:次の機能を備えた、GAE用のシンプルで強力なページングソリューションを作成します。
- 順方向および逆方向のページング、最初のページと最後のページのサポート
- フィールドの(サブセット)による並べ替え(一度に1つの順序のみ)
- 同様の方法でフィルタリング基準を設定します(たとえば、「Tom」と入力すると、「Tom」で始まる名前の人物のみがフィルタリングされて表示されます)
- ページの総数を追跡する
設計上の決定:
- スケーリングしないため、制限/オフセットを使用しないでください。代わりにカーソルに依存します
- シャーディングを使用して、ページの総数を最新の状態に保ちます
- 妥協を受け入れますが、最高のパフォーマンス/スケーラビリティを目指します
障害(つまり最後の砦):残っている唯一の問題は、フィルタリング基準(たとえば、名前が「Tom」で始まる)と別のプロパティの並べ替え基準がある場合だと思います。
例:人[名前、年齢]
- 名前でフィルタリング'Tom*'
- 年齢で並べ替え
ドキュメントを読んで、私は解決策を見つけたと思いました:
Query q = new Query("Person");
q.addFilter("name", FilterOperator.GREATER_THAN_OR_EQUAL, nameFilter);
q.addFilter("name", FilterOperator.LESS_THEN, nameFilter + "\uFFFD");
q.addSort("name", SortDirection.ASCENDING);
q.addSort("age", SortDirection.ASCENDING);
私はこれが戻ると思った:
- Tom2 18
- Tom1 20
残念ながら、これは
- Tom1 20
- Tom2 18
クエリは最初に名前でフィルタリングされ、次に2次キーとして年齢でフィルタリングされます。
私が考えることができる唯一の解決策は、フィルター結果全体をJava構造に入れ、コンパレーターを使用してソートしてから、表示するレコードを選択することです。しかし、これには私のカーソルロジックが消えるという追加の問題があります。これは、ページングを解決するための2つの論理パスがあることを意味します。これが究極の解決策かもしれませんが、もっと賢い人がもっと良いアイデアを持っているのではないかと思います。
どんなアイデアでも大歓迎です。
ありがとう、マティアス