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