Как использовать курсоры для перехода на предыдущие страницы с помощью GQL и нового API gcloud-java?
Я использую новый API gcloud-java ( https://github.com/GoogleCloudPlatform/gcloud-java/tree/master/gcloud-java-datastore/src/main/java/com/google/cloud/datastore) для работа с облачным хранилищем данных Мой конкретный вопрос об использовании GQL для разбивки на страницы курсорами. Мне удалось пролистать результаты по одной странице за раз в прямом направлении с помощью курсоров, но мне не повезло с переходом назад.
Пример сценария:
Допустим, у меня есть 20 сущностей в своем роде с идентификаторами от 1 до 20. У меня размер страницы 5. Как только я нахожусь на 3-й странице (идентификаторы с 11 по 15), если мне нужно вернуться на одну страницу назад; т.е. получить идентификаторы с 6 по 10, что будет правильным GQL/ примером кода? Опять же, я предпочитаю не использовать смещение с числом, но хотел бы использовать курсоры.
Из того, что я могу сказать (на самом деле проверено), похоже, что нужно отслеживать курсоры Start / End для каждой страницы, когда они перемещаются в прямом направлении, а затем использовать сохраненные курсоры, когда необходимо вернуться назад. Я просто хочу убедиться, что это правильный / единственный способ или есть более простой способ сделать это.
Заранее спасибо за помощь.
1 ответ
Если вы добавите в свой исходный запрос сортировку по ключу (добавленную в конец предложения "order by"), вы сможете изменить порядок сортировки каждого свойства и использовать последний курсор из исходного запроса, чтобы получить результаты в обратном порядке.
Предположим, вы перебрали некоторые значения из вашего прямого запроса QueryResults
, Ты можешь позвонить QueryResults
"s cursorAfter()
метод, который будет возвращать курсор, указывающий сразу после последнего результата, который вы увидели в исходном запросе. Теперь вы можете выполнить новый запрос (с противоположным порядком сортировки для каждого свойства, включая свойство ключа), используя этот курсор в качестве начального курсора. Возможно, вы захотите пропустить первый результат, так как это будет последний результат, который вы увидели в исходном запросе.