use of org.summerb.easycrud.api.dto.HasId in project summerb by skarpushin.
the class DataSetLoaderImpl method loadOneToManyReferences.
private EntityTypeToObjectsMap loadOneToManyReferences(Map<Ref, Set<Object>> refToReferencersIds) throws NotAuthorizedException {
Multimap<String, Entry<Ref, Set<Object>>> targetEntityToRef = HashMultimap.create();
for (Entry<Ref, Set<Object>> entry : refToReferencersIds.entrySet()) {
targetEntityToRef.put(entry.getKey().getToEntity(), entry);
}
EntityTypeToObjectsMap ret = new EntityTypeToObjectsMap();
for (String entityTypeCode : targetEntityToRef.keySet()) {
Collection<Entry<Ref, Set<Object>>> entries = targetEntityToRef.get(entityTypeCode);
List<Query> queries = new ArrayList<>(entries.size());
for (Entry<Ref, Set<Object>> entry : entries) {
Set<Object> ids = entry.getValue();
Ref ref = entry.getKey();
Object firstId = ids.iterator().next();
if (firstId instanceof Long) {
queries.add(Query.n().in(ref.getToField(), ids.toArray(new Long[0])));
} else if (firstId instanceof String) {
queries.add(Query.n().in(ref.getToField(), ids.toArray(new String[0])));
} else {
throw new IllegalStateException("such id type is not supported: " + firstId.getClass());
}
}
Query q = queries.size() == 1 ? queries.get(0) : Query.n().or(queries.toArray(new Query[0]));
EasyCrudService service = easyCrudServiceResolver.resolveByEntityType(entityTypeCode);
PaginatedList<HasId> results = service.query(PagerParams.ALL, q);
ret.put(entityTypeCode, new ArrayList<>(results.getItems()));
}
return ret;
}
use of org.summerb.easycrud.api.dto.HasId in project summerb by skarpushin.
the class DataSetLoaderImpl method populateBackReferencesOne2Many.
private void populateBackReferencesOne2Many(EntityTypeToObjectsMap rowsMap, Map<Ref, Set<Object>> refs, DataSet dataSet) {
for (Entry<String, List<HasId>> entry : rowsMap.entrySet()) {
for (HasId row : entry.getValue()) {
PropertyAccessor propertyAccessor = PropertyAccessorFactory.forBeanPropertyAccess(row);
for (Ref ref : refs.keySet()) {
if (!ref.getToEntity().equals(entry.getKey())) {
continue;
}
Object referencedId = null;
try {
referencedId = propertyAccessor.getPropertyValue(ref.getToField());
} catch (Throwable t) {
throw new RuntimeException("Failed to read property " + ref.getFromField() + " from " + row, t);
}
if (referencedId == null) {
continue;
}
@SuppressWarnings("deprecation") RowIdToBackReferencesMap backRefs = dataSet.get(ref.getFromEntity()).getBackRefs();
if (backRefs.get(referencedId) == null) {
backRefs.put(referencedId, new RefToReferencedObjectsIdsMap());
}
RefToReferencedObjectsIdsMap refToObjsMap = backRefs.get(referencedId);
if (refToObjsMap.get(ref.getName()) == null) {
refToObjsMap.put(ref.getName(), new HashSet<>());
}
refToObjsMap.get(ref.getName()).add(row.getId());
}
}
}
}
use of org.summerb.easycrud.api.dto.HasId in project summerb by skarpushin.
the class DataSetLoaderImpl method populateBackReferencesMany2Many.
private void populateBackReferencesMany2Many(ManyToManyRefToReferenceesMap manyToManyRefs, DataSet dataSet) {
for (Entry<Ref, Map<Object, List<HasId>>> refToReferenceeListPair : manyToManyRefs.entrySet()) {
DataTable sourceTable = dataSet.get(refToReferenceeListPair.getKey().getFromEntity());
@SuppressWarnings("deprecation") RowIdToBackReferencesMap backRefs = sourceTable.getBackRefs();
for (Entry<Object, List<HasId>> referencerToReferencesListPair : refToReferenceeListPair.getValue().entrySet()) {
Object referencerId = referencerToReferencesListPair.getKey();
RefToReferencedObjectsIdsMap refToObjsMap = backRefs.get(referencerId);
if (refToObjsMap == null) {
backRefs.put(referencerId, refToObjsMap = new RefToReferencedObjectsIdsMap());
}
String refName = refToReferenceeListPair.getKey().getName();
Set<Object> referenceeIdsList = refToObjsMap.get(refName);
if (referenceeIdsList == null) {
refToObjsMap.put(refName, referenceeIdsList = new HashSet<>());
}
Set referenceeIds = EasyCrudDtoUtils.enumerateIds(referencerToReferencesListPair.getValue());
referenceeIdsList.addAll(referenceeIds);
}
}
}
use of org.summerb.easycrud.api.dto.HasId in project summerb by skarpushin.
the class DataSetLoaderImpl method enumerateOutgoingReferences.
/**
* @param scanForReferences
* dataSet to scan for Many2one & One2one referenced objects
* @param checkForExistence
* data set that contains already loaded objects so that we can skip
* loading these objects again
* @param references
* references to use
* @return map entityTypeCode to list of ids of these entities to be loaded
*/
private Map<String, Set<Object>> enumerateOutgoingReferences(DataSet scanForReferences, DataSet checkForExistence, Ref[] references) {
Map<String, Set<Object>> ret = new HashMap<>();
for (DataTable table : scanForReferences.getTables().values()) {
List<Ref> outgoingRefs = enumOutgoingRefsToTableOrNull(references, table.getName());
if (outgoingRefs == null) {
continue;
}
for (Object rowObj : table.getRows().values()) {
HasId row = (HasId) rowObj;
PropertyAccessor propertyAccessor = PropertyAccessorFactory.forBeanPropertyAccess(row);
for (Ref ref : outgoingRefs) {
Object referencedId = null;
try {
referencedId = propertyAccessor.getPropertyValue(ref.getFromField());
} catch (Throwable t) {
throw new RuntimeException("Failed to read property " + ref.getFromField() + " from " + row, t);
}
if (referencedId == null) {
continue;
}
if (checkForExistence.get(ref.getToEntity()).find(referencedId) != null) {
// that one is already loaded, skip
continue;
}
Set<Object> referencedIds = ret.get(ref.getToEntity());
if (referencedIds == null) {
ret.put(ref.getToEntity(), referencedIds = new HashSet<>());
}
referencedIds.add(referencedId);
}
}
}
return ret;
}
use of org.summerb.easycrud.api.dto.HasId in project summerb by skarpushin.
the class DataSetUpdaterOnEntityChangedEventImpl method updateDataSet.
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public void updateDataSet(DataSet dataSet, EntityChangedEvent<?> e) {
if (!e.isTypeOf(HasId.class)) {
return;
}
EasyCrudService service = easyCrudServiceResolver.resolveByDtoClass(e.getValue().getClass());
if (!dataSet.getTables().containsKey(service.getEntityTypeMessageCode())) {
return;
}
DataTable table = dataSet.getTables().get(service.getEntityTypeMessageCode());
HasId dto = (HasId) e.getValue();
if (e.getChangeType() == ChangeType.REMOVED) {
table.getRows().remove(dto.getId());
} else {
table.put(dto);
}
}
Aggregations