From ebbd95aef66502da572120de472c75f4351b995a Mon Sep 17 00:00:00 2001
From: TCHERNIATINSKY <philippe.tcherniatinsky@inrae.fr>
Date: Mon, 16 May 2022 15:37:50 +0200
Subject: [PATCH 1/4] Modification
 ReferenceValueRepository::getReferenceIdPerKeys

Retourne aussi bien les clef hierarchiques que les clefs naturelles
---
 .../persistence/ReferenceValueRepository.java | 41 +++++++++++++++----
 1 file changed, 33 insertions(+), 8 deletions(-)

diff --git a/src/main/java/fr/inra/oresing/persistence/ReferenceValueRepository.java b/src/main/java/fr/inra/oresing/persistence/ReferenceValueRepository.java
index 29fb39b6b..9b3df793b 100644
--- a/src/main/java/fr/inra/oresing/persistence/ReferenceValueRepository.java
+++ b/src/main/java/fr/inra/oresing/persistence/ReferenceValueRepository.java
@@ -61,7 +61,24 @@ public class ReferenceValueRepository extends JsonTableInApplicationSchemaReposi
      * @return la liste qui satisfont aux criteres
      */
     public List<ReferenceValue> findAllByReferenceType(String refType, MultiValueMap<String, String> params) {
-        MultiValueMap<String, String> toto = new LinkedMultiValueMap<>();
+        int offset = Optional.of(params)
+                .map(m -> m.remove("_offset_"))
+                .filter(l -> l.size() > 0)
+                .map(l -> l.get(0))
+                .map(o -> {
+                    try {
+                        return Integer.valueOf(o);
+                    } catch (NumberFormatException e) {
+                        return 0;
+                    }
+                })
+                .orElse(0);
+        String limit = Optional.of(params)
+                .map(m -> m.remove("_limit_"))
+                .filter(l -> l.size() > 0)
+                .map(l -> l.get(0))
+                .filter(o -> o.matches("[0-9]*|ALL"))
+                .orElse("ALL");
         String query = "SELECT DISTINCT '" + ReferenceValue.class.getName() + "' as \"@class\",  to_jsonb(t) as json FROM "
                 + getTable().getSqlIdentifier() + " t, jsonb_each_text(t.refvalues) kv WHERE application=:applicationId::uuid AND referenceType=:refType";
         MapSqlParameterSource paramSource = new MapSqlParameterSource("applicationId", getApplication().getId())
@@ -95,6 +112,7 @@ public class ReferenceValueRepository extends JsonTableInApplicationSchemaReposi
         if (StringUtils.isNotBlank(cond)) {
             cond = " AND (" + cond + ")";
         }
+        cond = String.format("%s offset %d  limit %s", cond, offset, limit);
 
         List result = getNamedParameterJdbcTemplate().query(query + cond, paramSource, getJsonRowMapper());
         return (List<ReferenceValue>) result;
@@ -171,7 +189,14 @@ public class ReferenceValueRepository extends JsonTableInApplicationSchemaReposi
     }
 
     public ImmutableMap<Ltree, UUID> getReferenceIdPerKeys(String referenceType) {
-        return findAllByReferenceType(referenceType).stream().collect(ImmutableMap.toImmutableMap(ReferenceValue::getHierarchicalKey, ReferenceValue::getId));
+        final List<ReferenceValue> allByReferenceType = findAllByReferenceType(referenceType);
+        final ImmutableMap<Ltree, UUID> byHierarchicalKey = allByReferenceType.stream().collect(ImmutableMap.toImmutableMap(ReferenceValue::getNaturalKey, ReferenceValue::getId));
+        final ImmutableMap<Ltree, UUID> byNaturalKey = allByReferenceType.stream().collect(ImmutableMap.toImmutableMap(ReferenceValue::getHierarchicalKey, ReferenceValue::getId));
+        final ImmutableMap.Builder<Ltree, UUID> builder = ImmutableMap.builder();
+        return builder
+                .putAll(byHierarchicalKey)
+                .putAll(byNaturalKey.entrySet().stream().filter(e->!byHierarchicalKey.containsKey(e.getKey())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))
+                .build();
     }
 
     public List<ApplicationResult.ReferenceSynthesis> buildReferenceSynthesis() {
@@ -197,13 +222,13 @@ public class ReferenceValueRepository extends JsonTableInApplicationSchemaReposi
     }
 
     public Map<Ltree, List<ReferenceValue>> getReferenceDisplaysById(Set<String> listOfIds) {
-        if(listOfIds.isEmpty()){
+        if (listOfIds.isEmpty()) {
             return new HashMap<>();
         }
-       String sql =  "SELECT  DISTINCT '" + ReferenceValue.class.getName() + "' as \"@class\",  to_jsonb(r) as json \n" +
-                "from "+getSchema().getSqlIdentifier()+".data_reference dr\n" +
-                "join "+getSchema().getSqlIdentifier()+".\"data\" d on dr.dataid = d.id\n" +
-                "join "+getTable().getSqlIdentifier()+" r on dr.referencedby = r.id\n"+
+        String sql = "SELECT  DISTINCT '" + ReferenceValue.class.getName() + "' as \"@class\",  to_jsonb(r) as json \n" +
+                "from " + getSchema().getSqlIdentifier() + ".data_reference dr\n" +
+                "join " + getSchema().getSqlIdentifier() + ".\"data\" d on dr.dataid = d.id\n" +
+                "join " + getTable().getSqlIdentifier() + " r on dr.referencedby = r.id\n" +
                 "where d.rowid in (:list)";
         final List<ReferenceValue> list = getNamedParameterJdbcTemplate()
                 .query(sql, new MapSqlParameterSource().addValue("list", listOfIds), getJsonRowMapper());
@@ -220,4 +245,4 @@ public class ReferenceValueRepository extends JsonTableInApplicationSchemaReposi
         );
         return referencesValuesMap;
     }
-}
\ No newline at end of file
+}
-- 
GitLab


From 8aa38a9234ff3ff419063cfa8a155616d3be49ae Mon Sep 17 00:00:00 2001
From: TCHERNIATINSKY <philippe.tcherniatinsky@inrae.fr>
Date: Mon, 16 May 2022 15:38:50 +0200
Subject: [PATCH 2/4] =?UTF-8?q?Ajout=20d'un=20test=20ou=20l'on=20rajoute?=
 =?UTF-8?q?=20des=20taxons=20dont=20certains=20sont=20d=C3=A9j=C3=A0=20dan?=
 =?UTF-8?q?s=20la=20base.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/test/java/fr/inra/oresing/rest/Fixtures.java  |  8 +++++++-
 .../fr/inra/oresing/rest/OreSiResourcesTest.java  | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/test/java/fr/inra/oresing/rest/Fixtures.java b/src/test/java/fr/inra/oresing/rest/Fixtures.java
index b2dfa7a65..86f7865fc 100644
--- a/src/test/java/fr/inra/oresing/rest/Fixtures.java
+++ b/src/test/java/fr/inra/oresing/rest/Fixtures.java
@@ -184,7 +184,13 @@ public class Fixtures {
     public Map<String, String> getRecursiviteReferentielOrderFiles() {
         Map<String, String> referentielFiles = new LinkedHashMap<>();
         referentielFiles.put("proprietes_taxon", "/data/recursivite/proprietes_des_taxons.csv");
-        referentielFiles.put("taxon", "/data/recursivite/taxons_du_phytoplancton_reduit-test.csv");
+        referentielFiles.put("taxon", "/data/recursivite/taxons_du_phytoplancton-reduit.csv");
+        return referentielFiles;
+    }
+
+    public Map<String, String> getRecursiviteReferentielTaxon() {
+        Map<String, String> referentielFiles = new LinkedHashMap<>();
+        referentielFiles.put("taxon", "/data/recursivite/taxons_du_phytoplancton.csv");
         return referentielFiles;
     }
 
diff --git a/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java b/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java
index a52761084..e0c99a49e 100644
--- a/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java
+++ b/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java
@@ -889,6 +889,21 @@ public class OreSiResourcesTest {
                 JsonPath.parse(response).read("$.id");
             }
         }
+        // Ajout de taxon
+        for (Map.Entry<String, String> e : fixtures.getRecursiviteReferentielTaxon().entrySet()) {
+            try (InputStream refStream = getClass().getResourceAsStream(e.getValue())) {
+                MockMultipartFile refFile = new MockMultipartFile("file", e.getValue(), "text/plain", refStream);
+
+                response = mockMvc.perform(MockMvcRequestBuilders.multipart("/api/v1/applications/recursivite/references/{refType}", e.getKey())
+                                .file(refFile)
+                                .cookie(authCookie))
+                        .andExpect(status().isCreated())
+                        .andExpect(jsonPath("$.id", IsNull.notNullValue()))
+                        .andReturn().getResponse().getContentAsString();
+
+                JsonPath.parse(response).read("$.id");
+            }
+        }
         for (Map.Entry<String, String> e : fixtures.getRecursiviteReferentielFiles().entrySet()) {
             try (InputStream refStream = getClass().getResourceAsStream(e.getValue())) {
                 MockMultipartFile refFile = new MockMultipartFile("file", e.getValue(), "text/plain", refStream);
-- 
GitLab


From 2e8f8bd1c18bcbff92936df7eabdbe60564544ff Mon Sep 17 00:00:00 2001
From: TCHERNIATINSKY <philippe.tcherniatinsky@inrae.fr>
Date: Mon, 16 May 2022 15:46:58 +0200
Subject: [PATCH 3/4] =?UTF-8?q?Modification=20du=20nom=20du=20champs=20auq?=
 =?UTF-8?q?uel=20on=20r=C3=A9f=C3=A8re?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/fr/inra/oresing/persistence/DataRepository.java  | 8 ++++----
 .../oresing/persistence/ReferenceValueRepository.java     | 6 +++---
 .../resources/migration/application/V1__init_schema.sql   | 8 ++++----
 3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/main/java/fr/inra/oresing/persistence/DataRepository.java b/src/main/java/fr/inra/oresing/persistence/DataRepository.java
index 9a07d5f21..fefc27784 100644
--- a/src/main/java/fr/inra/oresing/persistence/DataRepository.java
+++ b/src/main/java/fr/inra/oresing/persistence/DataRepository.java
@@ -98,13 +98,13 @@ public class DataRepository extends JsonTableInApplicationSchemaRepositoryTempla
     public void updateConstraintForeignData(List<UUID> uuids) {
         String deleteSql = "DELETE FROM " + getTable().getSchema().getSqlIdentifier() + ".Data_Reference WHERE dataId in (:ids)";
         String insertSql = String.join(" "
-                , "INSERT INTO " + getTable().getSchema().getSqlIdentifier() + ".Data_Reference(dataId, referencedBy)"
+                , "INSERT INTO " + getTable().getSchema().getSqlIdentifier() + ".Data_Reference(dataId, referencesBy)"
                 , "with tuple as ("
-                , "  select id dataId,((jsonb_each_text( (jsonb_each(refsLinkedTo)).value)).value)::uuid referencedBy"
+                , "  select id dataId,((jsonb_each_text( (jsonb_each(refsLinkedTo)).value)).value)::uuid referencesBy"
                 , "  from " + getTable().getSqlIdentifier() + ""
                 , ")"
-                , "select dataId, referencedBy from tuple"
-                , "where dataId in (:ids) and referencedBy is not null"
+                , "select dataId, referencesBy from tuple"
+                , "where dataId in (:ids) and referencesBy is not null"
                 , "ON CONFLICT ON CONSTRAINT \"Data_Reference_PK\" DO NOTHING"
         );
         String sql = String.join(";", deleteSql, insertSql);
diff --git a/src/main/java/fr/inra/oresing/persistence/ReferenceValueRepository.java b/src/main/java/fr/inra/oresing/persistence/ReferenceValueRepository.java
index 9b3df793b..34884b8a5 100644
--- a/src/main/java/fr/inra/oresing/persistence/ReferenceValueRepository.java
+++ b/src/main/java/fr/inra/oresing/persistence/ReferenceValueRepository.java
@@ -210,8 +210,8 @@ public class ReferenceValueRepository extends JsonTableInApplicationSchemaReposi
     public void updateConstraintForeignReferences(List<UUID> uuids) {
         String deleteSql = "DELETE FROM " + getTable().getSchema().getSqlIdentifier() + ".Reference_Reference WHERE referenceId in (:ids)";
         String insertSql = String.join(" "
-                , "INSERT INTO " + getTable().getSchema().getSqlIdentifier() + ".Reference_Reference(referenceId, referencedBy)"
-                , "select id referenceId, (jsonb_array_elements_text((jsonb_each(refsLinkedTo)).value))::uuid referencedBy"
+                , "INSERT INTO " + getTable().getSchema().getSqlIdentifier() + ".Reference_Reference(referenceId, referencesBy)"
+                , "select id referenceId, (jsonb_array_elements_text((jsonb_each(refsLinkedTo)).value))::uuid referencesBy"
                 , "from " + getTable().getSqlIdentifier()
                 , "where id in (:ids)"
                 , "ON CONFLICT ON CONSTRAINT \"Reference_Reference_PK\" DO NOTHING"
@@ -228,7 +228,7 @@ public class ReferenceValueRepository extends JsonTableInApplicationSchemaReposi
         String sql = "SELECT  DISTINCT '" + ReferenceValue.class.getName() + "' as \"@class\",  to_jsonb(r) as json \n" +
                 "from " + getSchema().getSqlIdentifier() + ".data_reference dr\n" +
                 "join " + getSchema().getSqlIdentifier() + ".\"data\" d on dr.dataid = d.id\n" +
-                "join " + getTable().getSqlIdentifier() + " r on dr.referencedby = r.id\n" +
+                "join " + getTable().getSqlIdentifier() + " r on dr.referencesBy = r.id\n" +
                 "where d.rowid in (:list)";
         final List<ReferenceValue> list = getNamedParameterJdbcTemplate()
                 .query(sql, new MapSqlParameterSource().addValue("list", listOfIds), getJsonRowMapper());
diff --git a/src/main/resources/migration/application/V1__init_schema.sql b/src/main/resources/migration/application/V1__init_schema.sql
index 78090edcc..f3e5211f5 100644
--- a/src/main/resources/migration/application/V1__init_schema.sql
+++ b/src/main/resources/migration/application/V1__init_schema.sql
@@ -31,8 +31,8 @@ create table ReferenceValue
 create table Reference_Reference
 (
     referenceId entityid REFERENCES ReferenceValue(id) ON DELETE CASCADE,
-    referencedBy entityid REFERENCES ReferenceValue(id) ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED,
-    CONSTRAINT "Reference_Reference_PK" PRIMARY KEY (referenceId, referencedBy)
+    referencesBy entityid REFERENCES ReferenceValue(id) ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED,
+    CONSTRAINT "Reference_Reference_PK" PRIMARY KEY (referenceId, referencesBy)
 );
 
 CREATE INDEX ref_refslinkedto_index ON ReferenceValue USING gin (refsLinkedTo);
@@ -100,8 +100,8 @@ create table Data
 create table Data_Reference
 (
     dataId entityid REFERENCES Data(id) ON DELETE CASCADE,
-    referencedBy entityid REFERENCES ReferenceValue(id) ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED,
-    CONSTRAINT "Data_Reference_PK" PRIMARY KEY (dataId, referencedBy)
+    referencesBy entityid REFERENCES ReferenceValue(id) ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED,
+    CONSTRAINT "Data_Reference_PK" PRIMARY KEY (dataId, referencesBy)
 );
 
 CREATE INDEX data_refslinkedto_index ON Data USING gin (refsLinkedTo jsonb_path_ops);
-- 
GitLab


From e16f107d2923a6160e0708f3f433699a45e08523 Mon Sep 17 00:00:00 2001
From: TCHERNIATINSKY <philippe.tcherniatinsky@inrae.fr>
Date: Mon, 16 May 2022 16:34:07 +0200
Subject: [PATCH 4/4] Correction du nombre de ligne en jointure

---
 src/test/java/fr/inra/oresing/rest/RelationalServiceTest.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/test/java/fr/inra/oresing/rest/RelationalServiceTest.java b/src/test/java/fr/inra/oresing/rest/RelationalServiceTest.java
index c050b8296..cfaaae161 100644
--- a/src/test/java/fr/inra/oresing/rest/RelationalServiceTest.java
+++ b/src/test/java/fr/inra/oresing/rest/RelationalServiceTest.java
@@ -118,7 +118,7 @@ public class RelationalServiceTest {
                     , "where value != ''"
             );
             int numberOfRowInAssociationView = namedParameterJdbcTemplate.queryForObject(sql, Collections.emptyMap(), Integer.class);
-            Assert.assertEquals(384, numberOfRowInAssociationView);
+            Assert.assertEquals(424, numberOfRowInAssociationView);
         }
 
         for (Fixtures.Application application : applications) {
-- 
GitLab