1

J'utilise le magasin de données de Google App Engine (DataNucleus). J'ai deux classes, une conversation et une évaluation. Un chat peut être évalué plus que les uns donc j'ai créé une relation un-plusieurs en ajoutant une liste à la classe Chat.Le magasin de données App Engine obtient le nombre d'enfants de plusieurs parents

Maintenant, je veux connaître le nombre de chats non notés, alors je l'ai comme suit:

int numberOfChatsInStock = 0; 
for(Chat chat : chats){ 
    if(chat.getRatings().size() == 0){ 
    numberOfChatsInStock++; 
    } 
} 

Il parcourons simplement tous les chats et vérifie si le nombre d'évaluations est 0.

Cette solution fonctionne bien quand il y a 10 chats, mais quand j'ai plus de 500 chats alors la vitesse est terrible (15 sec +).

Je pensais que la méthode size() est peut-être plus rapide. J'ai donc essayé Query.setFilter ("ratings.size() == 0") mais cela me donne l'erreur suivante: Méthode non supportée lors de l'analyse de l'expression: InvokeExpression {[PrimaryExpression {ratings}]. Size()}

Est-il possible d'augmenter la vitesse?

EDIT DE REACTION DataNucleus EXPERT:

C'est le plugin Google, et ils en sont responsables (et le fait qu'ils ne sont pas mis en œuvre cette méthode est leur problème ... Je suis sûr leur banque de données offre un moyen d'obtenir la taille d'une collection). Leur plugin utilise seulement DataNucleus 1.1 et nous développons actuellement 2.2. Comme vous pouvez le deviner, nous n'avons pas beaucoup de temps pour l'environnement GAE/J. Pourquoi google utilise-t-il la version 1.1 de google?

Répondre

0

Vous devez conserver un nombre d'évaluations sur le modèle de conversation. Vous pouvez ensuite exécuter une requête pour sélectionner toutes les conversations avec 0 note.

+0

Je pensais à cela plus tôt, mais je pensais que ce n'est pas la meilleure façon de résoudre le problème parce que je devrais garder le compte à jour tout le temps. Quoi qu'il en soit, pour l'instant je vais travailler avec ça, merci. –

+0

Lorsque vous développez pour bigtable GAE (ou de nombreuses autres bases de données nosql), vous avez souvent besoin de dénormaliser et précalculer si vous voulez des requêtes efficaces. Sinon, vous finirez par devoir parcourir de nombreuses données, ce qui peut être acceptable ou non. –

Questions connexes