use of com.google.appengine.api.datastore.Key in project siena by mandubian.
the class GaePersistenceManager method _insertPutEntities.
private <T> int _insertPutEntities(Iterable<Entity> entities, Iterable<T> objects) {
List<Key> generatedKeys = ds.put(entities);
int i = 0;
Map<Key, Map<Field, List<Object>>> keyMap = new HashMap<Key, Map<Field, List<Object>>>();
List<ClassInfo> infos = new ArrayList<ClassInfo>();
List<Object> relObjects = new ArrayList<Object>();
for (Object obj : objects) {
Class<?> clazz = obj.getClass();
ClassInfo info = ClassInfo.getClassInfo(clazz);
Field idField = info.getIdField();
GaeMappingUtils.setIdFromKey(idField, obj, generatedKeys.get(i));
if (info.hasAggregatedFields) {
infos.add(info);
Map<Field, List<Object>> objectMap = new HashMap<Field, List<Object>>();
keyMap.put(generatedKeys.get(i), objectMap);
_populateAggregateFieldMap(objectMap, info, obj);
}
if (info.hasOwnedFields) {
_populateOwnedList(relObjects, info, obj);
}
i++;
}
if (!keyMap.isEmpty()) {
_insertMultipleMapFromParent(keyMap, infos);
}
if (!relObjects.isEmpty()) {
// uses save because we don't know if the objects where already saved or not
save(relObjects);
}
return generatedKeys.size();
}
use of com.google.appengine.api.datastore.Key in project siena by mandubian.
the class GaePersistenceManager method delete.
public void delete(Object obj) {
List<Key> keys = new ArrayList<Key>();
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);
_deleteSingle(obj, keys, parentKey, parentInfo, (Field) rel.discriminator);
} else {
_deleteSingle(obj, keys, null, null, null);
}
} else {
_deleteSingle(obj, keys, null, null, null);
}
ds.delete(keys);
}
use of com.google.appengine.api.datastore.Key in project siena by mandubian.
the class GaePersistenceManager method mapJoins.
protected <T> List<T> mapJoins(List<T> models) {
try {
// join queries
Map<Field, ArrayList<Key>> fieldMap = null;
// creates the list of joined entity keys to extract
for (final T model : models) {
// initializes fieldMap
if (fieldMap == null) {
fieldMap = GaeQueryUtils.buildJoinFieldKeysMap(model);
}
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);
}
}
use of com.google.appengine.api.datastore.Key in project siena by mandubian.
the class GaePersistenceManager method _insertSingle.
private <T> void _insertSingle(T obj, final Key parentEntityKey, final Object parentObj, final ClassInfo parentInfo, final Field field) {
Class<?> clazz = obj.getClass();
ClassInfo info = ClassInfo.getClassInfo(clazz);
Field idField = info.getIdField();
final Entity entity;
// first put the entity to have its ID at least!
if (parentEntityKey == null) {
entity = GaeMappingUtils.createEntityInstance(idField, info, obj);
GaeMappingUtils.fillEntity(obj, entity);
ds.put(entity);
GaeMappingUtils.setIdFromKey(idField, obj, entity.getKey());
} else {
entity = GaeMappingUtils.createEntityInstanceFromParent(idField, info, obj, parentEntityKey, parentInfo, field);
GaeMappingUtils.fillEntity(obj, entity);
ds.put(entity);
GaeMappingUtils.setIdFromKey(idField, obj, entity.getKey());
}
if (info.hasAggregatedFields) {
Map<Key, Map<Field, List<Object>>> keyMap = new HashMap<Key, Map<Field, List<Object>>>();
Map<Field, List<Object>> objectMap = new HashMap<Field, List<Object>>();
keyMap.put(entity.getKey(), objectMap);
_populateAggregateFieldMap(objectMap, info, obj);
_insertMultipleMapFromParent(keyMap, Arrays.asList(info));
}
if (info.hasOwnedFields) {
List<Object> relObjects = new ArrayList<Object>();
_populateOwnedList(relObjects, info, obj);
// uses save because we don't know if the objects where already saved or not
save(relObjects);
}
}
use of com.google.appengine.api.datastore.Key in project siena by mandubian.
the class GaePersistenceManager method _updateBuildMaps.
// private <T> int _updateComplexMultiple(Iterable<T> objs, Key parentKey, ClassInfo parentInfo, Field parentField){
// HashMap<PersistenceType, List<Entity>> entitiesMap = new HashMap<PersistenceType, List<Entity>>();
// HashMap<PersistenceType, List<Object>> objectsMap = new HashMap<PersistenceType, List<Object>>();
// HashMap<PersistenceType, List<Key>> keysMap = new HashMap<PersistenceType, List<Key>>();
//
// for(Object obj:objs){
// _updateBuildMaps(entitiesMap, objectsMap, keysMap, obj, null, null, null);
// }
//
// return _updateManageMaps(entitiesMap, objectsMap, keysMap);
// }
//private void _buildUpdateList(List<Entity> entities2Insert, List<Object> objects2Insert, List<Entity> entities2Update, List<Key> entities2Remove, List<Object> objects2Save, Object obj, Key parentKey, ClassInfo parentInfo, Field parentField){
private static void _updateBuildMaps(HashMap<PersistenceType, List<Entity>> entitiesMap, HashMap<PersistenceType, List<Object>> objectsMap, HashMap<PersistenceType, List<Key>> keysMap, Object obj, Key parentKey, ClassInfo parentInfo, Field parentField) {
Class<?> clazz = obj.getClass();
ClassInfo info = ClassInfo.getClassInfo(clazz);
Field idField = info.getIdField();
Entity entity;
Object idVal = Util.readField(obj, idField);
// id with null value means insert
if (idVal == null) {
if (parentKey == null) {
entity = GaeMappingUtils.createEntityInstance(idField, info, obj);
} else {
entity = GaeMappingUtils.createEntityInstanceFromParent(idField, info, obj, parentKey, parentInfo, parentField);
}
GaeMappingUtils.fillEntity(obj, entity);
List<Entity> entities2Insert = entitiesMap.get(PersistenceType.INSERT);
if (entities2Insert == null) {
entities2Insert = new ArrayList<Entity>();
entitiesMap.put(PersistenceType.INSERT, entities2Insert);
}
entities2Insert.add(entity);
List<Object> objects2Insert = objectsMap.get(PersistenceType.INSERT);
if (objects2Insert == null) {
objects2Insert = new ArrayList<Object>();
objectsMap.put(PersistenceType.INSERT, objects2Insert);
}
objects2Insert.add(obj);
} else {
if (parentKey == null) {
entity = GaeMappingUtils.createEntityInstanceForUpdate(info, obj);
} else {
entity = GaeMappingUtils.createEntityInstanceForUpdateFromParent(info, obj, parentKey, parentInfo, parentField);
}
GaeMappingUtils.fillEntity(obj, entity);
List<Entity> entities2Update = entitiesMap.get(PersistenceType.UPDATE);
if (entities2Update == null) {
entities2Update = new ArrayList<Entity>();
entitiesMap.put(PersistenceType.UPDATE, entities2Update);
}
entities2Update.add(entity);
}
for (Field f : info.ownedFields) {
// doesn't do anything with One<T>
if (ClassInfo.isOne(f)) {
// set the owner field in the child object using the content of the one
One4PM<?> relObj = (One4PM<?>) Util.readField(obj, f);
Map<FieldMapKeys, Object> m = info.oneFieldMap.get(f);
if (m != null) {
Field asField = (Field) m.get(FieldMapKeys.FIELD);
if (relObj.isModified()) {
// unassociates previous object
Object prevObj = relObj.getPrev();
if (prevObj != null) {
Util.setField(prevObj, asField, null);
}
// resets modified flag
relObj.setModified(false);
List<Object> objects2Save = objectsMap.get(PersistenceType.SAVE);
if (objects2Save == null) {
objects2Save = new ArrayList<Object>();
objectsMap.put(PersistenceType.SAVE, objects2Save);
}
objects2Save.add(prevObj);
Object oneObj = relObj.get();
if (oneObj != null) {
Util.setField(oneObj, asField, obj);
objects2Save.add(oneObj);
}
}
}
} else if (ClassInfo.isMany(f)) {
Many4PM<?> lq = (Many4PM<?>) Util.readField(obj, f);
// when you remove an element from a Many<T>, it just removes the link
if (!lq.asList2Remove().isEmpty()) {
Field asField = (Field) info.manyFieldMap.get(f).get(FieldMapKeys.FIELD);
for (Object elt : lq.asList2Remove()) {
Util.setField(elt, asField, null);
List<Object> objects2Save = objectsMap.get(PersistenceType.SAVE);
if (objects2Save == null) {
objects2Save = new ArrayList<Object>();
objectsMap.put(PersistenceType.SAVE, objects2Save);
}
objects2Save.add(elt);
}
lq.asList2Remove().clear();
}
if (!lq.asList2Add().isEmpty()) {
Field asField = (Field) info.manyFieldMap.get(f).get(FieldMapKeys.FIELD);
for (Object elt : lq.asList2Add()) {
Util.setField(elt, asField, obj);
List<Object> objects2Save = objectsMap.get(PersistenceType.SAVE);
if (objects2Save == null) {
objects2Save = new ArrayList<Object>();
objectsMap.put(PersistenceType.SAVE, objects2Save);
}
objects2Save.add(elt);
}
lq.asList2Add().clear();
}
}
}
for (Field f : info.aggregatedFields) {
if (ClassInfo.isOne(f)) {
One4PM<?> one = (One4PM<?>) Util.readField(obj, f);
if (one.isModified()) {
// deletes previous object
Object prevObj = one.getPrev();
if (prevObj != null) {
Class<?> delClazz = prevObj.getClass();
ClassInfo delInfo = ClassInfo.getClassInfo(delClazz);
Key delKey = GaeMappingUtils.makeKeyFromParent(delInfo, prevObj, entity.getKey(), info, f);
List<Key> key2Remove = keysMap.get(PersistenceType.DELETE);
if (key2Remove == null) {
key2Remove = new ArrayList<Key>();
keysMap.put(PersistenceType.DELETE, key2Remove);
}
key2Remove.add(delKey);
}
// resets modified flag
one.setModified(false);
Object oneObj = one.get();
if (oneObj != null) {
_updateBuildMaps(entitiesMap, objectsMap, keysMap, oneObj, entity.getKey(), info, f);
}
}
} else if (ClassInfo.isMany(f)) {
Many4PM<?> lq = (Many4PM<?>) Util.readField(obj, f);
// add to entities2remove child entities that have been removed
if (!lq.asList2Remove().isEmpty()) {
Key delKey;
for (Object elt : lq.asList2Remove()) {
Class<?> delClazz = elt.getClass();
ClassInfo delInfo = ClassInfo.getClassInfo(delClazz);
delKey = GaeMappingUtils.makeKeyFromParent(delInfo, elt, entity.getKey(), info, f);
List<Key> key2Remove = keysMap.get(PersistenceType.DELETE);
if (key2Remove == null) {
key2Remove = new ArrayList<Key>();
keysMap.put(PersistenceType.DELETE, key2Remove);
}
key2Remove.add(delKey);
}
lq.asList2Remove().clear();
}
if (!lq.asList2Add().isEmpty()) {
for (Object elt : lq.asList2Add()) {
_updateBuildMaps(entitiesMap, objectsMap, keysMap, elt, entity.getKey(), info, f);
}
lq.asList2Add().clear();
}
}
}
}
Aggregations