2011-01-20 8 views
9

Chcę zaimplementować podział na strony dla mojej witryny za pomocą funkcji kursora GAE (Java). Jednak jest tylko kursor do przodu; kursory wsteczne nie są implementowane od App Engine SDK 1.4.0. Tak więc, aby zaimplementować poprzednią funkcjonalność strony, sugeruje się, aby zapamiętać stronę kursora w memchache. Ale moje pytanie brzmi - kiedy nowy rekord zostanie dodany do datastore, stare kursory dla poszczególnych stron staną się nieważne. Jak radzić sobie z takimi sytuacjami?Techniki paginacji za pomocą Google App Engine

Czy ktoś już wcześniej zaimplementował tę funkcję za pomocą kursorów w języku Java? Uprzejmie opracuj algorytm dla tego.

Ponadto, nie widziałem konkretnej implementacji/przykład tego samego w Javie. Czy mógłbyś udostępnić kilka linków, jeśli to możliwe.

Odpowiedz

9

Jeśli twoje rozwiązanie to ajax-y, możesz utrzymywać kursor (jako ciąg) w tablicy po stronie klienta w javascript, więc nie musisz zapisywać go w memcache.

Po dodaniu danych (lub usunięciu/zmianie) stare kursory nie zostaną unieważnione. Nadal możesz z nich korzystać. W twoim przypadku stanowią one po prostu pierwszy element na stronie. Jedyne co może się zdarzyć, to jeśli jesteś na stronie 3 wyników i nawigujesz wstecz, a następnie do przodu, możesz nie zobaczyć dokładnie tych samych obiektów, co wcześniej na stronie 3.

Na przykład, jeśli poszedłeś ze strony 2 na stronie 3:

  • strony 2 (kursor = x2) wyniki: [d, e, f, ..., g]
  • strona 3 (kursor = x3) wyniki: [H, I, J , ...]

Następnie, jeśli "e" zostało usunięte. Przechodząc do tyłu, strona 2 (kursor = x2) pokaże teraz [d, f, ..., g, h], a my zmienimy kursor x3, ponieważ się zmienił (sprawdzamy go po każdym pobraniu() dla strony 2). Idąc dalej, strona 3 będzie teraz miała [i, j, ...]

Podobnie, jeśli zamiast tego "e2" zostanie dodane po "e", wracając do strony 2, będziemy mieli [d, e, e2, f, ...] i x3 zostaje zaktualizowany. I dalej, strona 3 będzie zawierała [g, h, i, j, ...]

Jedyne zastrzeżenie to pierwsza strona nie powinna nigdy używać kursora (w przypadku, gdy elementy zostaną dodane przed pierwszym), oraz powinieneś zawsze pozwolić użytkownikowi "spróbować", aby przejść do następnej strony, na wypadek gdyby elementy zostały dodane po ostatnim wyniku.

Tak więc numery stron nie będą zbyt szczegółowe, ale tak naprawdę nie mogą być w przypadku danych stronicowanych, które można zaktualizować. Jedna z nich polega na tym, aby nie używać numerów stron, ale oznaczać strony jako "dane zaczynające się od elementu x" lub coś w tym stylu.

Nie znam żadnych implementacji, ale powinna być ona dość prosta w realizacji. Funkcjonalność kursora jest dość dobrze opisana w dokumentach: http://code.google.com/appengine/docs/java/datastore/queries.html#Query_Cursors