Я использую Google App Engine (GAE), Datastore (используя JDO) и делаю это на Java.
Я хочу, чтобы следующее произошло:
Скажем, у меня есть следующая модель: Card, у нее есть только одно поле, и это время создания (я называю это "toc").
Я хочу всегда извлекать 3 новейших объекта карты, когда выполняется GET-запрос. Скажем, у меня в настоящее время есть 5 объектов Карт в хранилище данных, называемом C1, C2... C5. Они вставляются в этом порядке, то есть C5 - это новейшая сущность.
Теперь я выполняю свой GET-запрос и, таким образом, получаю объекты: C5, C4 и C3. После того, как я использую сущности на стороне клиента, скажем, через 5 минут. Я хочу получить следующие 3 новых объекта. Но за эти 5 минут в Datastore добавлено 2 новых карты, теперь они выглядят следующим образом: C1, C2, C3, C4, C5, C6, C7.
Теперь я хочу получить C7, C6 и Карту, которая является самой новой, но еще не получена, что означает, что я также хочу C2. т.е. я хочу C7, C6 и C2.
Я экспериментировал с курсорами и, похоже, не получаю такого поведения. В настоящее время я использую запрос, который сортирует карты по возрастанию, то есть я сначала получаю самые старые Карты, а затем, когда я их пройду, Курсор может фактически обнаружить, когда новые записи были добавлены и их извлечены. Но если после последнего запроса было добавлено больше 3, все равно будут принимать первые 3 (вместо последних 3), то есть я получу 3 самых старых карты "новых" карт. Есть ли способ получить "конечный курсор", фактически не дойдя до конца? Если есть, я смогу жить с получением 3 самых старых новейших Карт.
Реальное приложение: Представьте себе 9GAG Свежая категория: Новые записи всегда на вершине (легко). НО в моем приложении предыдущие, скорее всего, больше никогда не будут замечены, то есть я хочу избежать повторения. Поэтому он должен расставлять приоритеты в отношении новых записей, и когда нет новых "Карт", он будет продолжаться там, где вы в последний раз останавливались.
Извините за текст! И спасибо за любую обратную связь! :)
Спасибо @Bharath за то, что вдохновили меня/заставили меня думать другими способами. Мое решение вдохновлено вашим решением. Однако ваше решение было слишком упрощенным, поскольку я мог получать только самые новые записи, в то время как я действительно хотел старых, если не было новых, и они могли бы вернуться к предыдущей позиции.
Мое решение работает следующим образом:
Если у меня есть записи: C5, C4, C3, C2, C1. Они сортируются по ASC, что означает, что это самая новая запись.
Как и в примере в OP, я хочу получить 3 карты. Затем я извлекаю C5, C4 и C3 и сохраняю временную метку C5 как "новейшее время" и сохраняю временную метку C3 как "oldestTime" на клиенте. С этими двумя я могу моделировать поведение курсора в хранилище данных.
В следующий раз, когда я получаю Карты, я сначала пытаюсь получить Карты с отметкой времени больше, чем "newestTime", что означает, что они новее. Если я получу меньше трех результатов, я попытаюсь получить оставшееся количество Карт, получив Карты, у которых есть отметка времени, которая ниже, чем "oldestTime", что означает, что они являются вопросами, которые я не получил. Таким образом, "oldestTime" работает как курсор, указывающий на последнюю введенную вами запись. Когда запросы "newestTime" и "oldestTime" возвращают менее трех результатов, это означает, что больше нет "невидимых" результатов, что означает, что мы должны перезапускаться с самого начала, поэтому мы извлекаем оставшиеся Карты из begin (и принудительно обновить "oldestTime"). Результатом точного поведения я описал в OP.
Некоторые мысли. Я предполагаю, что это решение более неэффективно, чем использование курсоров, поскольку мне всегда приходится фильтровать по меткам времени, это правильное предположение или что то, что курсоры делают, но внутренне?
я дам работу, чтобы получить то, что вы хотите... поскольку вы имеете дело с изменениями в реальном времени,