use of org.summerb.approaches.jdbccrud.api.dto.relations.Ref 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());
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.approaches.jdbccrud.api.dto.relations.Ref in project summerb by skarpushin.
the class EasyCrudRestControllerBase method resolveReferences.
private void resolveReferences(List<String> referencesToResolve, CrudQueryResult<TId, TDto> ret, List<TDto> items) throws EntityNotFoundException, NotAuthorizedException {
Preconditions.checkState(dataSetLoader != null, "DataSetLoader is required to resolve references");
Preconditions.checkState(referencesRegistry != null, "referencesRegistry is required to resolve references");
DataSet ds = new DataSet();
DataTable<TId, TDto> table = new DataTable<>(service.getEntityTypeMessageCode());
table.putAll(items);
ds.getTables().put(table.getName(), table);
List<Ref> references = referencesToResolve.stream().map(name -> referencesRegistry.getRefByName(name)).collect(Collectors.toList());
Ref[] refsArr = (Ref[]) references.toArray(new Ref[references.size()]);
dataSetLoader.resolveReferencedObjects(ds, refsArr);
// now remove initial table from dataset because we don't want to
// duplicate this. It's already populated to rows
ds.getTables().remove(table.getName());
// x. ret
ret.setRefsResolved(references.stream().collect(Collectors.toMap(Ref::getName, Function.identity())));
ret.setRefs(ds);
}
use of org.summerb.approaches.jdbccrud.api.dto.relations.Ref in project summerb by skarpushin.
the class ReferencesRegistryPreconfiguredAbstract method initialize.
private void initialize() {
Multimap<String, Ref> refsBySourceNameLocal = discoverRefsBySources();
Preconditions.checkState(refsBySourceNameLocal != null);
Map<String, Ref> refsByNameLocal = new HashMap<>();
for (Ref ref : refsBySourceNameLocal.values()) {
Ref previous = refsByNameLocal.put(ref.getName(), ref);
if (previous != null) {
throw new RuntimeException("Duplicate reference name not allowed " + ref.getName());
}
}
Multimap<String, Ref> refsByAliasLocal = discoverAliases();
Preconditions.checkState(refsByAliasLocal != null);
refsBySourceName = refsBySourceNameLocal;
refsByName = refsByNameLocal;
refsByAlias = refsByAliasLocal;
}
use of org.summerb.approaches.jdbccrud.api.dto.relations.Ref 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.approaches.jdbccrud.api.dto.relations.Ref in project summerb by skarpushin.
the class DataSetLoaderImpl method resolveReferencedObjects.
@Override
public void resolveReferencedObjects(DataSet dataSet, Ref... references) throws EntityNotFoundException, NotAuthorizedException {
Preconditions.checkArgument(dataSet != null);
Preconditions.checkArgument(references != null);
DataSet nextDataSet = dataSet;
while (nextDataSet != null) {
DataSet curDataSet = nextDataSet;
nextDataSet = null;
DataSet newDataSet = new DataSet();
Map<String, Set<Object>> idsToLoad = enumerateOutgoingReferences(curDataSet, dataSet, references);
if (!idsToLoad.isEmpty()) {
EntityTypeToObjectsMap loadObjects = loadObjectsByIds(idsToLoad);
addAllObjects(loadObjects, dataSet);
addAllObjects(loadObjects, newDataSet);
}
// Handle one2many
Map<Ref, Set<Object>> oneToManyReferencesToLoad = enumerateOneToManyReferences(curDataSet, references);
if (!oneToManyReferencesToLoad.isEmpty()) {
EntityTypeToObjectsMap loadedOneToManyRefs = loadOneToManyReferences(oneToManyReferencesToLoad);
addAllObjects(loadedOneToManyRefs, dataSet);
addAllObjects(loadedOneToManyRefs, newDataSet);
populateBackReferencesOne2Many(loadedOneToManyRefs, oneToManyReferencesToLoad, dataSet);
}
// Handle many2many
Map<Ref, Set<Object>> manyToManyRefToReferencersIds = enumerateManyToManyReferences(curDataSet, references);
if (!manyToManyRefToReferencersIds.isEmpty()) {
ManyToManyRefToReferenceesMap loadedManyToManyRefs = loadManyToManyReferences(manyToManyRefToReferencersIds);
addAllObjects(loadedManyToManyRefs, dataSet);
addAllObjects(loadedManyToManyRefs, newDataSet);
populateBackReferencesMany2Many(loadedManyToManyRefs, dataSet);
}
// next iteration
if (!newDataSet.isEmpty()) {
nextDataSet = newDataSet;
}
}
}
Aggregations