Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion impl/src/main/java/fr/insee/rmes/metadata/Metadata.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.time.Instant;

@SpringBootApplication
public class Metadata {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import fr.insee.rmes.metadata.api.requestprocessor.RequestProcessor;
import fr.insee.rmes.metadata.model.AireDAttractionDesVilles2020;
import fr.insee.rmes.metadata.model.Pays;
import fr.insee.rmes.metadata.model.TerritoireTousAttributs;
import fr.insee.rmes.metadata.model.TypeEnumDescendantsAireDAttractionDesVilles;
import fr.insee.rmes.metadata.queries.parameters.AscendantsDescendantsRequestParametizer;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package fr.insee.rmes.metadata.api;

import fr.insee.rmes.metadata.queries.parameters.AscendantsDescendantsRequestParametizer;
import fr.insee.rmes.metadata.queries.parameters.PrecedentsSuivantsRequestParametizer;
import fr.insee.rmes.metadata.queries.parameters.ProjetesRequestParametizer;
import fr.insee.rmes.metadata.queries.parameters.TerritoireRequestParametizer;
import fr.insee.rmes.metadata.api.requestprocessor.RequestProcessor;
import fr.insee.rmes.metadata.model.*;
import fr.insee.rmes.metadata.queries.parameters.*;
Expand Down
57 changes: 31 additions & 26 deletions impl/src/main/java/fr/insee/rmes/metadata/api/GeoIrisEndpoints.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import fr.insee.rmes.metadata.model.Commune;
import fr.insee.rmes.metadata.model.Iris;
import fr.insee.rmes.metadata.model.TerritoireTousAttributs;
import fr.insee.rmes.metadata.queries.parameters.IrisListRequestParametizer;
import fr.insee.rmes.metadata.queries.parameters.TerritoireRequestParametizer;
import fr.insee.rmes.metadata.utils.EndpointsUtils;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;

Expand All @@ -24,39 +24,44 @@ public GeoIrisEndpoints(RequestProcessor requestProcessor) {

@Override
public ResponseEntity<Iris> getcogiris(String code, LocalDate date) {
//cf carte https://github.com/orgs/InseeFr/projects/9/views/5?filterQuery=-application%3AColectica+-scope%3Atechnique+iris&pane=issue&itemId=49451501&issue=InseeFr%7CMetadata-API%7C103
String code_commune=code.substring(0, 5);
// RequestProcessor.ListResult<String> types = requestProcessor.queryforFindIrisDescendantsCommune()
// .with(new TerritoireRequestParametizer(code_commune, Commune.class))
// .executeQuery().listResult(String.class);

// Exécuter la requête et obtenir le résultat
RequestProcessor.ListeResultatsIris<String> types = requestProcessor.queryforFindIrisDescendantsCommune()
.with(new TerritoireRequestParametizer(code_commune, Commune.class))
.executeQuery()
.listeResultatsIris(String.class);
//plante à la méthode unmarshallAll'

// Obtenir la liste des résultats
List<String> typeList = types.getList();

//condition à mettre : si l'un des types de la liste finit par "#Iris\r\n", cf https://github.com/InseeFr/Metadata-API/blob/main/src/main/java/fr/insee/rmes/utils/IrisUtils.java#L8
boolean containsIris = typeList.contains("http://rdf.insee.fr/def/geo#Iris");
String codeCommune = code.substring(0, 5);
boolean comHasIrisDescendant = requestProcessor.queryToFindIrisDescendantsCommune()
.with(new TerritoireRequestParametizer(codeCommune, date))
.executeAskQuery();

if (comHasIrisDescendant){

//bloc de fin pour que ça compile mais à revoir
return requestProcessor.queryforFindIris()
.with(new TerritoireRequestParametizer(code, date, Iris.class, "none"))
.executeQuery()
.singleResult(Iris.class)
.toResponseEntity();
if (!code.endsWith("0000")) {
Iris iris = requestProcessor.queryToFindIrisAndFauxIris()
.with(new TerritoireRequestParametizer(code, date))
.executeQuery()
.singleResult(Iris.class).result();
return EndpointsUtils.toResponseEntity(iris);
} else {
return ResponseEntity.notFound().build();
}
}
else { //it is a false-Iris
if (!code.endsWith("0000")) {
return ResponseEntity.notFound().build();
}
else {//return the COMMUNE
Iris iris = requestProcessor.queryforFindTerritoire()
.with(new TerritoireRequestParametizer(codeCommune, date, Commune.class, "none"))
.executeQuery()
.singleResult(Iris.class).result();
iris.setCode(code); //modify code property to have in output the Iris code and not the commune code
return EndpointsUtils.toResponseEntity(iris);
}
}
}


@Override
public ResponseEntity<List<TerritoireTousAttributs>> getcogirislist (LocalDate date, Boolean com) {
boolean finalcom = (com != null) && com;
return requestProcessor.queryToFindIrisList()
.with(new IrisListRequestParametizer(date, finalcom))
.with(new TerritoireRequestParametizer(date, finalcom))
.executeQuery()
.listResult(TerritoireTousAttributs.class)
.toResponseEntity();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ public RequestProcessor.QueryBuilder queryforFindTerritoire() {
return new RequestProcessor.QueryBuilder(TERRITOIRE, this);
}

public RequestProcessor.QueryBuilder queryforFindIris() {
return new RequestProcessor.QueryBuilder(IRIS, this);
public RequestProcessor.QueryBuilder queryToFindIrisAndFauxIris() {
return new RequestProcessor.QueryBuilder(IRIS_FAUX_IRIS, this);
}

public RequestProcessor.QueryBuilder queryToFindIrisList() {
Expand All @@ -61,7 +61,7 @@ public RequestProcessor.QueryBuilder queryToFindCommunesOfCanton() {
return new RequestProcessor.QueryBuilder(CANTON_COMMUNES, this);
}

public RequestProcessor.QueryBuilder queryforFindIrisDescendantsCommune() {
public RequestProcessor.QueryBuilder queryToFindIrisDescendantsCommune() {
return new RequestProcessor.QueryBuilder(LIEN_COMMUNE_IRIS, this);
}

Expand Down Expand Up @@ -116,9 +116,6 @@ public ExecutableQuery with(ProjetesRequestParametizer projetesRequestParametize
return new ExecutableQuery(requestProcessor.queryBuilder().build(projetesRequestParametizer.toParameters(), queryPath), requestProcessor);
}


public ExecutableQuery with(IrisListRequestParametizer irisListRequestParametizer) {
return new ExecutableQuery(requestProcessor.queryBuilder().build(irisListRequestParametizer.toParameters(), queryPath), requestProcessor);}
}


Expand All @@ -128,10 +125,11 @@ public QueryResult executeQuery() {
return new QueryResult(requestProcessor.queryExecutor().execute(query), requestProcessor);
}

public Boolean executeAskQuery() {
return requestProcessor.queryExecutor().executeAskQuery(query);
}
}



public record QueryResult(Csv csv, RequestProcessor requestProcessor) {
public <E> ListResult<E> listResult(Class<E> clazz) {
return new ListResult<>(requestProcessor.unmarshaller().unmarshalList(csv, clazz));
Expand All @@ -141,11 +139,6 @@ public <E> SingleResult<E> singleResult(Class<E> clazz) {
return new SingleResult<>(requestProcessor.unmarshaller().unmarshalOrNull(csv, clazz));
}

public <E> ListeResultatsIris<E> listeResultatsIris(Class<E> clazz) {
List<E> list = requestProcessor.unmarshaller().unmarshalList(csv, clazz);
return new ListeResultatsIris<>(list);
}


}

Expand All @@ -157,26 +150,10 @@ public ResponseEntity<List<E>> toResponseEntity() {
}

public record SingleResult<E>(E result) {
// public ResponseEntity<E> toResponseEntity() {return new ResponseEntity<>(result, HttpStatus.OK);}
public ResponseEntity<E> toResponseEntity() {
return EndpointsUtils.toResponseEntity(result);
}
}


public record ListeResultatsIris<E>(List<E> result) {
public boolean contains(String value) {
return result.stream().anyMatch(item -> item.toString().equals(value));
}

public ListeResultatsIris(List<E> result) {
this.result = result;
}

public List<E> getList() {
return result;
}

}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package fr.insee.rmes.metadata.config;

import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.FileTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
Expand All @@ -11,10 +10,8 @@
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Locale;

@org.springframework.context.annotation.Configuration
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ public record QueryBuilder(Configuration freemarkerConfiguration) {
public static final String CANTON_COMMUNES = "geographie/getCantonCommunesByCodeDate.ftlh";
public static final String PRECEDENTS = "geographie/getPreviousOrNextByCodeTypeDate.ftlh";
public static final String PROJETES = "geographie/getProjectionByCodeTypeDate.ftlh";
// public static final String IRIS = "geographie/getIrisByCodeDate.ftlh";
public static final String IRIS = "geographie/getTerritoireByCodeDateNomCommune.ftlh";
public static final String IRIS_FAUX_IRIS = "geographie/getIrisByCodeDate.ftlh";
public static final String IRIS_LIST = "geographie/getIrisList.ftlh";
public static final String LIEN_COMMUNE_IRIS = "geographie/hasIrisDescendant.ftlh";
public static final String LIEN_PAYS = "geographie/getPays.ftlh";
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@


import java.lang.reflect.RecordComponent;
import java.time.LocalDate;

public record TerritoireEtoileRequestParametizer(String code,
String date,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package fr.insee.rmes.metadata.queries.parameters;

import fr.insee.rmes.metadata.model.Iris;

import java.lang.reflect.RecordComponent;
import java.time.LocalDate;

Expand All @@ -26,14 +28,17 @@ public TerritoireRequestParametizer(LocalDate date,
this("none", date, typeOrigine, "*", chefLieu, com);
}

//for geo/communes and geo/bassinsDeVie2022 before date * developments : unused ?
// public TerritoireRequestParametizer(LocalDate date,
// Class<?> typeOrigine,
// String filtreNom,
// String chefLieu,
// boolean com) {
// this("none", date, typeOrigine, filtreNom, chefLieu, com);
// }
//for geo/iris
public TerritoireRequestParametizer(LocalDate date,
boolean com) {
this("none", date, Iris.class , "*", "*", com);//regardless of the values of typeOrigine, filtreNom et chefLieu
}

//for geo/iris/{code}
public TerritoireRequestParametizer(String code, LocalDate date) {
this(code, date, Iris.class, "*", "*", true);
//regardless of the values of typeOrigine, filtreNom, chefLieu and com, + date for hasIrisDescendant
}

//for geo/arrondissements, geo/aireDAttractionDesVilles2020, etc
public TerritoireRequestParametizer(LocalDate date,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package fr.insee.rmes.metadata.queryexecutor;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import fr.insee.rmes.metadata.queries.Query;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -12,6 +14,8 @@
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClient;

import java.io.IOException;

@Slf4j
@Component
public record QueryExecutor(RestClient restClient, String urlTemplate) {
Expand Down Expand Up @@ -56,4 +60,49 @@ public Csv execute(@NonNull Query query) {
.body(String.class));
}

public Boolean executeAskQuery(@NonNull Query query) {
String prefixedQuery = PREFIXES + query.value();
log.debug("Executing SPARQL ASK query: {}", prefixedQuery);

try {
String response = restClient.get()
.uri(urlTemplate, prefixedQuery)
.header("Accept", "application/sparql-results+json") // Format standard pour les résultats SPARQL
.retrieve()
.onStatus(HttpStatusCode::is4xxClientError, (request, reponse) -> {
String errorMessage = "SPARQL ASK query failed: " + request.getURI();
try {
String body = new String(reponse.getBody().readAllBytes());
errorMessage += " - Response: " + body;
} catch (IOException e) {
errorMessage += " - Error reading response body: " + e.getMessage();
}
log.error(errorMessage);
throw new RuntimeException("SPARQL query error: " + reponse.getStatusText());
})
.body(String.class);

log.debug("SPARQL ASK response: {}", response);

// Parse the Json response to extract the boolean
return parseAskResponse(response);
} catch (Exception e) {
log.error("Unexpected error while executing SPARQL ASK query: {}", e.getMessage(), e);
throw new RuntimeException("Failed to execute SPARQL ASK query", e);
}
}

// Method to parse the JSON response of a SPARQL ASK request
private Boolean parseAskResponse(String jsonResponse) {
try {
// Example of a Json response for an ASK request :
// {"head":{},"boolean":true}
JsonNode rootNode = new ObjectMapper().readTree(jsonResponse);
return rootNode.path("boolean").asBoolean();
} catch (Exception e) {
log.error("Failed to parse SPARQL ASK response: {}", jsonResponse, e);
throw new RuntimeException("Invalid SPARQL ASK response format", e);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import java.net.URI;
import java.time.Instant;
import java.time.LocalDate;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package fr.insee.rmes.metadata.utils;

import fr.insee.rmes.metadata.model.TypeEnumDescendantsIntercommunalite;
import fr.insee.rmes.metadata.model.TypeEnumDescendantsRegion;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
Expand Down
29 changes: 14 additions & 15 deletions impl/src/main/resources/request/geographie/hasIrisDescendant.ftlh
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
SELECT DISTINCT ?type
FROM <http://rdf.insee.fr/graphes/geo/cog>
ASK FROM <http://rdf.insee.fr/graphes/geo/cog>
WHERE {
{
?origine a igeo:Commune ;
igeo:codeINSEE '${code}' .
}
UNION
{
?origine a igeo:ArrondissementMunicipal ;
igeo:codeINSEE '${code}' .
}
?uri igeo:subdivisionDirecteDe+ ?origine .
?uri a ?type .
}
ORDER BY ?type
{
?origine a igeo:Commune ;
igeo:codeINSEE '${code}' .
}
UNION
{
?origine a igeo:ArrondissementMunicipal ;
igeo:codeINSEE '${code}' .
}
?uri igeo:subdivisionDirecteDe+ ?origine .
?uri a ?type .
FILTER(STRENDS(STR(?type), "#Iris"))
}
Loading
Loading