2010-02-06 5 views
2

Je me rends compte qu'il y a déjà beaucoup de questions sur l'interrogation de la banque de données App Engine, mais je souhaite obtenir des opinions sur mon cas particulier. Je demande des scores pour construire une table de score élevé, donc je les veux classés par score décroissant. Maintenant, il est possible que deux partitions aient la même valeur de score, il n'est donc pas possible de paginer en fonction de cette valeur, car vous pourriez finir par ignorer les scores en fonction du filtre de la page.Types de requête avancée Java App Engine

Je veux construire la requête autour d'une date dynamique. Par exemple, les 10 meilleurs scores au cours du dernier mois. Quelle est la meilleure manière de s'occuper de ça?

Je ne veux évidemment pas avoir à parcourir chaque partition à chaque fois. Dois-je charger ces scores dans le memcache et mettre à jour quand un score soumis est supérieur à un dans le top 10? Cela n'a pas de sens parce que je devrais définir mes plages de temps à l'avance, mais mettre en place un cron pour le rafraîchir tous les jours pour obtenir les scores qui ont atteint la limite de temps serait faisable. Cela peut-il être fait efficacement dynamique? Une autre option serait d'avoir juste un cron à travers tous les scores toutes les N heures ou quelque chose, mais je préfèrerais vraiment éviter de devoir faire cela.

Y a-t-il de la documentation qui m'aiderait à prendre ces décisions?

+0

Une pensée est de construire la requête avec N nombre de conditions de N nombre de jours. Par exemple. setFilter ("date == il ya 5 jours || date == il y a 4 jours ..." Le problème que j'ai avec ceci est comment interroger seulement la partie date de la variable datetime. "date == '2010-02 -06 '"ne semble pas fonctionner, ni" date.date ==' 2010-02-06 '" – Richard

Répondre

0

Trois options:

  1. Vous pouvez encore paginate la façon « naïve » - toutes les requêtes ont leur clé comme un ordre de tri final implicite, donc vous avez juste besoin d'inclure la clé dans votre mise en page.
  2. Utilisez le nouveau support de curseur de requête
  3. Faites ce que les auteurs de this library ont fait, et de construire une arborescence d'entrées de score.
+0

J'ai utilisé un PagerQuery et fait une vérification sur les propriétés de l'entité. – Richard

0

Donc, voici une solution que je dois travailler, mais probablement pas la meilleure façon de faire les choses.

Dans ma classe Score, j'ai ajouté une variable Long. Lorsque je définis la date, j'enlève les heures, les minutes, les secondes et les millisecondes et je fais un getTime(). Lorsque la requête se produit pour N jours ou N mois de scores, je vais générer plusieurs jours de vérification d'égalité sur la chaîne de requête: "dateAsLong == N jours || dateAsLong == N - il y a 1 jours "etc etc etc

Cette requête fonctionne jusqu'à 29 jours dans le passé avant que j'attrape un" argument illégal "lors d'une tentative de .execute(). Je suppose que je frappe une sorte de maximum sur la longueur de la requête ou le nombre de filtres. Plus long, il faudrait que la requête soit divisée, ce qui est très faisable. Les listes peuvent ensuite être prises et ajoutées. La limitation de faire de cette façon est le temps et la CPU que prend la demande. Lors de l'interrogation des 29 derniers jours, la requête prend environ 550ms et 750ms de temps processeur.