Skip to content

Commit

Permalink
WS list Iris
Browse files Browse the repository at this point in the history
  • Loading branch information
JeromeMBourgeois committed Jan 18, 2024
1 parent 955ac5c commit 941f945
Show file tree
Hide file tree
Showing 9 changed files with 158 additions and 34 deletions.
3 changes: 3 additions & 0 deletions src/main/java/fr/insee/rmes/api/geo/AbstractGeoApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public abstract class AbstractGeoApi extends AbstractMetadataApi {

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/fr/insee/rmes/api/geo/ConstGeoApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public class ConstGeoApi {
public static final String PATH_LISTE_CANTON_OU_VILLE= PATH_SEPARATOR +"cantonsEtVilles";
public static final String PATH_INTERCO= PATH_SEPARATOR + "intercommunalite";
public static final String PATH_BASSINDEVIE= PATH_SEPARATOR + "bassinDeVie2022";

public static final String PATH_LISTE_IRIS = PATH_SEPARATOR + "iris";
public static final String PATH_LISTE_COMMUNE = PATH_SEPARATOR + "communes";
public static final String PATH_LISTE_PAYS = PATH_SEPARATOR + "pays";
public static final String PATH_LISTE_CANTON = PATH_SEPARATOR + "cantons";
Expand Down
57 changes: 48 additions & 9 deletions src/main/java/fr/insee/rmes/api/geo/territoire/IrisApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,9 @@

import fr.insee.rmes.api.geo.AbstractGeoApi;
import fr.insee.rmes.api.geo.ConstGeoApi;
import fr.insee.rmes.modeles.geo.territoire.Canton;
import fr.insee.rmes.modeles.geo.territoire.Commune;
import fr.insee.rmes.modeles.geo.territoire.Iris;
import fr.insee.rmes.modeles.geo.territoire.Territoire;
import fr.insee.rmes.modeles.geo.territoires.Cantons;
import fr.insee.rmes.modeles.geo.territoires.Communes;
import fr.insee.rmes.modeles.geo.territoires.Territoires;
import fr.insee.rmes.queries.geo.GeoQueries;
import fr.insee.rmes.utils.Constants;
Expand Down Expand Up @@ -40,10 +37,13 @@ public class IrisApi extends AbstractGeoApi {
private static final String LITTERAL_PARAMETER_DATE_DESCRIPTION =
"Filtre pour renvoyer l'Iris active à la date donnée. Par défaut, c’est la date courante. (Format : 'AAAA-MM-JJ')";
private static final String LITTERAL_OPERATION_SUMMARY =
"Informations sur un Iris identifié par son code (quatre chiffres pour la métropole ou cinq pour les DOM ou 2A/2B plus deux chiffres pour la Corse)";
"Informations sur un Iris identifié par son code (neuf chiffres pour la métropole ou 2A/2B plus 7 chiffres pour la Corse)";

private static final String LITTERAL_DATE_EXAMPLE = "2020-01-01";

public IrisApi() {
// Constructeur par défaut
}
@Path(ConstGeoApi.PATH_IRIS + CODE_PATTERN)
@GET
@Produces({
Expand Down Expand Up @@ -80,16 +80,55 @@ public Response getByCode(
if ( ! this.verifyParameterDateIsRightWithoutHistory(date)) {
return this.generateBadRequestResponse();
}
else {
Territoire territoire;
if (code.endsWith("0000")) {
territoire = new Commune(code);
} else {
territoire = new Iris(code);
}

return this.generateResponseATerritoireByCode(
sparqlUtils.executeSparqlQuery(
GeoQueries.getIrisByCodeAndDate(code, this.formatValidParameterDateIfIsNull(date))),
header,
territoire);
}
}

@Path(ConstGeoApi.PATH_LISTE_IRIS)
@GET
@Produces({
MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML
})
@Operation(
operationId = LITTERAL_ID_OPERATION + ConstGeoApi.ID_OPERATION_LISTE,
summary = "Informations sur toutes les iris actifs à la date donnée. Par défaut, c’est la date courante.",
responses = {
@ApiResponse(
content = @Content(schema = @Schema(type = ARRAY, implementation = Territoire.class)),
description = LITTERAL_RESPONSE_DESCRIPTION)
})
public Response getListe(
@Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header,
@Parameter(
description = "Filtre pour renvoyer les Iris ou faux-Iris à la date donnée. Par défaut, c’est la date courante. (Format : 'AAAA-MM-JJ')" + LITTERAL_PARAMETER_DATE_WITH_HISTORY,
required = false,
schema = @Schema(type = Constants.TYPE_STRING, format = Constants.FORMAT_DATE)) @QueryParam(
value = Constants.PARAMETER_DATE) String date) {

if ( ! this.verifyParameterDateIsRightWithHistory(date)) {
return this.generateBadRequestResponse();
}
else {
return this
.generateResponseATerritoireByCode(
.generateResponseListOfTerritoire(
sparqlUtils
.executeSparqlQuery(
GeoQueries.getIrisByCodeAndDate(code, this.formatValidParameterDateIfIsNull(date))),
.executeSparqlQuery(GeoQueries.getListIris(this.formatValidParameterDateIfIsNull(date))),
header,
new Iris(code));
Territoires.class,
Territoire.class);
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.util.stream.Stream;

import fr.insee.rmes.modeles.geo.territoire.*;
import fr.insee.rmes.modeles.geo.territoire.Iris;
import fr.insee.rmes.modeles.geo.territoires.*;
import fr.insee.rmes.utils.Constants;

Expand All @@ -27,7 +28,7 @@ public enum EnumTypeGeographie {
INTERCOMMUNALITE("Intercommunalite",Intercommunalite.class,Intercommunalites.class,Constants.NONE),
BASSINDEVIE("BassinDeVie2022",BassinDeVie2022.class,BassinsDeVie2022.class,Constants.NONE),

IRIS("Iris",Iris.class,Iriss.class,Constants.NONE);
IRIS("Iris", Iris.class,Iriss.class,Constants.NONE);

private String typeObjetGeo;
private Class<? extends Territoire> classNameOfGeoType;
Expand Down
16 changes: 4 additions & 12 deletions src/main/java/fr/insee/rmes/modeles/geo/territoire/Iris.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import fr.insee.rmes.modeles.geo.EnumTypeGeographie;
import fr.insee.rmes.modeles.geo.IntituleSansArticle;
import io.swagger.v3.oas.annotations.media.Schema;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
Expand All @@ -16,25 +15,18 @@
@JacksonXmlRootElement(localName = "Iris")
@XmlAccessorType(XmlAccessType.FIELD)
@Schema(description = "Objet représentant un Iris")

public class Iris extends Territoire {

public Iris() {
this.type = EnumTypeGeographie.IRIS.getTypeObjetGeo();
this.intituleSansArticle = new IntituleSansArticle();
this.typeDIris= typeDIris;
}

public Iris(String code) {
if (code.endsWith("0000")) {
this.type = EnumTypeGeographie.COMMUNE.getTypeObjetGeo();
} else {
this.type = EnumTypeGeographie.IRIS.getTypeObjetGeo();
}
this.code = code;
this.intituleSansArticle = new IntituleSansArticle();
this.typeDIris= typeDIris;
}
this.code = code;
this.intituleSansArticle = new IntituleSansArticle();
}

@Override
@JacksonXmlProperty(localName = "Type")
Expand Down
36 changes: 29 additions & 7 deletions src/main/java/fr/insee/rmes/modeles/geo/territoire/Territoire.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
package fr.insee.rmes.modeles.geo.territoire;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;

import fr.insee.rmes.modeles.geo.IntituleSansArticle;
import io.swagger.v3.oas.annotations.media.Schema;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Territoire")
public abstract class Territoire {

Expand Down Expand Up @@ -128,7 +127,29 @@ public Territoire(
this.intituleSansArticle = intituleSansArticle;
this.categorieJuridique= categorieJuridique;
}

public Territoire(
String code,
String uri,
String intitule,
String type,
String typeDIris,
String dateCreation,
String dateSuppression,
String categorieJuridique,
IntituleSansArticle intituleSansArticle
) {

this.code = code;
this.uri = uri;
this.intitule = intitule;
this.type = type;
this.typeDIris=typeDIris;
this.dateCreation = dateCreation;
this.dateSuppression = dateSuppression;
this.intituleSansArticle = intituleSansArticle;
this.categorieJuridique= categorieJuridique;
}

public Territoire() {
this.intituleSansArticle = new IntituleSansArticle();
}
Expand Down Expand Up @@ -214,5 +235,6 @@ public String getCategorieJuridique() {
public void setCategorieJuridique(String categorieJuridique) {
this.categorieJuridique = categorieJuridique;
}



}
17 changes: 13 additions & 4 deletions src/main/java/fr/insee/rmes/queries/geo/GeoQueries.java
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,9 @@ public static String getListCantonsOuVilles(String date) {
return getTerritoire(Constants.NONE, date, EnumTypeGeographie.CANTON_OU_VILLE);
}

public static String getListIris(String date) {
return getTerritoire(Constants.NONE, date, EnumTypeGeographie.IRIS);
}
public static String getListCantons(String date){
return getTerritoire(Constants.NONE,date,EnumTypeGeographie.CANTON);
}
Expand Down Expand Up @@ -438,9 +441,11 @@ private static String getPreviousOrNextQuery(
}

private static String getTerritoire(String code, String date, EnumTypeGeographie typeGeo) {
if (typeGeo == EnumTypeGeographie.IRIS) {
if (typeGeo == EnumTypeGeographie.IRIS && code !="none") {
return getIris(code, date,typeGeo);
} else{
} else if (typeGeo == EnumTypeGeographie.IRIS && code =="none") {
return getIrisList(code, date, Constants.ABSENT, typeGeo, true);
} else{
return getTerritoireFiltre(code, date, Constants.ABSENT, typeGeo, true);
}
}
Expand All @@ -458,10 +463,14 @@ private static String getIris(String code, String date, EnumTypeGeographie typeG
return buildRequest(QUERIES_FOLDER, "getIrisByCodeDate.ftlh", params);

}


private static String getIrisList(String code, String date,String filtreNom, EnumTypeGeographie typeGeo,boolean com){
Map<String, Object> params = buildCodeAndDateAndFilterParams(code, date, filtreNom,com);
params.put("territoire", typeGeo.getTypeObjetGeo());
return buildRequest(QUERIES_FOLDER, "getIrisList.ftlh",params);
}
private static String getTerritoireFiltre(String code, String date, String filtreNom, EnumTypeGeographie typeGeo,boolean com) {
Map<String, Object> params = buildCodeAndDateAndFilterParams(code, date, filtreNom,com);
System.out.println(typeGeo.getTypeObjetGeo());
params.put("territoire", typeGeo.getTypeObjetGeo());
params.put("chefLieu", typeGeo.getChefLieuPredicate());
return buildRequest(QUERIES_FOLDER, "getTerritoireByCodeDateNomcommune.ftlh", params);
Expand Down
35 changes: 35 additions & 0 deletions src/main/resources/request/geographie/getIrisList.ftlh
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
SELECT DISTINCT ?uri ?type ?code ?intitule ?intituleSansArticle ?typeArticle ?typeDIris ?dateCreation ?dateSuppression
WHERE {
{
?s a igeo:Iris ;
igeo:typeDIRIS ?uriTypeDIris ;
igeo:codeINSEE ?code .
BIND(SUBSTR(STR(?uriTypeDIris ), STRLEN(STR(?uriTypeDIris )), 1) AS ?typeDIris)
}
UNION
{
?s a igeo:Commune ;
igeo:codeINSEE ?codeCommune .
OPTIONAL {
?iris igeo:subdivisionDirecteDe+ ?s ; a igeo:Iris .
OPTIONAL {?iris ^igeo:creation/igeo:date ?dateCreationIris }
OPTIONAL {?iris ^igeo:suppression/igeo:date ?dateSuppressionIris }
FILTER (!BOUND(?dateCreationIris) || ?dateCreationIris <= '${date}'^^xsd:date )
FILTER (!BOUND(?dateSuppressionIris) || ?dateSuppressionIris > '${date}'^^xsd:date )
}
FILTER (!BOUND(?iris))
BIND(CONCAT(?codeCommune, '0000') AS ?code)
}
?s igeo:nom ?intitule;
igeo:codeArticle ?typeArticle ;
igeo:nomSansArticle ?intituleSansArticle ;
a ?typeRDF .
#BIND(STRAFTER(STR(?typeRDF),"http://rdf.insee.fr/def/geo#") AS ?type).
BIND(STR(?typeRDF) AS ?type).
BIND(STR(?s) AS ?uri).
OPTIONAL {?s ^igeo:creation/igeo:date ?dateCreation }
OPTIONAL {?s ^igeo:suppression/igeo:date ?dateSuppression }
FILTER (!BOUND(?dateCreation) || ?dateCreation <= '${date}'^^xsd:date )
FILTER (!BOUND(?dateSuppression) || ?dateSuppression > '${date}'^^xsd:date )
}
ORDER BY ?code
23 changes: 23 additions & 0 deletions src/test/java/fr/insee/rmes/utils/CSVUtilsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package fr.insee.rmes.utils;

import fr.insee.rmes.modeles.geo.territoire.Commune;
import org.junit.jupiter.api.Test;

class CSVUtilsTest {

@Test
void populateMultiPOJO() {
CSVUtils csvutils= new CSVUtils();
csvutils.populateMultiPOJO("uri,type,code,intitule,intituleSansArticle,typeArticle,typeDIris,dateCreation,dateSuppression\n" +
"http://id.insee.fr/geo/commune/6be6a231-0e6f-4462-9799-94903bdf3ca5,Commune,988330000,Kouaoua,Kouaoua,0,,2008-01-01,\n" +
"http://id.insee.fr/geo/commune/44901691-98ac-4ac0-ad8d-dd84d75c3017,Commune,988320000,Yaté,Yaté,0,,2008-01-01,\n" +
"http://id.insee.fr/geo/commune/775edf31-a9f5-4b1a-a848-f4b1cbe07812,Commune,988310000,Voh,Voh,0,,2008-01-01,\n" +
"http://id.insee.fr/geo/commune/2cb6fd01-6d8d-4f58-99fd-771ae51305b7,Commune,988300000,Touho,Touho,0,,2008-01-01,\n" +
"http://id.insee.fr/geo/commune/389da151-6883-4a3f-b7bf-2f50308c0ff0,Commune,988290000,Thio,Thio,0,,2008-01-01,\n" +
"http://id.insee.fr/geo/commune/f168b24d-1880-418c-9ccd-1a31736d6996,Commune,988280000,Sarraméa,Sarraméa,0,,2008-01-01,\n" +
"http://id.insee.fr/geo/commune/98741ff3-4355-415a-9c72-3d81b29873ab,Commune,988270000,Poya,Poya,0,,2008-01-01,\n" +
"http://id.insee.fr/geo/commune/fa1abbc5-b24e-4d8b-a8c2-c3f2df4e40e4,Commune,988260000,Poum,Poum,0,,2008-01-01,\n" +
"http://id.insee.fr/geo/commune/f2c631cb-f134-4101-b7a7-15d60e07b8a7,Iris,988250000,Pouembout,Pouembout,0,H,2008-01-01,\n", Commune.class);

}
}

0 comments on commit 941f945

Please sign in to comment.