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