use of com.google.appengine.api.datastore.Entity 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.Entity in project siena by mandubian.
the class GaePersistenceManager method _updateManageMaps.
private int _updateManageMaps(HashMap<PersistenceType, List<Entity>> entitiesMap, HashMap<PersistenceType, List<Object>> objectsMap, HashMap<PersistenceType, List<Key>> keysMap) {
int nb = 0;
// saves the updated owned objects
List<Object> objs = objectsMap.get(PersistenceType.SAVE);
if (objs != null && !objs.isEmpty()) {
nb += save(objs);
}
// saves the updated aggregated objects
List<Entity> entities = entitiesMap.get(PersistenceType.INSERT);
if (entities != null && !entities.isEmpty()) {
List<Key> generatedKeys = ds.put(entities);
int i = 0;
for (Object elt : objectsMap.get(PersistenceType.INSERT)) {
Class<?> clazz = elt.getClass();
ClassInfo info = ClassInfo.getClassInfo(clazz);
Field idField = info.getIdField();
GaeMappingUtils.setIdFromKey(idField, elt, generatedKeys.get(i));
}
nb += generatedKeys.size();
}
// saves the updated aggregated objects
entities = entitiesMap.get(PersistenceType.UPDATE);
if (entities != null && !entities.isEmpty()) {
ds.put(entitiesMap.get(PersistenceType.UPDATE));
nb += entities.size();
}
// removes the deleted aggregated objects
List<Key> keys = keysMap.get(PersistenceType.DELETE);
if (keys != null && !keys.isEmpty()) {
ds.delete(keys);
nb += keys.size();
}
return nb;
}
use of com.google.appengine.api.datastore.Entity in project siena by mandubian.
the class GaePersistenceManager method getByKeys.
public <T> List<T> getByKeys(Class<T> clazz, Iterable<?> keys) {
List<Key> gaeKeys = new ArrayList<Key>();
ClassInfo info = ClassInfo.getClassInfo(clazz);
for (Object key : keys) {
gaeKeys.add(GaeMappingUtils.makeKeyFromId(clazz, key));
}
Map<Key, Entity> entityMap = ds.get(gaeKeys);
List<T> models = new ArrayList<T>(entityMap.size());
for (Object key : keys) {
Entity entity = entityMap.get(GaeMappingUtils.makeKeyFromId(clazz, key));
T obj = null;
if (entity != null) {
obj = GaeMappingUtils.mapEntity(entity, clazz);
if (obj != null) {
// related fields (Many<T> management mainly)
if (!info.ownedFields.isEmpty()) {
mapOwned(obj);
}
// aggregated management
if (!info.aggregatedFields.isEmpty()) {
mapAggregated(obj);
}
// join management
if (!info.joinFields.isEmpty()) {
mapJoins(obj);
}
}
}
models.add(obj);
}
return models;
}
use of com.google.appengine.api.datastore.Entity in project siena by mandubian.
the class GaePersistenceManagerAsync method mapJoins.
protected <T> T mapJoins(QueryAsync<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()) {
Future<Map<Key, Entity>> entities = ds.get(fieldMap.get(field));
// gets the future here because we need 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 (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.Entity 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