Skip to content
Snippets Groups Projects
Commit 0d736145 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-1190 fix paging

parent 783cee10
No related branches found
No related tags found
No related merge requests found
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
<spring-admin.version>2.3.1</spring-admin.version> <spring-admin.version>2.3.1</spring-admin.version>
<commons-io.version>2.8.0</commons-io.version> <commons-io.version>2.8.0</commons-io.version>
<commons-collections.version>4.4</commons-collections.version>
<spring-boot.build-image.imageName>docker.ozg-sh.de/pluto:build-latest</spring-boot.build-image.imageName> <spring-boot.build-image.imageName>docker.ozg-sh.de/pluto:build-latest</spring-boot.build-image.imageName>
...@@ -98,6 +99,11 @@ ...@@ -98,6 +99,11 @@
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>${commons-io.version}</version> <version>${commons-io.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>${commons-collections.version}</version>
</dependency>
<dependency> <dependency>
<groupId>com.thedeanda</groupId> <groupId>com.thedeanda</groupId>
......
...@@ -6,6 +6,7 @@ import java.util.LinkedList; ...@@ -6,6 +6,7 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageImpl;
...@@ -30,14 +31,19 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository { ...@@ -30,14 +31,19 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository {
@Override @Override
public Page<VorgangHeader> findAll(FindVorgangRequest request) { public Page<VorgangHeader> findAll(FindVorgangRequest request) {
return execAggration(aggregationBuilder(buildPageable(request)).withFilterBy(request.getFilterBy()).build(), buildPageable(request)); return executeRequest(request);
} }
@Override @Override
public Page<VorgangHeader> searchBy(FindVorgangRequest request) { public Page<VorgangHeader> searchBy(FindVorgangRequest request) {
return execAggration( return executeRequest(request);
aggregationBuilder(buildPageable(request)).withSearchBy(request.getSearchBy()).withFilterBy(request.getFilterBy()).build(), }
buildPageable(request));
private Page<VorgangHeader> executeRequest(FindVorgangRequest request) {
var resultList = execAggration(
aggregationBuilder(buildPageable(request)).withSearchBy(request.getSearchBy()).withFilterBy(request.getFilterBy()).build());
return new PageImpl<>(resultList, buildPageable(request), countTotalVorgaenge(request.getFilterBy()));
} }
Pageable buildPageable(FindVorgangRequest request) { Pageable buildPageable(FindVorgangRequest request) {
...@@ -48,14 +54,22 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository { ...@@ -48,14 +54,22 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository {
return new AggregationBuilder(pageRequest); return new AggregationBuilder(pageRequest);
} }
private Page<VorgangHeader> execAggration(Aggregation aggregation, Pageable pageable) { private List<VorgangHeader> execAggration(Aggregation aggregation) {
var result = template.aggregate(aggregation, VorgangHeader.class, VorgangHeader.class); var result = template.aggregate(aggregation, VorgangHeader.class, VorgangHeader.class);
return new PageImpl<>(result.getMappedResults(), pageable, countTotalVorgaenge()); return result.getMappedResults();
} }
private long countTotalVorgaenge() { private long countTotalVorgaenge(FilterBy filterBy) {
return template.count(Query.query(new Criteria()), Vorgang.COLLECTION_NAME); return template.count(Query.query(filterToCriteria(filterBy)), Vorgang.COLLECTION_NAME);
}
private Criteria filterToCriteria(FilterBy filterBy) {
if (CollectionUtils.isEmpty(filterBy.getOrganisationseinheitIds()))
return new Criteria();
else
return new Criteria(Vorgang.FIELD_ORGANISATIONSEINHEIT).in(filterBy.getOrganisationseinheitIds());
} }
@RequiredArgsConstructor @RequiredArgsConstructor
...@@ -65,7 +79,7 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository { ...@@ -65,7 +79,7 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository {
private Optional<FilterBy> filterBy = Optional.empty(); private Optional<FilterBy> filterBy = Optional.empty();
AggregationBuilder withSearchBy(String searchBy) { AggregationBuilder withSearchBy(String searchBy) {
this.searchBy = Optional.of(searchBy); this.searchBy = Optional.ofNullable(searchBy);
return this; return this;
} }
......
...@@ -20,26 +20,24 @@ class VorgangRepository { ...@@ -20,26 +20,24 @@ class VorgangRepository {
@Autowired @Autowired
private MongoOperations mongoOperations; private MongoOperations mongoOperations;
Optional<Vorgang> findById(String vorgangId) { public Optional<Vorgang> findById(String vorgangId) {
return Optional.ofNullable(mongoOperations.findOne( return Optional.ofNullable(mongoOperations.findOne(
query(where(Vorgang.MONGODB_FIELDNAME_ID).is(vorgangId)), query(where(Vorgang.MONGODB_FIELDNAME_ID).is(vorgangId)),
Vorgang.class)); Vorgang.class));
} }
Vorgang findByIdAndVersion(String vorgangId, long version) { public Vorgang findByIdAndVersion(String vorgangId, long version) {
return mongoOperations.findOne( return mongoOperations.findOne(
query(where(Vorgang.MONGODB_FIELDNAME_ID).is(vorgangId).and(Vorgang.MONGODB_FIELDNAME_VERSION).is(version)), query(where(Vorgang.MONGODB_FIELDNAME_ID).is(vorgangId).and(Vorgang.MONGODB_FIELDNAME_VERSION).is(version)),
Vorgang.class); Vorgang.class);
} }
Vorgang save(Vorgang vorgang) { public Vorgang save(Vorgang vorgang) {
return mongoOperations.save(vorgang); return mongoOperations.save(vorgang);
} }
void updateStatus(String vorgangId, long version, Status status) { public void updateStatus(String vorgangId, long version, Status status) {
mongoOperations.updateFirst( mongoOperations.updateFirst(
queryVorgangByIdAndVersion(vorgangId, version), queryVorgangByIdAndVersion(vorgangId, version),
...@@ -49,9 +47,9 @@ class VorgangRepository { ...@@ -49,9 +47,9 @@ class VorgangRepository {
Vorgang.class); Vorgang.class);
} }
void updateStatusWithoutVersionCheck(String vorgangId, Status status) { public void updateStatusWithoutVersionCheck(String vorgangId, Status status) {
mongoOperations.updateFirst( mongoOperations.updateFirst(
query(where(Vorgang.MONGODB_FIELDNAME_ID).is(vorgangId)), queryById(vorgangId),
new Update() new Update()
.inc(Vorgang.MONGODB_FIELDNAME_VERSION, 1) .inc(Vorgang.MONGODB_FIELDNAME_VERSION, 1)
.set(Vorgang.MONGODB_FIELDNAME_STATUS, status), .set(Vorgang.MONGODB_FIELDNAME_STATUS, status),
......
...@@ -2,7 +2,7 @@ package de.itvsh.ozg.pluto.vorgang; ...@@ -2,7 +2,7 @@ package de.itvsh.ozg.pluto.vorgang;
public class FilterByTestFactory { public class FilterByTestFactory {
public static String ORGANISATIONSEINHEIT_ID = "132654"; public static String ORGANISATIONSEINHEIT_ID = ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID;
public static FilterBy createEmpty() { public static FilterBy createEmpty() {
return FilterBy.builder().build(); return FilterBy.builder().build();
......
...@@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.*; ...@@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.*;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.UUID;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
...@@ -55,8 +56,12 @@ class VorgangHeaderRepositoryITCase { ...@@ -55,8 +56,12 @@ class VorgangHeaderRepositoryITCase {
@Nested @Nested
class TestWithFilterByOrganisationseinheit { class TestWithFilterByOrganisationseinheit {
final FindVorgangRequest request = FindVorgangRequestTestFactory.createBuilder().searchBy(SEARCH_BY).filterBy(buildFilter()).limit(10) private FilterBy filterBy = FilterByTestFactory.createBuilder().clearOrganisationseinheitIds()
.offset(0).build(); .organisationseinheitId(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID).build();
private FindVorgangRequest request = FindVorgangRequestTestFactory.createBuilder().searchBy(SEARCH_BY).offset(0)
.filterBy(filterBy).limit(10)
.build();
@ParameterizedTest @ParameterizedTest
@EnumSource @EnumSource
...@@ -69,6 +74,7 @@ class VorgangHeaderRepositoryITCase { ...@@ -69,6 +74,7 @@ class VorgangHeaderRepositoryITCase {
assertThat(result).hasSize(1); assertThat(result).hasSize(1);
} }
} }
private Vorgang buildWithEingangKennz(String kennz, Status status) { private Vorgang buildWithEingangKennz(String kennz, Status status) {
...@@ -84,11 +90,6 @@ class VorgangHeaderRepositoryITCase { ...@@ -84,11 +90,6 @@ class VorgangHeaderRepositoryITCase {
var eingang = EingangTestFactory.createBuilder().header(header).zustaendigeStelle(zustaendigeStelle).build(); var eingang = EingangTestFactory.createBuilder().header(header).zustaendigeStelle(zustaendigeStelle).build();
return VorgangTestFactory.createBuilder().id(null).status(status).eingang(eingang).build(); return VorgangTestFactory.createBuilder().id(null).status(status).eingang(eingang).build();
} }
private FilterBy buildFilter() {
return FilterByTestFactory.createBuilder().clearOrganisationseinheitIds()
.organisationseinheitId(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID).build();
}
} }
@Nested @Nested
...@@ -207,32 +208,48 @@ class VorgangHeaderRepositoryITCase { ...@@ -207,32 +208,48 @@ class VorgangHeaderRepositoryITCase {
@Nested @Nested
class TestFilterByOrganisationseinheit { class TestFilterByOrganisationseinheit {
private static final String ORGANISATIONSEINHEIT_ID = "42"; private static final String OTHER_ZUSTAENDIGESTELLE_ID = UUID.randomUUID().toString();
@BeforeEach @BeforeEach
void prepareDatabase() { void prepareDatabase() {
mongoOperations.dropCollection(Vorgang.class); mongoOperations.dropCollection(Vorgang.class);
mongoOperations.save(buildWithOrganisationseinheitId()); mongoOperations.save(buildWithOtherOrganisationseinheitId());
mongoOperations.save(VorgangTestFactory.createBuilder().id("42").build()); mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build());
} }
private Vorgang buildWithOrganisationseinheitId() { private Vorgang buildWithOtherOrganisationseinheitId() {
var zustaendigeStelle = ZustaendigeStelleTestFactory.createBuilder().organisationseinheitenId(ORGANISATIONSEINHEIT_ID).build(); var zustaendigeStelle = ZustaendigeStelleTestFactory.createBuilder().organisationseinheitenId(OTHER_ZUSTAENDIGESTELLE_ID).build();
var eingang = EingangTestFactory.createBuilder().zustaendigeStelle(zustaendigeStelle).build(); var eingang = EingangTestFactory.createBuilder().zustaendigeStelle(zustaendigeStelle).build();
return VorgangTestFactory.createBuilder().id("44").eingang(eingang).build();
return VorgangTestFactory.createBuilder().id(null).clearEingangs().eingang(eingang).build();
} }
@Test @Test
void shouldReturnFilteredVorgaenge() { void shouldHaveOneAsTotalElements() {
var vorgangHeaderPage = repository.findAll(buildRequest()); var vorgangHeaderPage = repository.findAll(buildRequest());
assertThat(vorgangHeaderPage.getTotalElements()).isEqualTo(1); assertThat(vorgangHeaderPage.getTotalElements()).isEqualTo(1);
} }
@Test
void shouldReturnOnlyOneVorgang() {
var vorgangHeaderPage = repository.findAll(buildRequest());
assertThat(vorgangHeaderPage.getNumberOfElements()).isEqualTo(1);
}
@Test
void shouldHaveOnlyOnePage() {
var vorgangHeaderPage = repository.findAll(buildRequest());
assertThat(vorgangHeaderPage.getTotalPages()).isEqualTo(1);
}
private FindVorgangRequest buildRequest() { private FindVorgangRequest buildRequest() {
return FindVorgangRequestTestFactory.createBuilder().offset(0).limit(10).filterBy( return FindVorgangRequestTestFactory.createBuilder().offset(0).limit(1).searchBy(StringUtils.EMPTY)
FilterBy.builder().organisationseinheitId(ORGANISATIONSEINHEIT_ID).build()).searchBy(StringUtils.EMPTY).build(); .filterBy(FilterBy.builder().organisationseinheitId(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID).build())
.build();
} }
} }
} }
\ No newline at end of file
...@@ -150,11 +150,13 @@ class VorgangITCase { ...@@ -150,11 +150,13 @@ class VorgangITCase {
assertThat(response.get(0).getVorgangList()).hasSize(2); assertThat(response.get(0).getVorgangList()).hasSize(2);
} }
} }
@Nested @Nested
class TestFindAllSearchBy { class TestFindAllSearchBy {
private final String SEARCH_BY = "ShouldBeIncluded"; private final String SEARCH_BY = "ShouldBeIncluded";
private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.createBuilder().setSearchBy(SEARCH_BY).clearFilterBy().build(); private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.createBuilder().setSearchBy(SEARCH_BY).clearFilterBy()
.build();
@BeforeEach @BeforeEach
void prepareDatabase() { void prepareDatabase() {
...@@ -180,7 +182,9 @@ class VorgangITCase { ...@@ -180,7 +182,9 @@ class VorgangITCase {
private final String ORGANISATIONSEINHEIT_ID = "094321"; private final String ORGANISATIONSEINHEIT_ID = "094321";
private final GrpcFilterBy FILTER_BY = GrpcFilterByTestFactory.createBuilder().addOrganisationseinheitId(ORGANISATIONSEINHEIT_ID).build(); private final GrpcFilterBy FILTER_BY = GrpcFilterByTestFactory.createBuilder().addOrganisationseinheitId(ORGANISATIONSEINHEIT_ID).build();
private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.createBuilder().setFilterBy(FILTER_BY).clearSearchBy().build(); private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.createBuilder()
.setFilterBy(FILTER_BY).clearSearchBy()
.setLimit(1).build();
@BeforeEach @BeforeEach
void prepareDatabase() { void prepareDatabase() {
...@@ -191,7 +195,7 @@ class VorgangITCase { ...@@ -191,7 +195,7 @@ class VorgangITCase {
} }
@Test @Test
void shouldReturnVorgaenge() { void shouldReturnOnlyMatchingVorgang() {
callServiceFindVorgang(request); callServiceFindVorgang(request);
var response = responseObserver.getValues(); var response = responseObserver.getValues();
...@@ -199,6 +203,15 @@ class VorgangITCase { ...@@ -199,6 +203,15 @@ class VorgangITCase {
assertThat(response.get(0).getVorgangList()).hasSize(1); assertThat(response.get(0).getVorgangList()).hasSize(1);
assertThat(response.get(0).getVorgangList().get(0).getId()).isEqualTo("2"); assertThat(response.get(0).getVorgangList().get(0).getId()).isEqualTo("2");
} }
@Test
void shouldReturnOneTotalPages() {
callServiceFindVorgang(request);
var response = responseObserver.getValues();
assertThat(response.get(0).getTotal()).isEqualTo(1);
}
} }
@Nested @Nested
...@@ -207,7 +220,8 @@ class VorgangITCase { ...@@ -207,7 +220,8 @@ class VorgangITCase {
private final String SEARCH_BY = "ShouldBeIncluded"; private final String SEARCH_BY = "ShouldBeIncluded";
private final String ORGANISATIONSEINHEIT_ID = "094321"; private final String ORGANISATIONSEINHEIT_ID = "094321";
private final GrpcFilterBy FILTER_BY = GrpcFilterByTestFactory.createBuilder().addOrganisationseinheitId(ORGANISATIONSEINHEIT_ID).build(); private final GrpcFilterBy FILTER_BY = GrpcFilterByTestFactory.createBuilder().addOrganisationseinheitId(ORGANISATIONSEINHEIT_ID).build();
private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.createBuilder().setFilterBy(FILTER_BY).setSearchBy(SEARCH_BY).build(); private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.createBuilder().setFilterBy(FILTER_BY)
.setSearchBy(SEARCH_BY).build();
@BeforeEach @BeforeEach
void prepareDatabase() { void prepareDatabase() {
...@@ -227,16 +241,19 @@ class VorgangITCase { ...@@ -227,16 +241,19 @@ class VorgangITCase {
assertThat(response.get(0).getVorgangList().get(0).getId()).isEqualTo("2"); assertThat(response.get(0).getVorgangList().get(0).getId()).isEqualTo("2");
} }
} }
private Vorgang buildVorgangWithRequestId(String id, String searchBy) { private Vorgang buildVorgangWithRequestId(String id, String searchBy) {
return buildVorgangWithEingang(id, EingangTestFactory.createBuilder().header(buildEingangHeader(searchBy)).build()); return buildVorgangWithEingang(id, EingangTestFactory.createBuilder().header(buildEingangHeader(searchBy)).build());
} }
private Vorgang buildVorgangWithRequestIdAndOrganisationseinheitId(String id, String organisationseinheitId, String searchBy) { private Vorgang buildVorgangWithRequestIdAndOrganisationseinheitId(String id, String organisationseinheitId, String searchBy) {
return buildVorgangWithEingang(id, EingangTestFactory.createBuilder().header(buildEingangHeader(searchBy)).zustaendigeStelle(buildZustaendigeStelle(organisationseinheitId)).build()); return buildVorgangWithEingang(id, EingangTestFactory.createBuilder().header(buildEingangHeader(searchBy))
.zustaendigeStelle(buildZustaendigeStelle(organisationseinheitId)).build());
} }
private Vorgang buildVorgangWithOrganisationseinheitId(String id, String organisationseinheitId) { private Vorgang buildVorgangWithOrganisationseinheitId(String id, String organisationseinheitId) {
return buildVorgangWithEingang(id, EingangTestFactory.createBuilder().zustaendigeStelle(buildZustaendigeStelle(organisationseinheitId)).build()); return buildVorgangWithEingang(id,
EingangTestFactory.createBuilder().zustaendigeStelle(buildZustaendigeStelle(organisationseinheitId)).build());
} }
private EingangHeader buildEingangHeader(String searchBy) { private EingangHeader buildEingangHeader(String searchBy) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment