use of com.google.appengine.api.datastore.Key in project siena by mandubian.
the class GaePersistenceManager method _deleteSingle.
private void _deleteSingle(Object obj, List<Key> keys, final Key parentKey, final ClassInfo parentInfo, final Field parentField) {
Class<?> clazz = obj.getClass();
ClassInfo info = ClassInfo.getClassInfo(clazz);
Key key;
if (parentKey == null) {
key = GaeMappingUtils.getKey(obj);
} else {
key = GaeMappingUtils.getKeyFromParent(obj, parentKey, parentInfo, parentField);
}
// cascading on aggregated fields
if (!info.aggregatedFields.isEmpty()) {
for (Field f : info.aggregatedFields) {
if (ClassInfo.isModel(f.getType())) {
Object aggObj = Util.readField(obj, f);
_deleteSingle(aggObj, keys, key, info, f);
} else if (ClassInfo.isMany(f)) {
Many<?> lq = (Many<?>) Util.readField(obj, f);
if (!lq.asList().isEmpty()) {
_deleteMultiple(lq.asQuery().fetchKeys(), keys, key, info, f);
}
}
}
}
keys.add(key);
}
use of com.google.appengine.api.datastore.Key in project siena by mandubian.
the class GaePersistenceManager method get.
public <T> int get(Iterable<T> objects) {
List<Key> keys = new ArrayList<Key>();
for (Object obj : objects) {
keys.add(GaeMappingUtils.getKey(obj));
}
Map<Key, Entity> entityMap = ds.get(keys);
for (Object obj : objects) {
Entity e = entityMap.get(GaeMappingUtils.getKey(obj));
if (e != null) {
GaeMappingUtils.fillModel(obj, e);
}
}
return entityMap.size();
}
use of com.google.appengine.api.datastore.Key in project siena by mandubian.
the class GaePersistenceManager method _insertMultiple.
private <T> int _insertMultiple(Iterable<T> objects) {
List<Entity> entities = new ArrayList<Entity>();
for (Object obj : objects) {
Class<?> clazz = obj.getClass();
ClassInfo info = ClassInfo.getClassInfo(clazz);
if (info.hasAggregator) {
Relation rel = (Relation) Util.readField(obj, info.aggregator);
if (rel != null && rel.mode == RelationMode.AGGREGATION) {
ClassInfo parentInfo = ClassInfo.getClassInfo(rel.target.getClass());
Key parentKey = GaeMappingUtils.makeKey(parentInfo, rel.target);
_insertAddEntity(entities, obj, info, parentKey, parentInfo, (Field) rel.discriminator);
} else {
_insertAddEntity(entities, obj, info, null, null, null);
}
} else {
_insertAddEntity(entities, obj, info, null, null, null);
}
}
return _insertPutEntities(entities, objects);
}
use of com.google.appengine.api.datastore.Key in project siena by mandubian.
the class GaePersistenceManager method mapJoins.
protected <T> T mapJoins(Query<T> query, T model) {
try {
// join queries
Map<Field, ArrayList<Key>> fieldMap = GaeQueryUtils.buildJoinFieldKeysMap(query);
// creates the list of joined entity keys to extract
for (Field field : fieldMap.keySet()) {
Key key = GaeMappingUtils.getKey(field.get(model));
List<Key> keys = fieldMap.get(field);
if (!keys.contains(key))
keys.add(key);
}
Map<Field, Map<Key, Entity>> entityMap = new HashMap<Field, Map<Key, Entity>>();
try {
// retrieves all joined entities per field
for (Field field : fieldMap.keySet()) {
Map<Key, Entity> entities = ds.get(fieldMap.get(field));
entityMap.put(field, entities);
}
} catch (Exception ex) {
throw new SienaException(ex);
}
// associates linked models to their models
// linkedModels is just a map to contain entities already mapped
Map<Key, Object> linkedModels = new HashMap<Key, Object>();
Object linkedObj;
Entity entity;
for (Field field : fieldMap.keySet()) {
Object objVal = field.get(model);
Key key = GaeMappingUtils.getKey(objVal);
linkedObj = linkedModels.get(key);
if (linkedObj == null) {
entity = entityMap.get(field).get(key);
linkedObj = objVal;
GaeMappingUtils.fillModel(linkedObj, entity);
linkedModels.put(key, linkedObj);
}
field.set(model, linkedObj);
}
return model;
} catch (IllegalAccessException ex) {
throw new SienaException(ex);
}
}
use of com.google.appengine.api.datastore.Key in project siena by mandubian.
the class GaePersistenceManager method mapJoins.
protected <T> List<T> mapJoins(Query<T> query, List<T> models) {
try {
// join queries
Map<Field, ArrayList<Key>> fieldMap = GaeQueryUtils.buildJoinFieldKeysMap(query);
// creates the list of joined entity keys to extract
for (final T model : models) {
for (Field field : fieldMap.keySet()) {
Object objVal = Util.readField(model, field);
// our object is not linked to another object...so it doesn't have any key
if (objVal == null) {
continue;
}
Key key = GaeMappingUtils.getKey(objVal);
List<Key> keys = fieldMap.get(field);
if (!keys.contains(key))
keys.add(key);
}
}
Map<Field, Map<Key, Entity>> entityMap = new HashMap<Field, Map<Key, Entity>>();
try {
// retrieves all joined entities per field
for (Field field : fieldMap.keySet()) {
Map<Key, Entity> entities = ds.get(fieldMap.get(field));
// gets the future here because we need it so we wait for it
entityMap.put(field, entities);
}
} catch (Exception ex) {
throw new SienaException(ex);
}
// associates linked models to their models
// linkedModels is just a map to contain entities already mapped
Map<Key, Object> linkedModels = new HashMap<Key, Object>();
Object linkedObj;
Entity entity;
for (final T model : models) {
for (Field field : fieldMap.keySet()) {
Object objVal = Util.readField(model, field);
// our object is not linked to another object...so it doesn't have any key
if (objVal == null) {
continue;
}
Key key = GaeMappingUtils.getKey(objVal);
linkedObj = linkedModels.get(key);
if (linkedObj == null) {
entity = entityMap.get(field).get(key);
linkedObj = objVal;
GaeMappingUtils.fillModel(linkedObj, entity);
linkedModels.put(key, linkedObj);
}
field.set(model, linkedObj);
}
}
return models;
} catch (IllegalAccessException ex) {
throw new SienaException(ex);
}
}
Aggregations