Методы разбиения на страницы с помощью Google App Engine - PullRequest
9 голосов
/ 21 января 2011

Я хочу реализовать разбиение на страницы для моего сайта, используя функцию курсора в GAE (Java).Однако есть только курсор вперед;Обратные курсоры не реализованы в App Engine SDK 1.4.0.Таким образом, для реализации функциональности предыдущей страницы предлагается сохранить страницу курсора в memchache.Но мой вопрос: когда новая запись будет добавлена ​​в хранилище данных, старые курсоры для соответствующих страниц станут недействительными.Как мне справиться с такими ситуациями?

Кто-нибудь уже реализовывал эту функцию с помощью курсоров в Java раньше?Пожалуйста, разработайте алгоритм для этого.

Кроме того, я не видел конкретной реализации / примера для того же в Java.Не могли бы вы поделиться некоторыми ссылками, если это возможно.

1 Ответ

9 голосов
/ 27 января 2011

Если ваше решение ajax-y, вы можете сохранить курсор (в виде строки) в массиве на стороне клиента в javascript, поэтому вам не нужно хранить его в memcache.

Когда данные добавляются (или удаляются / изменяются), старые курсоры не становятся недействительными. Вы все еще можете использовать их. В вашем случае они в основном представляют первый элемент на странице. Таким образом, единственное, что может произойти, это если вы находитесь на странице 3 результатов и переходите назад и затем вперед, вы можете не увидеть те же объекты, которые вы делали ранее на странице 3.

Например, если вы перешли со страницы 2 на страницу 3:

  • Страница 2 (курсор = x2) результаты: [d, e, f, ..., g]
  • Страница 3 (курсор = x3) результаты: [h, i, j, ...]

Тогда, если 'e' было удалено. Если вернуться назад, на странице 2 (курсор = x2) теперь будет отображаться [d, f, ..., g, h], и мы обновляем курсор x3, так как он изменился (мы проверяем его после каждой выборки () для страницы 2). В дальнейшем на странице 3 появятся [i, j, ...]

Точно так же, если вместо 'e2' будет добавлено после 'e', ​​возвращаясь к странице 2, мы получим [d, e, e2, f, ...] и x3 обновятся. И в будущем страница 3 будет содержать [g, h, i, j, ...]

Единственное предостережение: первая страница никогда не должна использовать курсор (в случае, если элементы добавляются до первой), и вы всегда должны разрешать пользователю «пытаться» перейти на следующую страницу, если элементы были добавлены после последнего результата.

Таким образом, номера страниц не будут очень конкретными, но они не могут быть такими, когда речь идет о страницах с данными, которые могут быть обновлены. Одна хитрость заключается в том, чтобы не использовать номера страниц, а пометить страницы как «данные, начинающиеся с элемента x» или что-то в этом роде.

Я не знаю никаких реализаций, но реализация должна быть довольно простой. Функциональность курсора довольно хорошо описана в документации: http://code.google.com/appengine/docs/java/datastore/queries.html#Query_Cursors

...