简体   繁体   中英

Google App Engine DataStore - How to select parent entities from keys of a child table in Java in an efficient way?

I am trying translate this Python code to Java from the presentation Building Scalable, Complex Apps on App Engine ,

Is there support on GAEJ to do this?

indexes = db.GqlQuery( "SELECT __key__ FROM MessageIndex " "WHERE receivers = :1", me)
keys = [k.parent() for k in indexes] 
messages = db.get(keys)

Below my implementation in Java. Are these functional and performance wise equivalent? What happens if i have large number of keys?

Query query1 = new Query("MessageIndex");
query1.setKeysOnly();
query1.addFilter("receivers", FilterOperator.EQUAL, me);

PreparedQuery pq2 = datastore.prepare(query1);

Iterable<Entity> entities = pq2.asIterable();
HashSet<Key> keys = new HashSet<Key>();
    for (Entity en : entities)
       keys.add(en.getParent());

Query query2 = new Query("Messages");
query2.addFilter("__key__", FilterOperator.IN, keys);

As @Rick already noted, gets are much faster and cheaper than queries. You just need to change the last part of your code. Instead of:

Query query2 = new Query("Messages");
query2.addFilter("__key__", FilterOperator.IN, keys);

just do:

Map<Key,Entity> messages = datastore.get(keys);

Look atthe DatastoreService API https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/DatastoreService

DatastoreService.get(keys) is much more efficient than a query with the keys.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM