Datastore. Query on Ancestor

103 views
Skip to first unread message

Blaise Gervais

unread,
Jun 20, 2011, 2:18:56 PM6/20/11
to google-a...@googlegroups.com
I everyone,

I have a class GAEDaoSupport who convert Object to Entity while copying properties. I have a JUnit test for this class who check the conversion and try to store and retrieve values.
When I try to store a List of Entity where the first is the ancestor and others are childs I can retrieve all of them by Key but a kindless Query on ancestor Key return nothing.. I suppose that I'va missed something but don't now what..

Here is my test case and the output...
GAEDaoSupport support = new GAEDaoSupport(RoleEntity.class);
RoleEntity object = newRelationsEntity();

DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
List<Entity> entities = support.createEntity(object);
System.out.println(" -- [1] Storing "+entities.size()+" entities -------");
System.out.println(entities);
List<Key> keys = ds.put(entities);
System.out.println("\t  \\-> Done. Keys : "+keys);

try {
// Pass...
Entity stored = ds.get(entities.get(0).getKey());
assertEquals(entities.get(0), stored);
 
 
// Pass...
for (final Entity child : entities.subList(1, entities.size())) {
assertEquals(child, ds.get(child.getKey()));
}

// Fail !!! , Result is empty
System.out.println();
System.out.println(" -- [2] Retrieving entities by ancestor ------------");
Query query = new Query()
.setAncestor(entities.get(0).getKey());
System.out.println("\t - Query : "+query);

List<Entity> childs = ds.prepare(query).asList(FetchOptions.Builder.withDefaults());
System.out.println("\t  \\-> Done : "+childs);
} catch (EntityNotFoundException e) {
fail(e.getMessage());
}

Output :
 -- [1] Storing 5 entities -------
[<Entity [RoleEntity("Role")]:
system = true
>
, <Entity [RoleEntity("Role")/Authorisations(no-id-yet)]:
access = r
>
, <Entity [RoleEntity("Role")/Authorisations(no-id-yet)]:
access = w
>
, <Entity [RoleEntity("Role")/UserEntity("0")]:
enabled = true
username = User0
lastLogin = null
email = null
expiration = null
password = null
>
, <Entity [RoleEntity("Role")/UserEntity("1")]:
enabled = true
username = User1
lastLogin = null
email = null
expiration = null
password = null
>
]
 \-> Done. Keys : [RoleEntity("Role"), RoleEntity("Role")/Authorisations(1), RoleEntity("Role")/Authorisations(2), RoleEntity("Role")/UserEntity("0"), RoleEntity("Role")/UserEntity("1")]
 
 -- [2] Retrieving entities by ancestor ------------
- Query : SELECT * WHERE __ancestor__ is RoleEntity("Role")
 \-> Done : []

My test case use a simple LocalServiceTestHelper , like described into the gae documentation :
private final LocalServiceTestHelper helper =
       new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());
 
 

Gervais.b

unread,
Jun 23, 2011, 5:47:56 AM6/23/11
to Google App Engine
After more test it seems that I can retrieve ancestor's childs for a
Kind but without Kind the query won't work.

On Jun 20, 8:18 pm, Blaise Gervais <gervai...@gmail.com> wrote:
> I everyone,
>
> I have a class *GAEDaoSupport* who convert *Object* to *Entity* while
> copying properties. I have a JUnit test for this class who check the
> conversion and try to store and retrieve values.
> When I try to store a *List* of *Entity* where the first is the ancestor and
> others are childs I can retrieve all of them by *Key *but a kindless *Query* on
> ancestor *Key* return nothing.. I suppose that I'va missed something but
> don't now what..
>
> Here is my test case and the output...
>
> > GAEDaoSupport support = *new *GAEDaoSupport(RoleEntity.*class*);
> > RoleEntity object = newRelationsEntity();
>
> > DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
> > List<Entity> entities = support.createEntity(object);
> > System.out.println(" -- [1] Storing "+entities.size()+" entities -------"
> > );
> > System.out.println(entities);
> > List<Key> keys = ds.put(entities);
> > System.out.println("\t  \\-> Done. Keys : "+keys);
>
> > *try *{
> > // Pass...
> > Entity stored = ds.get(entities.get(0).getKey());
> >  assertEquals(entities.get(0), stored);
>
>  // Pass...
>
>
>
>
>
>
>
>
>
> > *for *(*final *Entity child : entities.subList(1, entities.size())) {
> >  assertEquals(child, ds.get(child.getKey()));
> > }
>
> >  // Fail !!! , Result is empty
> > System.out.println();
> >  System.out.println(" -- [2] Retrieving entities by ancestor
> > ------------");
> > Query query = new Query()
> >  .setAncestor(entities.get(0).getKey());
> > System.out.println("\t - Query : "+query);
>
> > List<Entity> childs =
> > ds.prepare(query).asList(FetchOptions.Builder.withDefaults());
> >  System.out.println("\t  \\-> Done : "+childs);
> > } *catch *(EntityNotFoundException e) {
> My test case use a simple *LocalServiceTestHelper *, like described into the
> gae documentation :
>
>
>
>
>
>
>
> > *private final* LocalServiceTestHelper helper =
> >         *new *LocalServiceTestHelper(*new *
> > LocalDatastoreServiceTestConfig());
Reply all
Reply to author
Forward
0 new messages