Skip to content
Snippets Groups Projects
Commit 0c5620a2 authored by Philippe Tcherniatinsky's avatar Philippe Tcherniatinsky
Browse files

Merge branch...

Merge branch '45-could-not-commit-jdbc-transaction-nested-exception-is-org-postgresql-util-psqlexception-error' into 'master'

Resolve "Impossible de déposer des références une deuxième fois

Closes #45

See merge request anaee-dev/si-ore-v2!92
parents 2c5bc7d4 e16f107d
No related branches found
No related tags found
1 merge request!92Resolve "Impossible de déposer des références une deuxième fois
Pipeline #58810 passed
......@@ -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);
......
......@@ -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() {
......@@ -185,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"
......@@ -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.referencesBy = 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
}
......@@ -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);
......
......@@ -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;
}
......
......@@ -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);
......
......@@ -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) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment