From f8a6c0cfb56a1955b16b5a1e9878f95020c085cc Mon Sep 17 00:00:00 2001 From: oussamasic <oussamazerouali42@gmail.com> Date: Thu, 16 Sep 2021 11:39:14 +0200 Subject: [PATCH] correct search bug with title and description --- .../common/common/ArchiveSearchConsts.java | 14 +++-- ...chivesSearchFieldsQueryBuilderService.java | 49 +++++++++++++++- .../commons/vitam/api/dto/DescriptionDto.java | 58 +++++++++++++++++++ .../commons/vitam/api/dto/ResultsDto.java | 3 + .../archive-preview.component.html | 20 +++++-- .../archive-preview.component.spec.ts | 14 ++--- .../archive-search.component.html | 18 +++--- .../src/app/archive/models/unit.interface.ts | 6 +- 8 files changed, 153 insertions(+), 29 deletions(-) create mode 100644 commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/dto/DescriptionDto.java diff --git a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/common/ArchiveSearchConsts.java b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/common/ArchiveSearchConsts.java index d8639e7e6..554485287 100644 --- a/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/common/ArchiveSearchConsts.java +++ b/api/api-archive-search/archive-search-commons/src/main/java/fr/gouv/vitamui/archives/search/common/common/ArchiveSearchConsts.java @@ -143,8 +143,6 @@ public class ArchiveSearchConsts { public static Map<String, String> SIMPLE_FIELDS_VALUES_MAPPING = Map.of("GUID", "#id", "GUID_OPI", "#opi", ORIGINATING_AGENCY_ID_FIELD, "#originating_agency", - "TITLE", "Title", - "DESCRIPTION", "Description", "START_DATE", "StartDate", "END_DATE", "EndDate", "SP_LABEL", "originating_agency_label" @@ -159,8 +157,6 @@ public class ArchiveSearchConsts { /* Query fields */ public static final String IDENTIFIER = "Identifier"; public static final String UNIT_TYPE = "#unitType"; - public static final String TITLE = "Title"; - public static final String DESCRIPTION = "Description"; public static final String START_DATE = "StartDate"; public static final String PRODUCER_SERVICE = "#originating_agency"; public static final String GUID = "#id"; @@ -176,6 +172,16 @@ public class ArchiveSearchConsts { public static final String SHORT_NAME = "ShortName"; public static final String PUID = "PUID"; + /* Title and Description Query fields */ + public static final String TITLE = "Title"; + public static final String TITLE_FR = "Title_.fr"; + public static final String TITLE_EN = "Title_.en"; + public static final String DESCRIPTION = "Description"; + public static final String DESCRIPTION_FR = "Description_.fr"; + public static final String DESCRIPTION_EN = "Description_.en"; + public static final String TITLE_CRITERIA = "TITLE"; + public static final String DESCRIPTION_CRITERIA = "DESCRIPTION"; + } diff --git a/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/service/ArchivesSearchFieldsQueryBuilderService.java b/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/service/ArchivesSearchFieldsQueryBuilderService.java index 19c23fd7b..ed35adec1 100644 --- a/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/service/ArchivesSearchFieldsQueryBuilderService.java +++ b/api/api-archive-search/archive-search-internal/src/main/java/fr/gouv/vitamui/archive/internal/server/service/ArchivesSearchFieldsQueryBuilderService.java @@ -74,6 +74,16 @@ public class ArchivesSearchFieldsQueryBuilderService implements IArchivesSearchA searchCriteria.getValues().stream().map(value -> value.getValue()).collect( Collectors.toList()), ArchiveSearchConsts.CriteriaOperators.valueOf(searchCriteria.getOperator()))); + } else if (ArchiveSearchConsts.TITLE_CRITERIA.equals(searchCriteria.getCriteria())) { + queryToFill.add(buildTitleQuery( + searchCriteria.getValues().stream().map(value -> value.getValue()).collect( + Collectors.toList()), + ArchiveSearchConsts.CriteriaOperators.valueOf(searchCriteria.getOperator()))); + } else if (ArchiveSearchConsts.DESCRIPTION_CRITERIA.equals(searchCriteria.getCriteria())) { + queryToFill.add(buildDescriptionQuery( + searchCriteria.getValues().stream().map(value -> value.getValue()).collect( + Collectors.toList()), + ArchiveSearchConsts.CriteriaOperators.valueOf(searchCriteria.getOperator()))); } else { String mappedCriteriaName = ArchiveSearchConsts.SIMPLE_FIELDS_VALUES_MAPPING.containsKey(searchCriteria.getCriteria()) ? @@ -90,6 +100,25 @@ public class ArchivesSearchFieldsQueryBuilderService implements IArchivesSearchA } private Query buildTitleAndDescriptionQuery(final List<String> searchValues, + ArchiveSearchConsts.CriteriaOperators operator) + throws InvalidCreateOperationException { + BooleanQuery subQueryAnd = and(); + if (!CollectionUtils.isEmpty(searchValues)) { + for (String value : searchValues) { + BooleanQuery subQueryOr = or(); + subQueryOr.add(VitamQueryHelper.buildSubQueryByOperator(ArchiveSearchConsts.TITLE_FR, value, operator)); + subQueryOr.add(VitamQueryHelper.buildSubQueryByOperator(ArchiveSearchConsts.TITLE, value, operator)); + subQueryOr.add(VitamQueryHelper.buildSubQueryByOperator(ArchiveSearchConsts.TITLE_EN, value, operator)); + subQueryOr.add(VitamQueryHelper.buildSubQueryByOperator(ArchiveSearchConsts.DESCRIPTION, value, operator)); + subQueryOr.add(VitamQueryHelper.buildSubQueryByOperator(ArchiveSearchConsts.DESCRIPTION_EN, value, operator)); + subQueryOr.add(VitamQueryHelper.buildSubQueryByOperator(ArchiveSearchConsts.DESCRIPTION_FR, value, operator)); + subQueryAnd.add(subQueryOr); + } + } + return subQueryAnd; + } + + private Query buildTitleQuery(final List<String> searchValues, ArchiveSearchConsts.CriteriaOperators operator) throws InvalidCreateOperationException { BooleanQuery subQueryAnd = and(); @@ -97,8 +126,26 @@ public class ArchivesSearchFieldsQueryBuilderService implements IArchivesSearchA for (String value : searchValues) { BooleanQuery subQueryOr = or(); subQueryOr - .add(VitamQueryHelper.buildSubQueryByOperator(ArchiveSearchConsts.DESCRIPTION, value, operator)); + .add(VitamQueryHelper.buildSubQueryByOperator(ArchiveSearchConsts.TITLE_FR, value, operator)); subQueryOr.add(VitamQueryHelper.buildSubQueryByOperator(ArchiveSearchConsts.TITLE, value, operator)); + subQueryOr.add(VitamQueryHelper.buildSubQueryByOperator(ArchiveSearchConsts.TITLE_EN, value, operator)); + subQueryAnd.add(subQueryOr); + } + } + return subQueryAnd; + } + + private Query buildDescriptionQuery(final List<String> searchValues, + ArchiveSearchConsts.CriteriaOperators operator) + throws InvalidCreateOperationException { + BooleanQuery subQueryAnd = and(); + if (!CollectionUtils.isEmpty(searchValues)) { + for (String value : searchValues) { + BooleanQuery subQueryOr = or(); + subQueryOr + .add(VitamQueryHelper.buildSubQueryByOperator(ArchiveSearchConsts.DESCRIPTION, value, operator)); + subQueryOr.add(VitamQueryHelper.buildSubQueryByOperator(ArchiveSearchConsts.DESCRIPTION_EN, value, operator)); + subQueryOr.add(VitamQueryHelper.buildSubQueryByOperator(ArchiveSearchConsts.DESCRIPTION_FR, value, operator)); subQueryAnd.add(subQueryOr); } } diff --git a/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/dto/DescriptionDto.java b/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/dto/DescriptionDto.java new file mode 100644 index 000000000..f5900e875 --- /dev/null +++ b/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/dto/DescriptionDto.java @@ -0,0 +1,58 @@ +/* + * * + * * Copyright French Prime minister Office/SGMAP/DINSIC/Vitam Program (2019-2020) + * * and the signatories of the "VITAM - Accord du Contributeur" agreement. + * * + * * contact@programmevitam.fr + * * + * * This software is a computer program whose purpose is to implement + * * implement a digital archiving front-office system for the secure and + * * efficient high volumetry VITAM solution. + * * + * * This software is governed by the CeCILL-C license under French law and + * * abiding by the rules of distribution of free software. You can use, + * * modify and/ or redistribute the software under the terms of the CeCILL-C + * * license as circulated by CEA, CNRS and INRIA at the following URL + * * "http://www.cecill.info". + * * + * * As a counterpart to the access to the source code and rights to copy, + * * modify and redistribute granted by the license, users are provided only + * * with a limited warranty and the software's author, the holder of the + * * economic rights, and the successive licensors have only limited + * * liability. + * * + * * In this respect, the user's attention is drawn to the risks associated + * * with loading, using, modifying and/or developing or reproducing the + * * software by the user in light of its specific status of free software, + * * that may mean that it is complicated to manipulate, and that also + * * therefore means that it is reserved for developers and experienced + * * professionals having in-depth computer knowledge. Users are therefore + * * encouraged to load and test the software's suitability as regards their + * * requirements in conditions enabling the security of their systems and/or + * * data to be ensured and, more generally, to use and operate it in the + * * same conditions as regards security. + * * + * * The fact that you are presently reading this means that you have had + * * knowledge of the CeCILL-C license and that you accept its terms. + * + */ + +package fr.gouv.vitamui.commons.vitam.api.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class DescriptionDto { + + + @JsonProperty("fr") + private String fr; + + @JsonProperty("en") + private String en; +} diff --git a/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/dto/ResultsDto.java b/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/dto/ResultsDto.java index 820ba3ca6..807528e5a 100644 --- a/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/dto/ResultsDto.java +++ b/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/dto/ResultsDto.java @@ -73,6 +73,9 @@ public class ResultsDto { @JsonProperty("Description") private String description; + @JsonProperty("Description_") + private DescriptionDto description_; + @JsonProperty("OriginatingAgencyArchiveUnitIdentifier") private List<String> originatingAgencyArchiveUnitIdentifier = new ArrayList<>(); diff --git a/ui/ui-frontend/projects/archive-search/src/app/archive/archive-preview/archive-preview.component.html b/ui/ui-frontend/projects/archive-search/src/app/archive/archive-preview/archive-preview.component.html index db1dc0e70..3b2a0f4f6 100644 --- a/ui/ui-frontend/projects/archive-search/src/app/archive/archive-preview/archive-preview.component.html +++ b/ui/ui-frontend/projects/archive-search/src/app/archive/archive-preview/archive-preview.component.html @@ -57,9 +57,19 @@ <div class="read-only-field text-justify"> <label>{{ 'ARCHIVE_SEARCH.ARCHIVE_UNIT_PREVIEW.FIELDS.DESCRIPTION' | translate }} :</label> <div> - <p class="text-justify"> - {{ archiveUnit.Description }} - </p> + <ng-container *ngIf="archiveUnit?.Description; else descriptionFr"> + {{ archiveUnit?.Description }} + </ng-container> + <ng-template #descriptionFr> + <ng-container *ngIf="archiveUnit.Description_.fr; else descriptionEn"> + {{ archiveUnit.Description_.fr }} + </ng-container> + </ng-template> + <ng-template #descriptionEn> + <ng-container *ngIf="archiveUnit.Description_.en"> + {{ archiveUnit.Description_.en }} + </ng-container> + </ng-template> </div> </div> </div> @@ -102,9 +112,9 @@ </div> <div class="col-6"> <div class="read-only-field"> - <label>{{'ARCHIVE_SEARCH.ARCHIVE_UNIT_PREVIEW.FIELDS.DESCRIPTION_LEVEL' | translate}} :</label> + <label>{{ 'ARCHIVE_SEARCH.ARCHIVE_UNIT_PREVIEW.FIELDS.DESCRIPTION_LEVEL' | translate }} :</label> <div> - {{archiveUnit.DescriptionLevel}} + {{ archiveUnit.DescriptionLevel }} </div> </div> </div> diff --git a/ui/ui-frontend/projects/archive-search/src/app/archive/archive-preview/archive-preview.component.spec.ts b/ui/ui-frontend/projects/archive-search/src/app/archive/archive-preview/archive-preview.component.spec.ts index 88b26531a..c1313222a 100644 --- a/ui/ui-frontend/projects/archive-search/src/app/archive/archive-preview/archive-preview.component.spec.ts +++ b/ui/ui-frontend/projects/archive-search/src/app/archive/archive-preview/archive-preview.component.spec.ts @@ -36,26 +36,21 @@ */ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - import { MatIconModule } from '@angular/material/icon'; import { MatMenuModule } from '@angular/material/menu'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSidenavModule } from '@angular/material/sidenav'; import { MatTreeModule } from '@angular/material/tree'; - import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { ActivatedRoute } from '@angular/router'; - import { RouterTestingModule } from '@angular/router/testing'; -import { environment } from '../../../environments/environment.prod'; +import { TranslateModule } from '@ngx-translate/core'; import { of } from 'rxjs'; - import { BASE_URL, ENVIRONMENT, InjectorModule, LoggerModule, StartupService, WINDOW_LOCATION } from 'ui-frontend-common'; +import { environment } from '../../../environments/environment.prod'; +import { ArchiveService } from '../archive.service'; import { Unit } from '../models/unit.interface'; - import { ArchivePreviewComponent } from './archive-preview.component'; -import { TranslateModule } from '@ngx-translate/core'; -import { ArchiveService } from '../archive.service'; describe('ArchivePreviewComponent', () => { let component: ArchivePreviewComponent; @@ -103,7 +98,7 @@ describe('ArchivePreviewComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(ArchivePreviewComponent); component = fixture.componentInstance; - let archiveUnit: Unit = { + const archiveUnit: Unit = { '#allunitups': [], '#id': 'id', '#object': '', @@ -111,6 +106,7 @@ describe('ArchivePreviewComponent', () => { '#unitups': [], '#opi': '', Title_: { fr: 'Teste', en: 'Test' }, + Description_: { fr: 'DescriptionFr', en: 'DescriptionEn' }, }; component.archiveUnit = archiveUnit; fixture.detectChanges(); diff --git a/ui/ui-frontend/projects/archive-search/src/app/archive/archive-search/archive-search.component.html b/ui/ui-frontend/projects/archive-search/src/app/archive/archive-search/archive-search.component.html index 05f1525a1..38482192e 100644 --- a/ui/ui-frontend/projects/archive-search/src/app/archive/archive-search/archive-search.component.html +++ b/ui/ui-frontend/projects/archive-search/src/app/archive/archive-search/archive-search.component.html @@ -180,9 +180,13 @@ > {{ 'ARCHIVE_SEARCH.DIP.EXPORT_DIP' | translate }} </button> - <button mat-menu-item (click)="startEliminationAnalysis()" [disabled]="!hasEliminationAnalysisRole || (hasEliminationAnalysisRole && itemSelected == 0)"> - {{ 'ARCHIVE_SEARCH.ELIMINATION.ANALYSIS' | translate }} - </button> + <button + mat-menu-item + (click)="startEliminationAnalysis()" + [disabled]="!hasEliminationAnalysisRole || (hasEliminationAnalysisRole && itemSelected == 0)" + > + {{ 'ARCHIVE_SEARCH.ELIMINATION.ANALYSIS' | translate }} + </button> </vitamui-common-menu-button> </div> </div> @@ -382,17 +386,17 @@ </ng-container> <ng-template #subTitleFr> <ng-container *ngIf="archiveUnit.Title_.fr; else subTitleEn"> - <p matTooltip="{{ archiveUnit?.Description }}" matTooltipClass="vitamui-tooltip" [matTooltipShowDelay]="300"> + <p matTooltip="{{ archiveUnit?.Description_.fr }}" matTooltipClass="vitamui-tooltip" [matTooltipShowDelay]="300"> <b>{{ archiveUnit.Title_.fr }} </b> <br /> - {{ archiveUnit?.Description | truncate: 100 }} + {{ archiveUnit?.Description_.fr | truncate: 100 }} </p> </ng-container> </ng-template> <ng-template #subTitleEn> <ng-container *ngIf="archiveUnit.Title_.en"> - <p matTooltip="{{ archiveUnit?.Description }}" matTooltipClass="vitamui-tooltip" [matTooltipShowDelay]="300"> + <p matTooltip="{{ archiveUnit?.Description_.en }}" matTooltipClass="vitamui-tooltip" [matTooltipShowDelay]="300"> <b>{{ archiveUnit.Title_.en }} </b> <br /> - {{ archiveUnit?.Description | truncate: 100 }} + {{ archiveUnit?.Description_.en | truncate: 100 }} </p> </ng-container> </ng-template> diff --git a/ui/ui-frontend/projects/archive-search/src/app/archive/models/unit.interface.ts b/ui/ui-frontend/projects/archive-search/src/app/archive/models/unit.interface.ts index 1247a8228..a37ca8d78 100644 --- a/ui/ui-frontend/projects/archive-search/src/app/archive/models/unit.interface.ts +++ b/ui/ui-frontend/projects/archive-search/src/app/archive/models/unit.interface.ts @@ -10,6 +10,7 @@ export interface Unit { Title?: string; Title_?: any; Description?: string; + Description_?: any; DescriptionLevel?: string; CreatedDate?: Date; StartDate?: Date; @@ -23,8 +24,8 @@ export interface Unit { DuaEndDate?: Date; OriginatingAgencyArchiveUnitIdentifier?: string; Status?: string; - Vtag?: Array<{ Key: string[], Value: string[] }>; - Keyword?: Array<{ KeywordReference: string, KeywordContent: string }>; + Vtag?: Array<{ Key: string[]; Value: string[] }>; + Keyword?: Array<{ KeywordReference: string; KeywordContent: string }>; Type?: string; PhysicalAgency?: string[]; PhysicalStatus?: string[]; @@ -35,5 +36,4 @@ export interface Unit { isPhysical?: boolean; [key: string]: any; - } -- GitLab