diff --git a/notification-manager/src/test/java/de/itvsh/kop/notification/user/UserRemoteServiceTest.java b/notification-manager/src/test/java/de/itvsh/kop/notification/user/UserRemoteServiceTest.java index 296fcf20684c04c41ce58c47acbcc85ccb6441d1..2a18404a0eb84d43f21b2442a1d2f46353e9c824 100644 --- a/notification-manager/src/test/java/de/itvsh/kop/notification/user/UserRemoteServiceTest.java +++ b/notification-manager/src/test/java/de/itvsh/kop/notification/user/UserRemoteServiceTest.java @@ -1,15 +1,15 @@ package de.itvsh.kop.notification.user; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + import de.itvsh.kop.user.grpc.recipient.RecipientServiceGrpc.RecipientServiceBlockingStub; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - class UserRemoteServiceTest { @InjectMocks @@ -24,7 +24,7 @@ class UserRemoteServiceTest { class TestRequestRecipients { @Test - void shouldConvertCorrectly(){ + void shouldConvertCorrectly() { when(recipientService.findRecipientByOrganisationsEinheitId(any())).thenReturn(GrpcFindRecipientRequestTestFactory.create()); when(mapper.fromGrpc(any())).thenReturn(RecipientTestFactory.create()); diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/search/SearchVorgangCustomRepositoryImpl.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/search/SearchVorgangCustomRepositoryImpl.java index f24900e2fd9d447ebd235a7295369510d374895b..bac1b5906dd86435f122bdd29d7b8199ebb59504 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/search/SearchVorgangCustomRepositoryImpl.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/search/SearchVorgangCustomRepositoryImpl.java @@ -6,6 +6,7 @@ import static org.elasticsearch.index.query.QueryBuilders.*; import java.util.Arrays; import java.util.Map; +import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -24,6 +25,8 @@ import de.itvsh.ozg.pluto.vorgang.VorgangHeader; @Repository class SearchVorgangCustomRepositoryImpl implements SearchVorgangCustomRepostitory { + private static final String JOIN_AND = " AND "; + private static final String WILDCARD_PATTERN = "(*%s*)"; private static final String KEYWORD = ".keyword"; private static final float HALF_BOOST = 0.5f; private static final float DOUBLE_BOOST = 2f; @@ -57,8 +60,10 @@ class SearchVorgangCustomRepositoryImpl implements SearchVorgangCustomRepostitor setFilter(request, searchQueryBuilder); - Arrays.stream(request.getQuery().strip().split(" ")).forEach(query -> searchQueryBuilder - .withQuery(queryStringQuery("*" + query + "*").fields(SearchVorgangCustomRepositoryImpl.FIELD_MAP))); + var queryString = Arrays.stream(request.getQuery().strip().split(StringUtils.SPACE)).map( + WILDCARD_PATTERN::formatted).collect(Collectors.joining(JOIN_AND)); + + searchQueryBuilder.withQuery(queryStringQuery(queryString).fields(SearchVorgangCustomRepositoryImpl.FIELD_MAP)); return searchQueryBuilder.withPageable(pageable).build(); } diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/CustomVorgangHeaderRepository.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/CustomVorgangHeaderRepository.java index 6fb75d05fe7bc956ce88e181f5adeda9d198ef22..a9d6d45a1994f7c1122a0649bfaf10a244e3182e 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/CustomVorgangHeaderRepository.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/CustomVorgangHeaderRepository.java @@ -5,6 +5,4 @@ import org.springframework.data.domain.Page; interface CustomVorgangHeaderRepository { Page<VorgangHeader> findAll(FindVorgangRequest request); - - Page<VorgangHeader> searchBy(FindVorgangRequest request); } \ No newline at end of file diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryImpl.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryImpl.java index a02a13ebe833a094f81f3aa686fa72242447a421..855e6aa9e7ae642d713bafc1acbb147c8a3ca7a6 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryImpl.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryImpl.java @@ -42,11 +42,6 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository { return checkAndExecuteRequest(request, buildFilterQuery(request.getFilterBy())); } - @Override - public Page<VorgangHeader> searchBy(FindVorgangRequest request) { - return checkAndExecuteRequest(request, buildFilterQuery(request.getFilterBy(), request.getSearchBy())); - } - private Page<VorgangHeader> checkAndExecuteRequest(FindVorgangRequest request, Query totalQuery) { if (hasNoPermissionByOrganisationseinheitenId(request.getFilterBy())) { return new PageImpl<>(Collections.emptyList()); @@ -83,10 +78,6 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository { return Query.query(filterToCriteria(filterCriteria)); } - Query buildFilterQuery(FilterCriteria filterCriteria, String searchBy) { - return Query.query(new Criteria().andOperator(filterToCriteria(filterCriteria), CriteriaUtil.searchCriteria(searchBy))); - } - private Criteria filterToCriteria(FilterCriteria filterCriteria) { var organisationseinheitenIdCriteria = buildOrganisationseinheitenCriteria(filterCriteria); var assignedToCriteria = buildAssignedToCriteria(filterCriteria); diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderService.java index 7baa10cfda9f27e143384053922ec88d63e3dfc5..844bd0ccff2d1f9820be087aa1d4600c0db5d5b2 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderService.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderService.java @@ -1,9 +1,7 @@ package de.itvsh.ozg.pluto.vorgang; import java.util.Objects; -import java.util.Optional; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -26,11 +24,8 @@ class VorgangHeaderService { public Page<VorgangHeader> findAll(FindVorgangRequest request) { if (Objects.nonNull(searchService) && Objects.nonNull(request.getSearchBy())) { return removeUnpermitted(searchService.find(request)); - } else { - return removeUnpermitted(Optional.ofNullable(StringUtils.trimToNull(request.getSearchBy())) - .map(searchString -> repository.searchBy(request)) - .orElseGet(() -> repository.findAll(request))); } + return removeUnpermitted(repository.findAll(request)); } private Page<VorgangHeader> removeUnpermitted(Page<VorgangHeader> loaded) { diff --git a/pluto-server/src/main/resources/application-local.yml b/pluto-server/src/main/resources/application-local.yml index fc1c5e1cec2ce51ba5e7828654769747fe7143d0..3771011de521e481d24e72ff7770c5f2fb28ffc3 100644 --- a/pluto-server/src/main/resources/application-local.yml +++ b/pluto-server/src/main/resources/application-local.yml @@ -29,7 +29,7 @@ spring: properties: '[mail.smtp.starttls.enable]': true elasticsearch: - #uris: http://localhost:9200 + uris: http://localhost:9200 username: elastic password: password diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/search/SearchServiceITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/search/SearchServiceITCase.java index a2272b0aae88875ba17ff896306affba498a2bd1..41ee8307e061a80be2c838ffb4329b89bd2988dc 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/search/SearchServiceITCase.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/search/SearchServiceITCase.java @@ -123,7 +123,7 @@ public class SearchServiceITCase { void shouldFindByAntragstellerNameAndAktenzeichen() { var res = searchService .find(FindVorgangRequestTestFactory.createBuilder() - .searchBy(IndexedVorgangTestFactory.ANTRAGSTELLER_NAME + " test") + .searchBy(IndexedVorgangTestFactory.ANTRAGSTELLER_NAME + " tes") .filterBy(FilterCriteriaTestFactory.createBuilder().clearStatus().assignedTo(null).build()) .build()); diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/search/SearchVorgangCustomRepositoryImplTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/search/SearchVorgangCustomRepositoryImplTest.java index 20a67199ff2ceabe22f83460f5f4a2c7907dca30..bdc49a9a4394e842ca4cdd57db01b684124f19a7 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/search/SearchVorgangCustomRepositoryImplTest.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/search/SearchVorgangCustomRepositoryImplTest.java @@ -81,12 +81,11 @@ class SearchVorgangCustomRepositoryImplTest { } @Test - void shouldHaveQuery() { + void shouldHaveFieldsWithWights() { var request = SearchRequestTestFactory.create(); var query = searchRepostitory.createQuery(request, PageRequest.of(request.getOffSet(), request.getLimit())); assertThat(query.getQuery()).isNotNull(); - assertThat(query.getQuery()).asString().contains("\"query\" : \"*vors*\""); assertThat(query.getQuery()).asString().contains("aktenzeichen^2.0"); assertThat(query.getQuery()).asString().contains("antragstellerName^1.0"); assertThat(query.getQuery()).asString().contains("antragstellerVorname^1.0"); @@ -94,6 +93,22 @@ class SearchVorgangCustomRepositoryImplTest { assertThat(query.getQuery()).asString().contains("vorgangNummer^2.0"); } + @Test + void shouldHaveSimpleQuery() { + var request = SearchRequestTestFactory.create(); + var query = searchRepostitory.createQuery(request, PageRequest.of(request.getOffSet(), request.getLimit())); + + assertThat(query.getQuery()).asString().contains("\"query\" : \"(*vors*)\""); + } + + @Test + void shouldHaveQuery() { + var request = SearchRequestTestFactory.createBuilder().query("vors test").build(); + var query = searchRepostitory.createQuery(request, PageRequest.of(request.getOffSet(), request.getLimit())); + + assertThat(query.getQuery()).asString().contains("\"query\" : \"(*vors*) AND (*test*)\""); + } + @Nested class forRolePoststelle { @Test diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryITCase.java index 122567b8d0dc1a3ec8da95facacb7bfe2891b1be..e0fddca0f70d32db79adfd0e5e407d1f817a84f2 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryITCase.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryITCase.java @@ -16,7 +16,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.EnumSource.Mode; import org.springframework.beans.factory.annotation.Autowired; @@ -48,239 +47,6 @@ class VorgangHeaderRepositoryITCase { mongoOperations.dropCollection(Vorgang.class); } - @Nested - class TestSearchBy { - - @ParameterizedTest - @CsvSource({ "test--", "--test", "-test-", "TEst--" }) - void shouldFindByAktenzeichen(String aktenzeichen) { - mongoOperations.save(buildWithAktenzeichen(aktenzeichen)); - - var result = repository.searchBy(createRequestWithSearchBy("test")).getContent(); - - assertThat(result).hasSize(1); - } - - @ParameterizedTest - @CsvSource({ "Paul", "Pauline", "testpauler", "PaULie" }) - void shouldFindByVornamen(String vornamen) { - mongoOperations.save(buildVorgangWithVornamen(vornamen)); - - var result = repository.searchBy(createRequestWithSearchBy("Paul")).getContent(); - - assertThat(result).hasSize(1); - } - - private Vorgang buildVorgangWithVornamen(String vornamen) { - return VorgangTestFactory.createBuilder() - .id(null) - .clearEingangs() - .eingang(EingangTestFactory.createBuilder() - .antragsteller(AntragstellerTestFactory.createBuilder() - .vorname(vornamen) - .build()) - .build()) - .build(); - } - - @ParameterizedTest - @CsvSource({ "Maier", "Biermaier", "Maiertest", "Testmaiertest" }) - void shouldFindByNachnamen(String nachname) { - mongoOperations.save(buildWithNachname(nachname)); - - var result = repository.searchBy(createRequestWithSearchBy("Maier")).getContent(); - - assertThat(result).hasSize(1); - } - - @ParameterizedTest - @CsvSource({ "Fischereischein", "Fischer", "AFischereischein", "xFischEreischEinx" }) - void shouldFindByVorgangName(String name) { - mongoOperations.save(buildWithVorgangName(name)); - - var result = repository.searchBy(createRequestWithSearchBy("Fischer")).getContent(); - - assertThat(result).hasSize(1); - } - - @ParameterizedTest - @CsvSource({ "32456 0815 34", "0815 123 456", "123 456 0815" }) - void shouldFindByRequestId(String requestId) { - mongoOperations.save(buildVorgangWithRequestId(requestId)); - - var result = repository.searchBy(createRequestWithSearchBy("0815")).getContent(); - - assertThat(result).hasSize(1); - } - - private Vorgang buildVorgangWithRequestId(String requestId) { - return VorgangTestFactory.createBuilder() - .eingang(EingangTestFactory.createBuilder() - .header(EingangHeaderTestFactory.createBuilder() - .requestId(requestId) - .build()) - .build()) - .build(); - } - - @ParameterizedTest - @CsvSource({ "Testaktenzeichen, Paultest, Testmaier, TEstvorgang", "Aktenzeichentest, Test-Marie, Meiertest, vorgangTEst" }) - void shouldFindByInSomeFields(String aktenzeichen, String vorname, String nachname, String vorgangId) { - mongoOperations.save(buildWithAktenzeichen(aktenzeichen)); - mongoOperations.save(buildVorgangWithVornamen(vorname)); - mongoOperations.save(buildWithNachname(nachname)); - mongoOperations.save(buildWithVorgangName(vorgangId)); - - var result = repository.searchBy(createRequestWithSearchBy("test")).getContent(); - - assertThat(result).hasSize(4); - } - - @ParameterizedTest - @CsvSource({ "Testaktenzeichen, Pinguin, bla, bla-vorgang", "Aktenzeichentest, Pechbla, blub, vorgang-blub" }) - void shouldNotFindMultipleWordsByInSomeFields(String aktenzeichen, String vorname, String nachname, String vorgangId) { - mongoOperations.save(buildWithAktenzeichen(aktenzeichen)); - mongoOperations.save(buildWithVorgangName(vorname)); - mongoOperations.save(buildWithNachname(nachname)); - mongoOperations.save(buildWithVorgangName(vorgangId)); - - var result = repository.searchBy(createRequestWithSearchBy("test bla")).getContent(); - - assertThat(result).isEmpty(); - } - - private Vorgang buildWithAktenzeichen(String aktenzeichen) { - return VorgangTestFactory.createBuilder().id(null).aktenzeichen(aktenzeichen).status(Status.ANGENOMMEN).build(); - } - - private Vorgang buildWithVorgangName(String name) { - return VorgangTestFactory.createBuilder().id(null).name(name).build(); - } - - private Vorgang buildWithNachname(String nachname) { - return VorgangTestFactory.createBuilder().id(null) - .clearEingangs().eingang(EingangTestFactory.createBuilder() - .antragsteller(AntragstellerTestFactory.createBuilder() - .nachname(nachname) - .build()) - .build()) - .build(); - } - - @ParameterizedTest - @CsvSource({ "Testaktenzeichen, bla-vorgang", "Aktenzeichentest, vorgang-bla" }) - void shouldFindMultipleWordsByInSomeFields(String aktenzeichen, String vorgangId) { - mongoOperations.save(buildWithAktenzeichenAndVorgangnamen(aktenzeichen, vorgangId)); - mongoOperations.save(buildWithAktenzeichenAndVorgangnamen(aktenzeichen, vorgangId)); - - var result = repository.searchBy(createRequestWithSearchBy("test bla")).getContent(); - - assertThat(result).hasSize(2); - } - - private Vorgang buildWithAktenzeichenAndVorgangnamen(String aktenzeichen, String name) { - return VorgangTestFactory.createBuilder() - .id(UUID.randomUUID().toString()) - .name(name) - .aktenzeichen(aktenzeichen) - .build(); - } - - @ParameterizedTest - @CsvSource({ "vorgangNummer1234", "--Nummer1234", "-ngNu-", "VorgangNu--" }) - void shouldFindByNummer(String nummer) { - mongoOperations.save(buildWithNummer(nummer)); - - var result = repository.searchBy(createRequestWithSearchBy("Nu")).getContent(); - - assertThat(result).hasSize(1); - } - - private Vorgang buildWithNummer(String nummer) { - return VorgangTestFactory.createBuilder().id(null).nummer(nummer).build(); - } - - private FindVorgangRequest createRequestWithSearchBy(String searchTerm) { - return FindVorgangRequestTestFactory.createBuilder() - .searchBy(searchTerm).filterBy(null).limit(10).offset(0) - .build(); - } - } - - @Nested - class TestSearchByEingangsKennzeichen { - - private final String NO_DEFAULT_MATCH = "no match"; - private final String EINGANGSKENNZEICHEN = "0815"; - - @ParameterizedTest - @EnumSource - void shouldFindInAnyStatus(Status status) { - mongoOperations.save(buildWithEingangsKennzeichen(EINGANGSKENNZEICHEN, status)); - mongoOperations.save(buildWithEingangsKennzeichen(NO_DEFAULT_MATCH, status)); - - var request = FindVorgangRequestTestFactory.createBuilder() - .searchBy(EINGANGSKENNZEICHEN).filterBy(null) - .build(); - var result = repository.searchBy(request).getContent(); - - assertThat(result).hasSize(1); - } - - @Test - void shouldHaveTotalByEingangskennzeichenAndOrganisationseinheitenId() { - mongoOperations.save(buildWithEingangsKennzeichen(EINGANGSKENNZEICHEN)); - mongoOperations.save(buildWithEingangsKennzeichen(EINGANGSKENNZEICHEN)); - mongoOperations.save(buildWithEingangsKennzeichen(EINGANGSKENNZEICHEN)); - mongoOperations.save(buildWithEingangsKennzeichen(NO_DEFAULT_MATCH)); - mongoOperations.save(buildWithEingangsKennzeichenAndOrganisationseinheitenId(NO_DEFAULT_MATCH, NO_DEFAULT_MATCH, Status.NEU)); - - var request = FindVorgangRequestTestFactory.createBuilder() - .searchBy(EINGANGSKENNZEICHEN).filterBy(FilterCriteriaTestFactory.create()).limit(1).offset(0) - .build(); - var result = repository.searchBy(request); - - assertThat(result.getTotalElements()).isEqualTo(3); - } - - private Vorgang buildWithEingangsKennzeichen(String eingangskennzeichen) { - return buildWithEingangsKennzeichen(eingangskennzeichen, Status.NEU); - } - - @Nested - class TestWithFilterByOrganisationseinheit { - - @ParameterizedTest - @EnumSource - void shouldFindInAnyStatus(Status status) { - mongoOperations.save(buildWithEingangsKennzeichen(EINGANGSKENNZEICHEN, status)); - mongoOperations.save(buildWithEingangsKennzeichen(NO_DEFAULT_MATCH, status)); - mongoOperations.save(buildWithEingangsKennzeichenAndOrganisationseinheitenId(NO_DEFAULT_MATCH, NO_DEFAULT_MATCH, status)); - - var request = FindVorgangRequestTestFactory.createBuilder() - .searchBy(EINGANGSKENNZEICHEN).filterBy(FilterCriteriaTestFactory.createBuilder().clearStatus().assignedTo(null).build()) - .build(); - var result = repository.searchBy(request).getContent(); - - assertThat(result).hasSize(1); - } - } - - private Vorgang buildWithEingangsKennzeichen(String kennz, Status status) { - var header = EingangHeaderTestFactory.createBuilder().requestId(kennz).build(); - var eingang = EingangTestFactory.createBuilder().header(header).build(); - return VorgangTestFactory.createBuilder().id(null).status(status).clearEingangs().eingang(eingang).build(); - } - - private Vorgang buildWithEingangsKennzeichenAndOrganisationseinheitenId(String kennz, String organisationseinheitenId, Status status) { - var header = EingangHeaderTestFactory.createBuilder().requestId(kennz).build(); - var zustaendigeStelle = ZustaendigeStelleTestFactory.createBuilder().organisationseinheitenId(organisationseinheitenId) - .build(); - var eingang = EingangTestFactory.createBuilder().header(header).zustaendigeStelle(zustaendigeStelle).build(); - return VorgangTestFactory.createBuilder().id(null).status(status).clearEingangs().eingang(eingang).build(); - } - } - @Nested class TestSortByPriority {