Использование хранилища данных App Engine для поиска перекрывающихся диапазонов - PullRequest
3 голосов
/ 05 октября 2010

Я использую Google App Engine для Java с интерфейсом JDO для хранилища данных для приложения для организации CrimeWatch. Одна из функций, которую я пытаюсь реализовать, - это журнал посещений, где люди сообщают, когда они собираются отсутствовать в течение длительного периода времени (поэтому патрули знают, что следят за домами). В приложении у меня есть объект AwayLogEntry с начальной и конечной датой, а также другие необходимые поля.

Мне нужно сделать отчет доступным для людей, которые патрулируют окрестности тех, кто отсутствует в данный период времени (обычно в предстоящую неделю). Я пытаюсь создать отчет, который с учетом двух дат находит все AwayLogEntries, которые перекрываются с этим диапазоном.

Запрос, который я действительно хочу использовать:

select * from AwayLogEntry where not(end < :reportStartDate || start > :reportEndDate)

однако предложение NOT недопустимо (не удалось найти документацию по этому поводу, но оно вызвало исключение), а также не использует два поля с фильтрами неравенства , поэтому я не могу просто запросить для разных случаев перекрытия напрямую.

Мой обходной путь на данный момент невелик - я собираюсь сделать ежедневную работу cron, которая удаляет (или помечает их, если мне нужно сохранить их для аудита), удаляя записи журнала, когда текущая дата больше, чем конец записей Дата. Затем я могу запросить все записи, чья дата начала меньше даты окончания отчета (и не помечается, если я не удаляю их). Это позволит разумно сообщать о записях за следующие X дней (что обычно требуется), но не разрешает произвольные запросы в диапазоне дат (которые, я предполагаю, они будут запрашивать), если только я вытащите все записи и отфильтруйте их в коде.

Может кто-нибудь придумать какие-нибудь хитрости, чтобы обойти это ограничение реализации GAE JDO?

1 Ответ

3 голосов
/ 05 октября 2010

В дополнение к началу и концу AwayLogEntry, вы также можете иметь свойство list, содержащее список всех дней, когда человек отсутствовал.

Ваш фильтр запросов может затем проверить на dates > :reportStartDate and dates < :reportEndDate, который объединяет два фильтра неравенства в одном списке свойств даты, который поддерживается.

...