use of com.google.appengine.api.datastore.Entity in project siena by mandubian.
the class GaeMappingUtils method createEntityInstanceForUpdate.
public static Entity createEntityInstanceForUpdate(ClassInfo info, Object obj) {
Key key = makeKey(info, obj);
Entity entity = new Entity(key);
return entity;
}
use of com.google.appengine.api.datastore.Entity in project siena by mandubian.
the class GaeMappingUtils method mapEntities.
public static <T> List<T> mapEntities(List<Entity> entities, Class<T> clazz) {
Field id = ClassInfo.getIdField(clazz);
List<T> list = new ArrayList<T>(entities.size());
for (Entity entity : entities) {
T obj;
try {
obj = Util.createObjectInstance(clazz);
fillModel(obj, entity);
list.add(obj);
setIdFromKey(id, obj, entity.getKey());
} catch (SienaException e) {
throw e;
} catch (Exception e) {
throw new SienaException(e);
}
}
return list;
}
use of com.google.appengine.api.datastore.Entity in project siena by mandubian.
the class GaePersistenceManager method _insertMultipleMapFromParent.
private int _insertMultipleMapFromParent(final Map<Key, Map<Field, List<Object>>> keyMap, final List<ClassInfo> parentInfos) {
List<Entity> entities = new ArrayList<Entity>();
int i = 0;
for (Key key : keyMap.keySet()) {
Map<Field, List<Object>> objectMap = keyMap.get(key);
for (Field field : objectMap.keySet()) {
for (Object obj : objectMap.get(field)) {
Class<?> clazz = obj.getClass();
ClassInfo info = ClassInfo.getClassInfo(clazz);
Field idField = info.getIdField();
Entity entity = GaeMappingUtils.createEntityInstanceFromParent(idField, info, obj, key, parentInfos.get(i), field);
GaeMappingUtils.fillEntity(obj, entity);
entities.add(entity);
}
}
i++;
}
List<Key> generatedKeys = ds.put(entities);
i = 0;
Map<Key, Map<Field, List<Object>>> recKeyMap = new HashMap<Key, Map<Field, List<Object>>>();
List<ClassInfo> recInfos = new ArrayList<ClassInfo>();
for (Key key : keyMap.keySet()) {
Map<Field, List<Object>> objectMap = keyMap.get(key);
for (Field field : objectMap.keySet()) {
for (Object obj : objectMap.get(field)) {
Class<?> clazz = obj.getClass();
ClassInfo info = ClassInfo.getClassInfo(clazz);
Field idField = info.getIdField();
GaeMappingUtils.setIdFromKey(idField, obj, generatedKeys.get(i));
if (info.hasAggregatedFields) {
recInfos.add(info);
Map<Field, List<Object>> recObjectMap = new HashMap<Field, List<Object>>();
recKeyMap.put(generatedKeys.get(i), recObjectMap);
_populateAggregateFieldMap(recObjectMap, info, obj);
}
i++;
}
}
}
if (!recKeyMap.isEmpty()) {
_insertMultipleMapFromParent(recKeyMap, recInfos);
}
return generatedKeys.size();
}
use of com.google.appengine.api.datastore.Entity in project siena by mandubian.
the class GaePersistenceManagerAsync method mapJoins.
protected <T> List<T> mapJoins(QueryAsync<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()) {
Future<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.get());
}
} 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.Entity in project siena by mandubian.
the class GaePersistenceManager method mapJoins.
protected <T> T mapJoins(T model) {
try {
// join queries
Map<Field, ArrayList<Key>> fieldMap = GaeQueryUtils.buildJoinFieldKeysMap(model);
// 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);
}
}
Aggregations