使用App Engine数据存储区查找重叠范围

问题描述:

我正在使用适用于CrimeWatch组织的应用程序的数据存储的JDO接口的Java App Engine for Java。我试图实现的功能之一是一个离开日志,人们报告他们将要离开很长一段时间(所以巡逻人员知道要留意房屋)。在应用程序中,我有一个AwayLogEntry对象,其中包含开始和结束日期,以及其他字段。使用App Engine数据存储区查找重叠范围

我需要向在特定时间段(通常是即将到来的一周)内巡逻谁在附近的人提供报告。我试图建立一个报告,给定两个日期查找所有与此范围重叠的AwayLogEntries。

查询我真的想用是

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

但是NOT子句是不允许的(无法找到这个文件,但它抛出一个异常,以这种效果),也不能使用与inequality filters两个字段,所以我不能直接查询不同的重叠情况。

我现在的解决方法并不是很好 - 我打算做一个日常的cron作业,当当前日期大于条目时删除(或者标记它们,如果我需要保留它们用于审核)结束日期。然后我可以查询开始日期小于报告结束日期的所有条目(如果我不删除它们,则不标记)。这将允许合理地报告接下来X天的条目(这是他们通常需要的),但不允许任意日期范围查询(我猜他们会要求),除非我只是将所有条目拉入并用代码进行过滤。

任何人都可以想到任何技巧来解决这个GAE JDO实现的限制吗?

+2

哇。如果我是盗贼,我会加入当地的犯罪观察组织。他们不仅给我一个喧哗的地方清单,而且当没有人会观看时! – 2010-10-05 07:52:02

+0

:)报告只提供给巡视员,而不是普通会员 - 但是,你必须相信你的巡视员。 – Andrew 2010-10-05 15:30:16

除了AwayLogEntry的开始和结束,您还可以拥有包含该人离开的所有日子列表的列表属性。

然后,您的查询过滤器可以检查dates > :reportStartDate and dates < :reportEndDate,它在单个支持的日期属性列表上组合了两个不等式过滤器。

+0

我会推荐这个,每周只有一个条目,因为这是报告的粒度。 – 2010-10-05 07:51:32

+0

完美 - GAE新手,因此以前没有使用过列表属性。谢谢! – Andrew 2010-10-05 15:31:50