2009-11-07 8 views
0

Je viens de remarquer un résultat étrange d'une requête que j'ai du mal à comprendre. Il semble que si l'ajout d'une commande() à une requête limite les résultats, je reviens à.Query/GqlQuery .order() restreignant le jeu de résultats?

Voici mon interaction:

>>> SomeModel.all().filter('action =', 'foo').order('created_at').count(), 
    SomeModel.all().filter('action =', 'foo').count() 
(192L, 293L) 

>>> SomeModel.all().filter('action =', 'foo').order('created_at').count(), 
    SomeModel.all().filter('action =', 'foo').count() 
(193L, 294L) 

Comme vous pouvez le voir, une centaine d'entités ne sont pas ajoutés entre les deux requêtes. Il semble que l'instruction order() limite le jeu de résultats. Mais created_at est une propriété obligatoire et est présent dans toutes les entités.

>>> count = 0 
>>> for entity in SomeModel.all().filter('action =', 'foo'): 
... if not entity.created_at: 
...  raise Exception, 'Not found!' 
... count += 1 
... 
>>> print count 
361 

Aucune exception. Alors pourquoi la requête avec l'ORDER ne retournerait-elle pas toutes les entités?

Enfin, l'enquête si elle est mauvaise données:

>>> print "ascending=%d no-filter=%d descending=%d" % (
     SomeModel.all().filter('action =', 'foo').order('created_at').count(), 
     SomeModel.all().filter('action =', 'foo').count(), 
     SomeModel.all().filter('action =', 'foo').order('-created_at').count()) 
ascending=79 no-filter=179 descending=173 
+0

On dirait que je suis toujours à court de 100 entités donc ce peut être de mauvaises données en quelque sorte. Je vais mettre à jour. – JasonSmith

+0

Si au lieu de compter vous utilisez len (SomeModel.all(). Filter ('action =', 'foo'). Order ('created_at') .fetch()), avez-vous toujours le même problème? Si oui, vous pourriez alors essayer de voir quel genre d'entités la commande est en train de tomber. – Bemmu

Répondre

0

Le problème a disparu en dépit de ne pas avoir changé mon code. La meilleure estimation que j'ai est peut-être que l'indice a pris du retard, même si j'avais supposé que si j'obtiens un retour réussi de put() alors les index sont mis à jour.