Search in sources :

Example 1 with HasId

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;
}
Also used : HashSet(java.util.HashSet) Set(java.util.Set) DataSet(org.summerb.easycrud.api.dto.datapackage.DataSet) Query(org.summerb.easycrud.api.query.Query) ArrayList(java.util.ArrayList) HasId(org.summerb.easycrud.api.dto.HasId) Entry(java.util.Map.Entry) Ref(org.summerb.easycrud.api.dto.relations.Ref) EasyCrudService(org.summerb.easycrud.api.EasyCrudService)

Example 2 with HasId

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());
            }
        }
    }
}
Also used : PropertyAccessor(org.springframework.beans.PropertyAccessor) RefToReferencedObjectsIdsMap(org.summerb.easycrud.api.dto.datapackage.DataTable.RefToReferencedObjectsIdsMap) HasId(org.summerb.easycrud.api.dto.HasId) Ref(org.summerb.easycrud.api.dto.relations.Ref) PaginatedList(org.summerb.easycrud.api.dto.PaginatedList) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List) RowIdToBackReferencesMap(org.summerb.easycrud.api.dto.datapackage.DataTable.RowIdToBackReferencesMap)

Example 3 with HasId

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);
        }
    }
}
Also used : DataTable(org.summerb.easycrud.api.dto.datapackage.DataTable) HashSet(java.util.HashSet) Set(java.util.Set) DataSet(org.summerb.easycrud.api.dto.datapackage.DataSet) RefToReferencedObjectsIdsMap(org.summerb.easycrud.api.dto.datapackage.DataTable.RefToReferencedObjectsIdsMap) HasId(org.summerb.easycrud.api.dto.HasId) Ref(org.summerb.easycrud.api.dto.relations.Ref) PaginatedList(org.summerb.easycrud.api.dto.PaginatedList) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List) HashMap(java.util.HashMap) RowIdToBackReferencesMap(org.summerb.easycrud.api.dto.datapackage.DataTable.RowIdToBackReferencesMap) Map(java.util.Map) RefToReferencedObjectsIdsMap(org.summerb.easycrud.api.dto.datapackage.DataTable.RefToReferencedObjectsIdsMap) RowIdToBackReferencesMap(org.summerb.easycrud.api.dto.datapackage.DataTable.RowIdToBackReferencesMap) HashSet(java.util.HashSet)

Example 4 with HasId

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;
}
Also used : DataTable(org.summerb.easycrud.api.dto.datapackage.DataTable) HashSet(java.util.HashSet) Set(java.util.Set) DataSet(org.summerb.easycrud.api.dto.datapackage.DataSet) PropertyAccessor(org.springframework.beans.PropertyAccessor) HashMap(java.util.HashMap) HasId(org.summerb.easycrud.api.dto.HasId) Ref(org.summerb.easycrud.api.dto.relations.Ref) HashSet(java.util.HashSet)

Example 5 with HasId

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);
    }
}
Also used : HasId(org.summerb.easycrud.api.dto.HasId) DataTable(org.summerb.easycrud.api.dto.datapackage.DataTable) EasyCrudService(org.summerb.easycrud.api.EasyCrudService)

Aggregations

HasId (org.summerb.easycrud.api.dto.HasId)20 EasyCrudService (org.summerb.easycrud.api.EasyCrudService)9 Test (org.junit.Test)7 ArrayList (java.util.ArrayList)5 List (java.util.List)5 PaginatedList (org.summerb.easycrud.api.dto.PaginatedList)5 Ref (org.summerb.easycrud.api.dto.relations.Ref)5 TestDto1 (integr.org.summerb.easycrud.TestDto1)4 LinkedList (java.util.LinkedList)4 DataSet (org.summerb.easycrud.api.dto.datapackage.DataSet)4 Query (org.summerb.easycrud.api.query.Query)4 ParameterizedType (java.lang.reflect.ParameterizedType)3 Type (java.lang.reflect.Type)3 HashMap (java.util.HashMap)3 HashSet (java.util.HashSet)3 Set (java.util.Set)3 DataTable (org.summerb.easycrud.api.dto.datapackage.DataTable)3 DataSetLoader (org.summerb.easycrud.api.relations.DataSetLoader)3 PropertyDescriptor (java.beans.PropertyDescriptor)2 PropertyAccessor (org.springframework.beans.PropertyAccessor)2