String expectedBidirKind, String expectedUnidirKind,
int count) throws EntityNotFoundException {
pojo.setVal("yar");
bidir2.setChildVal("another yam");
bidir3.setChildVal("yet another yam");
UnidirTop unidir = newUnidir(UnidirLevel.Top);
UnidirTop unidir2 = newUnidir(UnidirLevel.Bottom);
UnidirTop unidir3 = newUnidir(UnidirLevel.Middle);
unidir2.setStr("another str");
unidir3.setStr("yet another str");
pojo.addUnidirChild(unidir);
pojo.addUnidirChild(unidir2);
pojo.addUnidirChild(unidir3);
pojo.addBidirChild(bidir1);
pojo.addBidirChild(bidir2);
pojo.addBidirChild(bidir3);
startEnd.start();
pm.makePersistent(pojo);
startEnd.end();
assertCountsInDatastore(pojo.getClass(), bidir1.getClass(), count, (count-1) * 2 + 3);
startEnd.start();
pojo = pm.getObjectById(pojo.getClass(), pojo.getId());
String bidir1Id = pojo.getBidirChildren().iterator().next().getId();
String unidir1Id = pojo.getUnidirChildren().iterator().next().getId();
pojo.removeBidirChildAtPosition(0);
pojo.removeUnidirChildAtPosition(0);
startEnd.end();
startEnd.start();
assertNotNull(pojo.getId());
assertEquals(2, pojo.getUnidirChildren().size());
assertEquals(2, pojo.getBidirChildren().size());
Entity pojoEntity = ds.get(KeyFactory.stringToKey(pojo.getId()));
assertNotNull(pojoEntity);
assertEquals(3, pojoEntity.getProperties().size());
assertEquals(Utils.newArrayList(
KeyFactory.stringToKey(bidir2.getId()),
KeyFactory.stringToKey(bidir3.getId())), pojoEntity.getProperty("bidirChildren"));
assertEquals(Utils.newArrayList(
KeyFactory.stringToKey(unidir2.getId()),
KeyFactory.stringToKey(unidir3.getId())), pojoEntity.getProperty("unidirChildren"));
startEnd.end();
try {
ds.get(KeyFactory.stringToKey(bidir1Id));
fail("expected EntityNotFoundException");
} catch (EntityNotFoundException enfe) {
// good
}
try {
ds.get(KeyFactory.stringToKey(unidir1Id));
fail("expected EntityNotFoundException");
} catch (EntityNotFoundException enfe) {
// good
}
Entity bidirChildEntity = ds.get(KeyFactory.stringToKey(bidir2.getId()));
assertNotNull(bidirChildEntity);
assertEquals(expectedBidirKind, bidirChildEntity.getKind());
int numProps = bidir2.getPropertyCount();
if (hasIndexPropertyInChild(pm)) {
numProps += getIndexPropertyCount();
}
assertEquals(numProps, bidirChildEntity.getProperties().size());
assertEquals(bidir2.getClass().getName(), bidirChildEntity.getProperty("DISCRIMINATOR"));
assertEquals("another yam", bidirChildEntity.getProperty("childVal"));
assertEquals(KeyFactory.stringToKey(bidir2.getId()), bidirChildEntity.getKey());
PolymorphicTestUtils.assertKeyParentEquals(pojo.getId(), bidirChildEntity, bidir2.getId());
if (isIndexed() && hasIndexPropertyInChild(pm)) {
assertEquals(0L, bidirChildEntity.getProperty("bidirChildren_INTEGER_IDX"));
}
bidirChildEntity = ds.get(KeyFactory.stringToKey(bidir3.getId()));
assertNotNull(bidirChildEntity);
assertEquals(expectedBidirKind, bidirChildEntity.getKind());
numProps = bidir3.getPropertyCount();
if (hasIndexPropertyInChild(pm)) {
numProps += getIndexPropertyCount();
}
assertEquals(numProps, bidirChildEntity.getProperties().size());
assertEquals(bidir3.getClass().getName(), bidirChildEntity.getProperty("DISCRIMINATOR"));
assertEquals("yet another yam", bidirChildEntity.getProperty("childVal"));
assertEquals(KeyFactory.stringToKey(bidir3.getId()), bidirChildEntity.getKey());
PolymorphicTestUtils.assertKeyParentEquals(pojo.getId(), bidirChildEntity, bidir2.getId());
if (isIndexed() && hasIndexPropertyInChild(pm)) {
assertEquals(1L, bidirChildEntity.getProperty("bidirChildren_INTEGER_IDX"));
}
Entity unidirChildEntity = ds.get(KeyFactory.stringToKey(unidir2.getId()));
assertNotNull(unidirChildEntity);
assertEquals(expectedUnidirKind, unidirChildEntity.getKind());
numProps = unidir2.getPropertyCount();
if (hasIndexPropertyInChild(pm)) {
numProps += getIndexPropertyCount();
}
assertEquals(numProps, unidirChildEntity.getProperties().size());
assertEquals(UnidirLevel.Bottom.discriminator, unidirChildEntity.getProperty("TYPE"));
assertEquals("another str", unidirChildEntity.getProperty("str"));
assertEquals(KeyFactory.stringToKey(unidir2.getId()), unidirChildEntity.getKey());
PolymorphicTestUtils.assertKeyParentEquals(pojo.getId(), unidirChildEntity, unidir2.getId());
if (isIndexed() && hasIndexPropertyInChild(pm)) {
assertEquals(0L, unidirChildEntity.getProperty("unidirChildren_INTEGER_IDX"));
}
unidirChildEntity = ds.get(KeyFactory.stringToKey(unidir3.getId()));
assertNotNull(unidirChildEntity);
assertEquals(expectedUnidirKind, unidirChildEntity.getKind());
assertEquals(UnidirLevel.Middle.discriminator, unidirChildEntity.getProperty("TYPE"));
assertEquals("yet another str", unidirChildEntity.getProperty("str"));
assertEquals(KeyFactory.stringToKey(unidir3.getId()), unidirChildEntity.getKey());
PolymorphicTestUtils.assertKeyParentEquals(pojo.getId(), unidirChildEntity, unidir2.getId());
if (isIndexed() && hasIndexPropertyInChild(pm)) {
assertEquals(1L, unidirChildEntity.getProperty("unidirChildren_INTEGER_IDX"));
}
Entity parentEntity = ds.get(KeyFactory.stringToKey(pojo.getId()));
assertNotNull(parentEntity);
assertEquals(3, parentEntity.getProperties().size());
assertEquals("yar", parentEntity.getProperty("val"));
assertEquals(Utils.newArrayList(
KeyFactory.stringToKey(bidir2.getId()),
KeyFactory.stringToKey(bidir3.getId())), parentEntity.getProperty("bidirChildren"));
assertEquals(Utils.newArrayList(
KeyFactory.stringToKey(unidir2.getId()),
KeyFactory.stringToKey(unidir3.getId())), parentEntity.getProperty("unidirChildren"));
assertCountsInDatastore(pojo.getClass(), bidir2.getClass(), count, 2 * count);
}