use of org.summerb.easycrud.api.query.Query 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.query.Query in project summerb by skarpushin.
the class EasyCrudM2mServiceImpl method removeReferencee.
@Override
public void removeReferencee(T1Id referencerId, T2Id referenceeId) throws NotAuthorizedException {
try {
Query q = Query.n();
addEqQuery(ManyToManyDto.FN_SRC, referencerId, q);
addEqQuery(ManyToManyDto.FN_DST, referenceeId, q);
ManyToManyDto<T1Id, T2Id> pair = findOneByQuery(q);
try {
if (pair == null) {
throw new GenericEntityNotFoundException(getEntityTypeMessageCode(), "" + referencerId + "<->" + referenceeId);
}
deleteById(pair.getId());
} catch (EntityNotFoundException e) {
// that's ok, we wanted it to not exist, it's not there. This
// state
// is acceptable
}
} catch (Throwable t) {
Throwables.throwIfInstanceOf(t, NotAuthorizedException.class);
throw new RuntimeException("Failed to remove reference from " + serviceFrom.getEntityTypeMessageCode() + " identified by " + referencerId + " to " + serviceTo.getEntityTypeMessageCode() + " identified by " + referenceeId, t);
}
}
use of org.summerb.easycrud.api.query.Query in project summerb by skarpushin.
the class EasyCrudM2mServiceImpl method findReferenceeByReferencers.
@Override
public Map<T1Id, List<T2Dto>> findReferenceeByReferencers(Set<T1Id> referencerIds) {
try {
Preconditions.checkArgument(!CollectionUtils.isEmpty(referencerIds), "referencerId is required");
Query q = buildQueryToFindReferenceeByReferencerId(referencerIds);
List<ManyToManyDto<T1Id, T2Id>> m2mPairs = query(PagerParams.ALL, q).getItems();
if (m2mPairs.size() == 0) {
// Q: Should we fill key set with null (or empty lists)??...
return Collections.emptyMap();
}
Set<T2Id> referenceeIds = collectReferenceeIds(m2mPairs);
List<T2Dto> referencee = serviceTo.query(PagerParams.ALL, buildQueryToFindObjectsByIds(referenceeIds)).getItems();
Map<T1Id, List<T2Dto>> ret = buildResultForFindReferenceeByReferencer(m2mPairs, referencee);
return ret;
} catch (Throwable t) {
throw new RuntimeException("Failed to find " + serviceTo.getEntityTypeMessageCode() + " refernced by " + serviceFrom.getEntityTypeMessageCode() + " identified by " + Arrays.toString(referencerIds.toArray()), t);
}
}
use of org.summerb.easycrud.api.query.Query in project summerb by skarpushin.
the class EasyCrudM2mServiceImpl method buildQueryToFindObjectsByIds.
private Query buildQueryToFindObjectsByIds(Set<T2Id> referenceeIds) {
T2Id referenceeId = referenceeIds.iterator().next();
Query q;
if (referenceeId instanceof String) {
q = Query.n().in(ManyToManyDto.FN_ID, referenceeIds.toArray(new String[0]));
} else if (referenceeId instanceof Long) {
q = Query.n().in(ManyToManyDto.FN_ID, referenceeIds.toArray(new Long[0]));
} else {
throw new RuntimeException("Unsupported type if Id = " + referenceeId.getClass());
}
return q;
}
use of org.summerb.easycrud.api.query.Query in project summerb by skarpushin.
the class DataSetLoaderImplTest method testLoadObjectsByIds_ExpectManyLoadByStrings.
@Test
public void testLoadObjectsByIds_ExpectManyLoadByStrings() throws Exception {
DataSetLoaderImpl fixture = buildMockedInstance();
EasyCrudService service = Mockito.mock(EasyCrudService.class);
when(fixture.getEasyCrudServiceResolver().resolveByEntityType("dto1")).thenReturn(service);
Matcher<Query> matcher = IsEqual.equalTo(Query.n().in(HasId.FN_ID, new String[] { "s1", "s2" }));
PaginatedList mockret = new PaginatedList<>(new PagerParams(), Arrays.asList(new TestDto1(), new TestDto1()), 2);
when(service.query(any(PagerParams.class), argThat(matcher))).thenReturn(mockret);
List<HasId> ret = fixture.loadObjectsByIds(ids("s1", "s2"), "dto1");
assertNotNull(ret);
assertEquals(2, ret.size());
}
Aggregations