Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,12 @@ default List<B> filter(QuerySpec filter) {
return getQueryDao().filter(filter).stream().map(this::convertToBusiness).collect(Collectors.toList());
}

@Transactional(value = TxType.REQUIRED, rollbackOn = Exception.class)
@Override
default Optional<B> filterWithSingleResult(QuerySpec filter) {
return getQueryDao().filterWithSingleResult(filter).map(this::convertToBusiness);
}

@Transactional(value = TxType.REQUIRED, rollbackOn = Exception.class)
@Override
default long count(QuerySpec filter) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,14 @@ public interface QueryService<T, K> {
*/
long count(QuerySpec filter);

/**
* Apply filtering to entities in the system based on a certain query specification and retrieve a
* single result.
*
* @param filter the query specification used for filtering
* @return an {@code Optional} instance containing a single entity matching the query
* specification if it exists; otherwise empty
*/
Optional<T> filterWithSingleResult(QuerySpec filter);

}
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,16 @@ default List<S> filter(QuerySpec filter) {
return FilterProcesor.<T, K>of(getEntityManager(), getPersistentClass()).filter(filter).stream()
.map(this::convertFrom).collect(Collectors.toList());
}

@Override
default Optional<S> filterWithSingleResult(QuerySpec filter) {
List<T> filtered = FilterProcesor.<T, K>of(getEntityManager(), getPersistentClass()).filter(filter);
if (filtered.size()>1) {
throw new IllegalStateException("Current filter returned more than one result");
}
return filtered.stream()
.map(this::convertFrom).findAny();
}

static class FilterProcesor<T extends Identifiable<K>, K extends Serializable> {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,18 @@ void testFilter() {
assertEquals(10, allMinusFirst);
}

@Test
void testFilterWithSingleResult() {
PersonFilter pf = new PersonFilter();
pf.addConstraint(ConstraintBuilder.in("id", Arrays.asList(new Integer[] { persistedPerson.getId() })));
boolean isPresent = dao.filterWithSingleResult(pf).isPresent();
assertEquals(true, isPresent);
pf = new PersonFilter();
pf.addConstraint(ConstraintBuilder.in("id", Arrays.asList(new Integer[] { -1 })));
isPresent = dao.filterWithSingleResult(pf).isPresent();
assertEquals(false, isPresent);
}

@Test
void testCount() {
PersonFilter pf = new PersonFilter();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public interface QueryDao<T, K> {

List<T> filter(QuerySpec filter);

Optional<T> filterWithSingleResult(QuerySpec filter);

long count(QuerySpec filter);

}