2011-09-21 3 views
1

J'ai une application appengine qui fonctionne depuis environ un an, j'utilise principalement les requêtes JDO jusqu'à maintenant, mais j'essaie de collecter des statistiques et les requêtes sont en cours. trop long. J'ai l'entité suivante (périphérique)Comment sélectionner une propriété parmi d'autres?

public class Device implements Serializable{ 
    ... 
    @Persistent 
    private Set<Key> feeds;// Key for the Feed entity 
    ... 
} 

Je veux donc connaître le nombre de périphériques ayant un certain flux. Je le faisais en JDOQL avant en tant que tel (utilise javax.jdo.Query):

Query query = pm.newQuery("select from Device where feeds.contains(:feedKey)"); 
Map<String, Object> paramsf = new HashMap<String, Object>(); 
paramsf.put("feedKey",feed.getId()); 
List<Device> results = (List<Device>) query.executeWithMap(paramsf); 

Bien que cette fois de code maintenant. J'essayais d'utiliser l'API de Datastore pour pouvoir définir la taille de bloc, etc. pour voir si je pouvais accélérer la requête ou utiliser un curseur, mais je ne sais pas comment chercher dans un champ Set. Je tentais ce (utilise com.google.appengine.api.datastore.Query)

Query query = new Query("Device"); 
query.addFilter("feeds", FilterOperator.IN, feed.getId()); 
query.setKeysOnly(); 
final FetchOptions fetchOptions = FetchOptions.Builder.withPrefetchSize(100).chunkSize(100); 
QueryResultList<Entity> results = dss.prepare(query).asQueryResultList(fetchOptions); 

Essentiellement, je ne suis pas sûr comment rechercher dans les un-à-plusieurs déposés (flux) pour une seule touche. Est-il possible de l'indexer d'une manière ou d'une autre?

espoir il est logique ....

Répondre

1

listes (et d'autres choses qui sont mises en œuvre sous forme de listes, comme des ensembles) sont indexés individuellement. Par conséquent, vous pouvez simplement utiliser un filtre d'égalité dans votre requête, comme si vous filtriez sur une seule valeur plutôt que sur une liste. Un enregistrement sera renvoyé si l'un des éléments de la liste correspond.

+0

merci qui a fait l'affaire ... – siliconeagle

Questions connexes