

お世話になっております。  
現在GAEでPagination処理をしているのですが、offsetはDatastore
Readの回数や、指定できる数値に制限があるのでCursorを使用してPaginationをしようと思っています。

そこで質問なのですが、Cursorは次のページは取得できるのですが、任意のページを取得したい場合、offsetが指定できないのでどのようにすればいいのか困っています。

例えば10ページのコンテンツがあるとして、4ページ目のコンテンツを取得する方法が知りたいです。Cursorを拡張する方法も考えたのですが、filan
classのようでできません。

宜しくお願い致します。


CC BY-SA 3.0
2016-02-04T06:50:17.687
21698
2017-03-16T00:27:35.153
297
question
google-app-engine
GAEのPaginationについて


DatastoreでPaginationするの結構難しいですねー。  
僕は大抵UIをReadMoreにしてしまって、Paginationは作っていません。

作るとすれば  
1ページ20件で、30ページぐらいまでしか、ほとんど見ることが無いという状況なら、Query.KeysOnlyで、500件ぐらい取ってきて、メモリ上で指定されたページまで読み飛ばす感じでしょうか。  
パフォーマンスを向上させるために、一度検索したら、条件とCursorをMemcacheに入れておくと、データが変わらない限りは、Memcacheから持ってこれます。


CC BY-SA 3.0
2016-02-04T09:28:30.460
21703
2016-02-04T09:28:30.460
4361
21698
answer


bootstrapのページネーションのようなページ番号ボタンを出して直接指定ページにとぶのは処理時間の関係できついですよね。  
Cursorのstartとクエリlimitを使ってキーだけのクエリを2回呼べば、前のページと次のページがあるかどうかを判断できますので、次へボタンと前へボタン（活性非活性つき）でのページングは実現できます。

[code]

    // 現在のページを検索
    Query<Store> query = ofy().load().type(T.class).order("-created").limit(limit).startAt(cursor);
    
    Cursor nextCursor = 現在のページの最後の行のCursor
    
    // 前のページを逆順で検索
    QueryKeys<T> prevQuery = ofy().load().type(T.class).order("created")
                    .limit(limit).startAt(Cursor.fromWebSafeString(cursor))
                    .keys();
    
    // 次のページがあるかを検索
    ofy().load().type(T.class).order("-created")
                .startAt(Cursor.fromWebSafeString(nextCursor)).limit(1)
                .keys().iterator().hasNext()
    
[/code]


CC BY-SA 3.0
2017-03-14T10:42:19.767
33312
2017-03-16T00:27:35.153
2017-03-16T00:27:35.153
21051
21051
21698
answer