From a3e6b82ec14d146fd9643fa32c364d4d0a0a8171 Mon Sep 17 00:00:00 2001 From: fmendezh Date: Tue, 4 May 2021 17:20:20 +0200 Subject: [PATCH] https://github.com/gbif/registry/issues/352 --- .../ws/OrganizationRequestSearchParams.java | 12 +++++++ .../gbif/registry/ws/it/OrganizationIT.java | 32 +++++++++++++++++++ .../mapper/OrganizationMapper.java | 4 ++- .../persistence/mapper/OrganizationMapper.xml | 16 ++++++++++ .../ws/resources/OrganizationResource.java | 7 ++-- 5 files changed, 67 insertions(+), 4 deletions(-) diff --git a/registry-domain/src/main/java/org/gbif/registry/domain/ws/OrganizationRequestSearchParams.java b/registry-domain/src/main/java/org/gbif/registry/domain/ws/OrganizationRequestSearchParams.java index d91844850e..4f872761d7 100644 --- a/registry-domain/src/main/java/org/gbif/registry/domain/ws/OrganizationRequestSearchParams.java +++ b/registry-domain/src/main/java/org/gbif/registry/domain/ws/OrganizationRequestSearchParams.java @@ -15,12 +15,15 @@ */ package org.gbif.registry.domain.ws; +import java.util.UUID; import javax.annotation.Nullable; public class OrganizationRequestSearchParams extends RequestSearchParams { private Boolean isEndorsed; + private UUID networkKey; + @Nullable public Boolean getIsEndorsed() { return isEndorsed; @@ -29,4 +32,13 @@ public Boolean getIsEndorsed() { public void setIsEndorsed(@Nullable Boolean isEndorsed) { this.isEndorsed = isEndorsed; } + + @Nullable + public UUID getNetworkKey() { + return networkKey; + } + + public void setNetworkKey(UUID networkKey) { + this.networkKey = networkKey; + } } diff --git a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/OrganizationIT.java b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/OrganizationIT.java index 200ac3b62f..9affe129b8 100644 --- a/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/OrganizationIT.java +++ b/registry-integration-tests/src/test/java/org/gbif/registry/ws/it/OrganizationIT.java @@ -17,16 +17,22 @@ import org.gbif.api.model.common.paging.PagingRequest; import org.gbif.api.model.common.paging.PagingResponse; +import org.gbif.api.model.registry.Dataset; import org.gbif.api.model.registry.Installation; +import org.gbif.api.model.registry.Network; import org.gbif.api.model.registry.Node; import org.gbif.api.model.registry.Organization; +import org.gbif.api.service.registry.DatasetService; +import org.gbif.api.service.registry.NetworkService; import org.gbif.api.service.registry.NodeService; import org.gbif.api.service.registry.OrganizationService; import org.gbif.api.vocabulary.Country; +import org.gbif.registry.domain.ws.OrganizationRequestSearchParams; import org.gbif.registry.search.test.EsManageServer; import org.gbif.registry.test.TestDataFactory; import org.gbif.registry.ws.client.NodeClient; import org.gbif.registry.ws.client.OrganizationClient; +import org.gbif.registry.ws.resources.OrganizationResource; import org.gbif.ws.client.filter.SimplePrincipalProvider; import org.gbif.ws.security.KeyStore; @@ -35,6 +41,7 @@ import javax.annotation.Nullable; import org.apache.commons.beanutils.BeanUtils; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.springframework.beans.factory.annotation.Autowired; @@ -55,6 +62,9 @@ public class OrganizationIT extends NetworkEntityIT { private final NodeService nodeResource; private final NodeService nodeClient; + private final NetworkService networkService; + private final OrganizationResource organizationResource; + private final TestDataFactory testDataFactory; @@ -62,6 +72,8 @@ public class OrganizationIT extends NetworkEntityIT { public OrganizationIT( OrganizationService service, NodeService nodeResource, + NetworkService networkService, + OrganizationResource organizationResource, @Nullable SimplePrincipalProvider principalProvider, TestDataFactory testDataFactory, EsManageServer esServer, @@ -78,6 +90,8 @@ public OrganizationIT( this.nodeResource = nodeResource; this.nodeClient = prepareClient(localServerPort, keyStore, NodeClient.class); this.testDataFactory = testDataFactory; + this.networkService = networkService; + this.organizationResource = organizationResource; } @ParameterizedTest @@ -128,6 +142,24 @@ public void testByCountry(ServiceType serviceType) { assertResultsOfSize(service.listByCountry(Country.GERMANY, new PagingRequest()), 0); } + @Test + public void searchByNetworkTest() { + Installation installation = testDataFactory.newPersistedInstallation(); + Dataset dataset = testDataFactory.newPersistedDataset(installation.getOrganizationKey(), installation.getKey()); + Network network = testDataFactory.newPersistedNetwork(); + + OrganizationRequestSearchParams searchParams = new OrganizationRequestSearchParams(); + searchParams.setNetworkKey(network.getKey()); + PagingResponse response = organizationResource.list(null, searchParams, null); + + assertResultsOfSize(response, 0); + + networkService.addConstituent(network.getKey(), dataset.getKey()); + response = organizationResource.list(null, searchParams, null); + + assertResultsOfSize(response, 1); + } + @ParameterizedTest @EnumSource(ServiceType.class) public void testHostedByInstallationList(ServiceType serviceType) { diff --git a/registry-persistence/src/main/java/org/gbif/registry/persistence/mapper/OrganizationMapper.java b/registry-persistence/src/main/java/org/gbif/registry/persistence/mapper/OrganizationMapper.java index 2dd1ed0d19..66fc8bc96f 100644 --- a/registry-persistence/src/main/java/org/gbif/registry/persistence/mapper/OrganizationMapper.java +++ b/registry-persistence/src/main/java/org/gbif/registry/persistence/mapper/OrganizationMapper.java @@ -121,13 +121,15 @@ List search( @Nullable @Param("query") String query, @Param("country") Country country, @Param("isEndorsed") Boolean isEndorsed, + @Param("networkKey") UUID networkKey, @Nullable @Param("page") Pageable page); /** Overloaded count to allow a search scoped by country. */ int count( @Nullable @Param("query") String query, @Param("country") Country country, - @Param("isEndorsed") Boolean isEndorsed); + @Param("isEndorsed") Boolean isEndorsed, + @Param("networkKey") UUID networkKey); /** Count all the publishing organizations that are part of this network. */ long countPublishingOrganizationsInNetwork(@Param("networkKey") UUID networkKey); diff --git a/registry-persistence/src/main/resources/org/gbif/registry/persistence/mapper/OrganizationMapper.xml b/registry-persistence/src/main/resources/org/gbif/registry/persistence/mapper/OrganizationMapper.xml index e824461dbc..ec5f4daec4 100644 --- a/registry-persistence/src/main/resources/org/gbif/registry/persistence/mapper/OrganizationMapper.xml +++ b/registry-persistence/src/main/resources/org/gbif/registry/persistence/mapper/OrganizationMapper.xml @@ -192,6 +192,14 @@ AND o.endorsement_approved = #{isEndorsed,jdbcType=BOOLEAN} + + AND EXISTS ( + SELECT d2.publishing_organization_key + FROM dataset d2 + JOIN dataset_network nk ON nk.dataset_key = d2.key + JOIN network n ON n.key = nk.network_key AND n.deleted IS NULL + WHERE d2.publishing_organization_key = o.key AND n.key = #{networkKey,jdbcType=OTHER}) + ORDER BY ts_rank_cd(o.fulltext_search, query) DESC, o.created DESC, key LIMIT #{page.limit} OFFSET #{page.offset} @@ -211,6 +219,14 @@ AND o.endorsement_approved = #{isEndorsed,jdbcType=BOOLEAN} + + AND EXISTS ( + SELECT d2.publishing_organization_key + FROM dataset d2 + JOIN dataset_network nk ON nk.dataset_key = d2.key + JOIN network n ON n.key = nk.network_key AND n.deleted IS NULL + WHERE d2.publishing_organization_key = o.key AND n.key = #{networkKey,jdbcType=OTHER}) + diff --git a/registry-ws/src/main/java/org/gbif/registry/ws/resources/OrganizationResource.java b/registry-ws/src/main/java/org/gbif/registry/ws/resources/OrganizationResource.java index f7aaf96b07..da1011286d 100644 --- a/registry-ws/src/main/java/org/gbif/registry/ws/resources/OrganizationResource.java +++ b/registry-ws/src/main/java/org/gbif/registry/ws/resources/OrganizationResource.java @@ -211,7 +211,8 @@ public PagingResponse list( // short circuited list all if (country == null && request.getIsEndorsed() == null - && Strings.isNullOrEmpty(request.getQ())) { + && Strings.isNullOrEmpty(request.getQ()) + && request.getNetworkKey() == null) { return list(page); } @@ -221,13 +222,13 @@ public PagingResponse list( request.getQ() != null ? Strings.emptyToNull(CharMatcher.WHITESPACE.trimFrom(request.getQ())) : request.getQ(); - long total = organizationMapper.count(query, country, request.getIsEndorsed()); + long total = organizationMapper.count(query, country, request.getIsEndorsed(), request.getNetworkKey()); page = page == null ? new PagingRequest() : page; return new PagingResponse<>( page.getOffset(), page.getLimit(), total, - organizationMapper.search(query, country, request.getIsEndorsed(), page)); + organizationMapper.search(query, country, request.getIsEndorsed(), request.getNetworkKey(), page)); } @GetMapping("{key}/hostedDataset")