From cb8aec76116bb19e910c1bf91112c99b14f61de4 Mon Sep 17 00:00:00 2001 From: EL HAJJIOUI Nabil <nabil.elhajjioui@smile.fr> Date: Wed, 10 Nov 2021 17:41:14 +0100 Subject: [PATCH] [VAS] Item 8673 order filling holding scheme trees (#532) --- .../rest/ArchiveSearchInternalController.java | 31 +--------------- .../service/ArchiveSearchInternalService.java | 35 +++++++++++++++++-- .../ArchiveSearchInternalServiceTest.java | 16 +++++++++ .../data/fillingholding/expected_query.json | 31 ++++++++++++++++ 4 files changed, 81 insertions(+), 32 deletions(-) create mode 100644 api/api-archive-search/archive-search-internal/src/test/resources/data/fillingholding/expected_query.json diff --git a/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/rest/ArchiveSearchInternalController.java b/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/rest/ArchiveSearchInternalController.java index 161274f57..97da92380 100644 --- a/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/rest/ArchiveSearchInternalController.java +++ b/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/rest/ArchiveSearchInternalController.java @@ -29,10 +29,6 @@ package fr.gouv.vitamui.archive.internal.server.rest; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import fr.gouv.vitam.common.client.VitamContext; -import fr.gouv.vitam.common.database.builder.query.Query; -import fr.gouv.vitam.common.database.builder.request.exception.InvalidCreateOperationException; -import fr.gouv.vitam.common.database.builder.request.multiple.SelectMultiQuery; -import fr.gouv.vitam.common.exception.InvalidParseOperationException; import fr.gouv.vitam.common.exception.VitamClientException; import fr.gouv.vitamui.archive.internal.server.service.ArchiveSearchInternalService; import fr.gouv.vitamui.archives.search.common.dto.ArchiveUnitsDto; @@ -42,12 +38,10 @@ import fr.gouv.vitamui.archives.search.common.rest.RestApi; import fr.gouv.vitamui.common.security.SanityChecker; import fr.gouv.vitamui.commons.api.CommonConstants; import fr.gouv.vitamui.commons.api.ParameterChecker; -import fr.gouv.vitamui.commons.api.exception.UnexpectedDataException; import fr.gouv.vitamui.commons.api.logger.VitamUILogger; import fr.gouv.vitamui.commons.api.logger.VitamUILoggerFactory; import fr.gouv.vitamui.commons.vitam.api.dto.ResultsDto; import fr.gouv.vitamui.commons.vitam.api.dto.VitamUISearchResponseDto; -import fr.gouv.vitamui.commons.vitam.api.model.UnitTypeEnum; import fr.gouv.vitamui.iam.security.service.InternalSecurityService; import io.swagger.annotations.Api; import lombok.Getter; @@ -70,9 +64,6 @@ import javax.ws.rs.core.Response; import java.io.IOException; import java.io.InputStream; -import static fr.gouv.vitam.common.database.builder.query.QueryHelper.in; -import static fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper.unitType; - @RestController @RequestMapping(RestApi.ARCHIVE_SEARCH_PATH) @Getter @@ -83,9 +74,6 @@ public class ArchiveSearchInternalController { private static final VitamUILogger LOGGER = VitamUILoggerFactory.getInstance(ArchiveSearchInternalController.class); - private static final String[] FILING_PLAN_PROJECTION = - new String[] {"#id", "Title", "Title_", "DescriptionLevel", "#unitType", "#unitups", "#allunitups"}; - private final ArchiveSearchInternalService archiveInternalService; @@ -126,27 +114,10 @@ public class ArchiveSearchInternalController { ParameterChecker.checkParameter("The tenant Id, the accessContract Id are mandatory parameters: ", tenantId, accessContractId); final VitamContext vitamContext = securityService.buildVitamContext(tenantId, accessContractId); - final JsonNode holdingQuery = createQueryForHoldingUnit(); - return objectMapper.treeToValue(archiveInternalService.searchArchiveUnits(holdingQuery, vitamContext), + return objectMapper.treeToValue(archiveInternalService.getFillingHoldingScheme(vitamContext), VitamUISearchResponseDto.class); } - private JsonNode createQueryForHoldingUnit() { - try { - final SelectMultiQuery select = new SelectMultiQuery(); - final Query query = - in(unitType(), UnitTypeEnum.HOLDING_UNIT.getValue(), UnitTypeEnum.FILING_UNIT.getValue()); - select.addQueries(query); - select.addUsedProjection(FILING_PLAN_PROJECTION); - LOGGER.debug("query =", select.getFinalSelect().toPrettyString()); - return select.getFinalSelect(); - } catch (InvalidCreateOperationException | InvalidParseOperationException e) { - throw new UnexpectedDataException( - "Unexpected error occured while building holding dsl query : " + e.getMessage()); - } - - } - @GetMapping(RestApi.ARCHIVE_UNIT_INFO + CommonConstants.PATH_ID) public ResultsDto findUnitById(final @PathVariable("id") String id, @RequestHeader(value = CommonConstants.X_ACCESS_CONTRACT_ID_HEADER) final String accessContractId) diff --git a/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/service/ArchiveSearchInternalService.java b/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/service/ArchiveSearchInternalService.java index 729c899be..7809fa161 100644 --- a/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/service/ArchiveSearchInternalService.java +++ b/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/service/ArchiveSearchInternalService.java @@ -37,6 +37,7 @@ import fr.gouv.vitam.common.LocalDateUtil; import fr.gouv.vitam.common.client.VitamContext; import fr.gouv.vitam.common.database.builder.facet.FacetHelper; import fr.gouv.vitam.common.database.builder.query.BooleanQuery; +import fr.gouv.vitam.common.database.builder.query.Query; import fr.gouv.vitam.common.database.builder.request.configuration.BuilderToken; import fr.gouv.vitam.common.database.builder.request.exception.InvalidCreateOperationException; import fr.gouv.vitam.common.database.builder.request.multiple.SelectMultiQuery; @@ -46,9 +47,9 @@ import fr.gouv.vitam.common.exception.VitamClientException; import fr.gouv.vitam.common.json.JsonHandler; import fr.gouv.vitam.common.model.RequestResponse; import fr.gouv.vitam.common.model.dip.DataObjectVersions; +import fr.gouv.vitam.common.model.elimination.EliminationRequestBody; import fr.gouv.vitam.common.model.export.dip.DipExportType; import fr.gouv.vitam.common.model.export.dip.DipRequest; -import fr.gouv.vitam.common.model.elimination.EliminationRequestBody; import fr.gouv.vitamui.archives.search.common.common.ArchiveSearchConsts; import fr.gouv.vitamui.archives.search.common.dto.ArchiveUnit; import fr.gouv.vitamui.archives.search.common.dto.ArchiveUnitCsv; @@ -65,6 +66,7 @@ import fr.gouv.vitamui.commons.api.exception.BadRequestException; import fr.gouv.vitamui.commons.api.exception.InternalServerException; import fr.gouv.vitamui.commons.api.exception.PreconditionFailedException; import fr.gouv.vitamui.commons.api.exception.RequestEntityTooLargeException; +import fr.gouv.vitamui.commons.api.exception.UnexpectedDataException; import fr.gouv.vitamui.commons.api.logger.VitamUILogger; import fr.gouv.vitamui.commons.api.logger.VitamUILoggerFactory; import fr.gouv.vitamui.commons.vitam.api.access.EliminationService; @@ -72,6 +74,7 @@ import fr.gouv.vitamui.commons.vitam.api.access.ExportDipV2Service; import fr.gouv.vitamui.commons.vitam.api.access.UnitService; import fr.gouv.vitamui.commons.vitam.api.dto.ResultsDto; import fr.gouv.vitamui.commons.vitam.api.dto.VitamUISearchResponseDto; +import fr.gouv.vitamui.commons.vitam.api.model.UnitTypeEnum; import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -100,6 +103,8 @@ import java.util.Set; import java.util.stream.Collectors; import static fr.gouv.vitam.common.database.builder.query.QueryHelper.and; +import static fr.gouv.vitam.common.database.builder.query.QueryHelper.in; +import static fr.gouv.vitam.common.database.builder.query.VitamFieldsHelper.unitType; /** * Archive-Search Internal service communication with VITAM. @@ -121,8 +126,9 @@ public class ArchiveSearchInternalService { public static final String NEW_TAB = "\t"; public static final String NEW_LINE_1 = "\r\n"; public static final String OPERATION_IDENTIFIER = "itemId"; - public static final String SPACE = " "; + private static final String[] FILING_PLAN_PROJECTION = + new String[] {"#id", "Title", "Title_", "DescriptionLevel", "#unitType", "#unitups", "#allunitups"}; private final ObjectMapper objectMapper; private final UnitService unitService; @@ -247,6 +253,11 @@ public class ArchiveSearchInternalService { return response.toJsonNode(); } + public JsonNode getFillingHoldingScheme(VitamContext vitamContext) throws VitamClientException { + final JsonNode fillingHoldingQuery = createQueryForHoldingFillingUnit(); + return searchArchiveUnits(fillingHoldingQuery, vitamContext); + } + public ResultsDto findArchiveUnitById(String id, VitamContext vitamContext) throws VitamClientException { try { LOGGER.info("Archive Unit Id : {}", id); @@ -630,6 +641,26 @@ public class ArchiveSearchInternalService { return dipRequest; } + public JsonNode createQueryForHoldingFillingUnit() { + try { + final SelectMultiQuery select = new SelectMultiQuery(); + final Query query = + in(unitType(), UnitTypeEnum.HOLDING_UNIT.getValue(), UnitTypeEnum.FILING_UNIT.getValue()); + select.addQueries(query); + ObjectNode orderFilter = JsonHandler.createObjectNode(); + orderFilter.put("Title", 1); + ObjectNode filter = JsonHandler.createObjectNode(); + filter.set("$orderby", orderFilter); + select.setFilter(filter); + select.addUsedProjection(FILING_PLAN_PROJECTION); + LOGGER.debug("query =", select.getFinalSelect().toPrettyString()); + return select.getFinalSelect(); + } catch (InvalidCreateOperationException | InvalidParseOperationException e) { + throw new UnexpectedDataException( + "Unexpected error occured while building holding dsl query : " + e.getMessage()); + } + } + public JsonNode exportDIP( final VitamContext vitamContext, DipRequest dipRequest) throws VitamClientException { RequestResponse<JsonNode> response = exportDipV2Service.exportDip( vitamContext, dipRequest); diff --git a/api/api-archive-search/archive-search-internal/src/test/java/fr/gouv/vitamui/archive/internal/server/service/ArchiveSearchInternalServiceTest.java b/api/api-archive-search/archive-search-internal/src/test/java/fr/gouv/vitamui/archive/internal/server/service/ArchiveSearchInternalServiceTest.java index e3203460c..c7710b177 100644 --- a/api/api-archive-search/archive-search-internal/src/test/java/fr/gouv/vitamui/archive/internal/server/service/ArchiveSearchInternalServiceTest.java +++ b/api/api-archive-search/archive-search-internal/src/test/java/fr/gouv/vitamui/archive/internal/server/service/ArchiveSearchInternalServiceTest.java @@ -110,6 +110,7 @@ public class ArchiveSearchInternalServiceTest { public final String ELIMINATION_ANALYSIS_QUERY = "data/elimination/query.json"; public final String ELIMINATION_ANALYSIS_FINAL_QUERY = "data/elimination/expected_query.json"; public final String ELIMINATION_ANALYSIS_FINAL_RESPONSE = "data/elimination/elimination_analysis_response.json"; + public final String FILLING_HOLDING_SCHEME_EXPECTED_QUERY = "data/fillingholding/expected_query.json"; @BeforeEach public void setUp() { @@ -161,4 +162,19 @@ public class ArchiveSearchInternalServiceTest { Assertions.assertThat(eliminationRequestBody2.getDslRequest()).isEqualTo(resultExpected); Assertions.assertThat(resultExpected.get(BuilderToken.GLOBAL.THRESOLD.exactToken()).asDouble()).isEqualTo(10000); } + + + @Test + public void getFinalFillingHoldingSchemeQuery() throws Exception { + // Given + JsonNode expectedQuery = JsonHandler.getFromFile(PropertiesUtils.findFile(FILLING_HOLDING_SCHEME_EXPECTED_QUERY)); + + // When + JsonNode givenQuery = + archiveSearchInternalService.createQueryForHoldingFillingUnit(); + + // Then + Assertions.assertThat(expectedQuery.toString()).isEqualTo(String.valueOf(givenQuery)); + Assertions.assertThat(givenQuery.get(BuilderToken.GLOBAL.FILTER.exactToken()).get(BuilderToken.SELECTFILTER.ORDERBY.exactToken()).has("Title")).isTrue(); + } } diff --git a/api/api-archive-search/archive-search-internal/src/test/resources/data/fillingholding/expected_query.json b/api/api-archive-search/archive-search-internal/src/test/resources/data/fillingholding/expected_query.json new file mode 100644 index 000000000..c45566fb1 --- /dev/null +++ b/api/api-archive-search/archive-search-internal/src/test/resources/data/fillingholding/expected_query.json @@ -0,0 +1,31 @@ +{ + "$roots": [], + "$query": [ + { + "$in": { + "#unitType": [ + "HOLDING_UNIT", + "FILING_UNIT" + ] + } + } + ], + "$filter": { + "$limit": 10000, + "$orderby": { + "Title": 1 + } + }, + "$projection": { + "$fields": { + "#id": 1, + "Title": 1, + "Title_": 1, + "DescriptionLevel": 1, + "#unitType": 1, + "#unitups": 1, + "#allunitups": 1 + } + }, + "$facets": [] +} -- GitLab