2010-10-05 3 views
3

J'utilise Google App Engine pour Java avec l'interface JDO pour le datastorage d'une application pour une organisation CrimeWatch. L'une des caractéristiques que j'essaie de mettre en œuvre est un journal de bord où les gens signalent quand ils vont s'absenter pendant une longue période de temps (de sorte que les patrouilles savent garder un œil sur les maisons). Dans l'application, j'ai un objet AwayLogEntry avec une date de début et de fin, et les autres champs nécessaires.Utilisation de la banque de données App Engine pour rechercher des plages qui se chevauchent

Je dois mettre un rapport à la disposition des personnes qui patrouillent dans le quartier de qui est absent au cours d'une période donnée (généralement la semaine à venir). J'essaye de construire un rapport qui donne deux dates trouve toutes les AwayLogEntries qui chevauchent avec cette gamme.

La requête que je veux vraiment utiliser est

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

mais la clause NOT est pas autorisé (n'a pas pu trouver de la documentation à ce sujet, mais il a lancé une exception à cet effet), ni utilise deux champs avec inequality filters donc je ne peux pas simplement interroger différents cas de chevauchement directement. Ma solution de contournement pour l'instant n'est pas géniale - je vais faire un travail quotidien cron qui supprime (ou les signale si je dois les garder pour auditer) loin des entrées de journal lorsque la date actuelle est plus grande que les entrées date de fin. Ensuite, je peux interroger toutes les entrées dont la date de début est inférieure à la date de fin du rapport (et n'est pas marqué si je ne les supprime pas). Cela permettra de rapporter raisonnablement les entrées pour les X jours suivants (ce dont ils ont habituellement besoin), mais ne permettra pas de requêtes de plages de dates arbitraires (ce que je suppose qu'elles demanderont) à moins que je ne tirez toutes les entrées et filtrez-les en code.

Quelqu'un peut-il penser à des trucs pour contourner cette limitation de la mise en œuvre de GAE JDO?

+2

Wow. Si j'étais un cambrioleur, je rejoindrais le groupe de surveillance du crime local. Non seulement ils me donnent une liste d'endroits à cogner, mais aussi quand personne ne regarde! –

+0

:) Le rapport est seulement disponible pour les patrouilleurs, pas pour l'ensemble des membres - mais oui, vous devez faire confiance à vos patrouilleurs. – Andrew

Répondre

3

Outre le début et la fin du AwayLogEntry, vous pouvez également avoir une propriété de liste contenant une liste de tous les jours où la personne est absente.

Votre filtre de requête peut alors rechercher dates > :reportStartDate and dates < :reportEndDate, qui combine deux filtres d'inégalité sur une seule liste de propriétés de date, qui est prise en charge.

+0

Je recommanderais ceci, seulement avec une entrée par semaine, puisque c'est la granularité de votre rapport. –

+0

Parfait - nouveau à GAE donc n'avait pas joué avec les propriétés de la liste avant. Merci! – Andrew

Questions connexes