Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@


import fr.insee.rmes.magma.diffusion.api.requestprocessor.RequestProcessor;
import fr.insee.rmes.magma.diffusion.model.*;
import fr.insee.rmes.magma.diffusion.queries.parameters.*;
import fr.insee.rmes.magma.diffusion.model.Canton;
import fr.insee.rmes.magma.diffusion.model.TerritoireTousAttributs;
import fr.insee.rmes.magma.diffusion.model.TypeEnumAscendantsCanton;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;

Expand Down Expand Up @@ -94,5 +92,14 @@ public ResponseEntity<List<TerritoireTousAttributs>> getcogcansuiv(String code,
.toResponseEntity();
}

@Override
public ResponseEntity<List<TerritoireBaseRelation>> getcogcanintersect (String code, LocalDate date, TypeEnum type) {
return requestProcessor.queryToFindIntersections()
.with(new TerritoiresLiesRequestParametizer(code, date, type, Canton.class))
.executeQuery()
.listResult(TerritoireBaseRelation.class)
.toResponseEntity();
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,15 @@ public ResponseEntity<List<TerritoireBase>> getcogcomsuiv(String code, LocalDat
.listResult(TerritoireBase.class)
.toResponseEntity();
}

@Override
public ResponseEntity<List<TerritoireBaseRelation>> getcogcomintersect (String code, LocalDate date, TypeEnum type) {
return requestProcessor.queryToFindIntersections()
.with(new TerritoiresLiesRequestParametizer(code, date, type, Commune.class))
.executeQuery()
.listResult(TerritoireBaseRelation.class)
.toResponseEntity();
}
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ public QueryBuilder queryforFindPaysSuivants() {
return new QueryBuilder(PAYS_SUIVANTS, this);
}

public QueryBuilder queryToFindIntersections() {return new QueryBuilder(TERRITOIRES_LIES, this);}

public record QueryBuilder(String queryPath, RequestProcessor requestProcessor) {
public ExecutableQuery with(AscendantsDescendantsRequestParametizer ascendantsDescendantsRequestParametizer) {
return new ExecutableQuery(requestProcessor.queryBuilder().build(ascendantsDescendantsRequestParametizer.toParameters(), queryPath), requestProcessor);
Expand Down Expand Up @@ -124,12 +126,17 @@ public ExecutableQuery with(ProjetesRequestParametizer projetesRequestParametize
return new ExecutableQuery(requestProcessor.queryBuilder().build(projetesRequestParametizer.toParameters(), queryPath), requestProcessor);
}

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

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

}

public record ExecutableQuery(Query query, RequestProcessor requestProcessor) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public record QueryBuilder(Configuration freemarkerConfiguration) {
public static final String DESCENDANTS_PAYS = "geographie/getPaysDescendants.ftlh";
public static final String PAYS_PRECEDENTS = "geographie/getPaysPrecedents.ftlh";
public static final String PAYS_SUIVANTS = "geographie/getPaysSuivants.ftlh";
public static final String TERRITOIRES_LIES = "geographie/getTerritoiresLies.ftlh";
public static final String NOMENCLATURE = "classifications/getClassificationByCode.ftlh";

public Query build(Map<String, Object> parameters, String queryfile) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ interface ParameterValueDecoder<T> {
String ENUM_DESCENDANTS_REGION_CLASS = "fr.insee.rmes.magma.diffusion.model.TypeEnumDescendantsRegion";
String ENUM_DESCENDANTS_UNITEURBAINE_CLASS = "fr.insee.rmes.magma.diffusion.model.TypeEnumDescendantsUniteUrbaine";
String ENUM_DESCENDANTS_ZONEDEMPLOI_CLASS = "fr.insee.rmes.magma.diffusion.model.TypeEnumDescendantsZoneDEmploi";
String ENUM_TERRITOIRE_LIE = "fr.insee.rmes.magma.diffusion.model.TypeEnum";

static <U> ParameterValueDecoder<U> of(Class<U> type) {
return switch (type.getName()) {
Expand Down Expand Up @@ -89,6 +90,8 @@ static <U> ParameterValueDecoder<U> of(Class<U> type) {
enumUuValue -> enumUuValue == null ? "none" : ((TypeEnumDescendantsUniteUrbaine) enumUuValue).getValue();
case ENUM_DESCENDANTS_ZONEDEMPLOI_CLASS ->
enumZeValue -> enumZeValue == null ? "none" : ((TypeEnumDescendantsZoneDEmploi) enumZeValue).getValue();
case ENUM_TERRITOIRE_LIE ->
enumValue -> enumValue == null ? "none" : ((TypeEnum) enumValue).getValue();
case String ignored when Enum.class.isAssignableFrom(type) -> simpleEnum -> ((Enum<?>) simpleEnum).name();
default -> throw new IllegalArgumentException("Unsupported type: " + type.getName());
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package fr.insee.rmes.magma.diffusion.queries.parameters;

import fr.insee.rmes.magma.diffusion.model.TypeEnum;

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


public record TerritoiresLiesRequestParametizer(String code,
LocalDate date,
TypeEnum type,
Class<?> typeOrigine) implements ParametersForQuery<TerritoiresLiesRequestParametizer> {


@Override
public ParameterValueDecoder<?> findParameterValueDecoder(RecordComponent recordComponent) {
return ParametersForQuery.super.findParameterValueDecoder(recordComponent);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package fr.insee.rmes.magma.diffusion.utils;

import fr.insee.rmes.magma.diffusion.model.TypeEnum;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

@Component
public class TypeEnumConverter implements Converter<String, TypeEnum> {
@Override
public TypeEnum convert(String source) {
for (TypeEnum type : TypeEnum.values()) {
if (type.getValue().equalsIgnoreCase(source)) {
return type;
}
}
throw new IllegalArgumentException("Invalid value for TypeEnum : " + source);
}


}

Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
SELECT ?code ?uri ?type ?intitule ?relation ?dateCreation ?dateSuppression ?intitule ?intituleSansArticle ?typeArticle
FROM <http://rdf.insee.fr/graphes/geo/cog>
WHERE {
SELECT ?code ?uri ?type ?intitule ?relation ?dateCreation ?dateSuppression ?intitule ?intituleSansArticle ?typeArticle
WHERE {
BIND('${date}'^^xsd:dateTime AS ?date)
?source a igeo:${typeOrigine};
igeo:codeINSEE '${code}' .
?uri a ?typeRDF ;
igeo:codeINSEE ?code ;
igeo:codeArticle ?typeArticle ;
igeo:nom ?intitule;
igeo:nomSansArticle ?intituleSansArticle.
BIND(STRAFTER(STR(?typeRDF),"http://rdf.insee.fr/def/geo#") AS ?type).
<#if type != "none">
FILTER(?typeRDF = igeo:${type})
</#if>
{ ?source (igeo:subdivisionDirecteDe|^igeo:subdivisionDirecte) ?uri . BIND('inclus' AS ?relation) }
UNION
{ ?source (^igeo:subdivisionDirecteDe|igeo:subdivisionDirecte) ?uri . BIND('contient' AS ?relation)}
UNION
{ ?source (igeo:territoireCommunAvec|^igeo:territoireCommunAvec) ?uri . BIND('intersecte' AS ?relation) }
OPTIONAL{?source ^igeo:creation/igeo:date ?dateCreationSource}
OPTIONAL{?source ^igeo:suppression/igeo:date ?dateSuppressionSource}
OPTIONAL{?uri ^igeo:creation/igeo:date ?dateCreation}
OPTIONAL{?uri ^igeo:suppression/igeo:date ?dateSuppression}
FILTER(!BOUND(?dateCreationSource) || ?dateCreationSource <= ?date)
FILTER(!BOUND(?dateSuppressionSource) || ?dateSuppressionSource > ?date)
FILTER(!BOUND(?dateCreation) || ?dateCreation <= ?date)
FILTER(!BOUND(?dateSuppression) || ?dateSuppression > ?date)

}
}
ORDER BY ?code
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package fr.insee.rmes.magma.diffusion.api.testcontainers.queries;

import fr.insee.rmes.magma.diffusion.api.GeoCantonEndpoints;
import fr.insee.rmes.magma.diffusion.model.Canton;
import fr.insee.rmes.magma.diffusion.model.TerritoireTousAttributs;
import fr.insee.rmes.magma.diffusion.model.TypeEnumAscendantsCanton;
import fr.insee.rmes.magma.diffusion.model.*;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -15,6 +14,7 @@

import static org.junit.Assert.assertEquals;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

Expand Down Expand Up @@ -238,4 +238,61 @@ void should_return_404_when_CantonCodeSuivants_code0101_date20250904() throws Ex
.andExpect(status().isNotFound());
}

////////////////////////////////////////////////////////////////////
/// geo/canton/{code}/intersections ///
////////////////////////////////////////////////////////////////////

// geo/canton/0101/intersections?date=2025-09-04
@Test
void should_return_19_territoires_when_CantonCodeIntersections_code0101_date20250904(){
var response = endpoints.getcogcanintersect ("0101", LocalDate.of(2025,9,4), null);
var result = response.getBody();
assertNotNull(result);
var resultItem1= result.getFirst();

assertAll(
() -> Assertions.assertEquals(19, result.size()),
() -> Assertions.assertEquals("01", resultItem1.getCode()),
() -> Assertions.assertEquals("http://id.insee.fr/geo/departement/84680e6f-2e99-44c9-a9ba-2e96a2ae48b7", resultItem1.getUri()),
() -> Assertions.assertEquals(TerritoireBaseRelation.TypeEnum.DEPARTEMENT, resultItem1.getType()),
() -> Assertions.assertEquals(LocalDate.of(1967,12,31), resultItem1.getDateCreation()),
() -> Assertions.assertEquals("Ain", resultItem1.getIntituleSansArticle()),
() -> Assertions.assertEquals(TerritoireBaseRelation.TypeArticleEnum._5, resultItem1.getTypeArticle()),
() -> Assertions.assertEquals("Ain", resultItem1.getIntitule()),
() -> Assertions.assertEquals("inclus", resultItem1.getRelation())
);
}

@Test
void should_return_18_communes_when_CantonCodeIntersections_code0101_date20250904_typeCommune(){
var response = endpoints.getcogcanintersect ("0101", LocalDate.of(2025,9,4), TypeEnum.COMMUNE);
var result = response.getBody();
assertNotNull(result);
var resultItem1= result.getFirst();
var resultItem2= result.get(1);

assertAll(
() -> Assertions.assertEquals(18, result.size()),

() -> Assertions.assertEquals("01002", resultItem1.getCode()),
() -> Assertions.assertEquals("http://id.insee.fr/geo/commune/43018c68-c278-433a-b285-3531e8d5347e", resultItem1.getUri()),
() -> Assertions.assertEquals(TerritoireBaseRelation.TypeEnum.COMMUNE, resultItem1.getType()),
() -> Assertions.assertEquals(LocalDate.of(1943,1,1), resultItem1.getDateCreation()),
() -> Assertions.assertEquals("Abergement-de-Varey", resultItem1.getIntituleSansArticle()),
() -> Assertions.assertEquals(TerritoireBaseRelation.TypeArticleEnum._5, resultItem1.getTypeArticle()),
() -> Assertions.assertEquals("L'Abergement-de-Varey", resultItem1.getIntitule()),
() -> Assertions.assertEquals("contient", resultItem1.getRelation()),

() -> Assertions.assertEquals("01004", resultItem2.getCode()),
() -> Assertions.assertEquals("http://id.insee.fr/geo/commune/9957029c-4f49-4183-8c94-f6001a6e5a92", resultItem2.getUri()),
() -> Assertions.assertEquals(TerritoireBaseRelation.TypeEnum.COMMUNE, resultItem2.getType()),
() -> Assertions.assertEquals(LocalDate.of(1955,3,31), resultItem2.getDateCreation()),
() -> Assertions.assertEquals("Ambérieu-en-Bugey", resultItem2.getIntituleSansArticle()),
() -> Assertions.assertEquals(TerritoireBaseRelation.TypeArticleEnum._1, resultItem2.getTypeArticle()),
() -> Assertions.assertEquals("Ambérieu-en-Bugey", resultItem2.getIntitule()),
() -> Assertions.assertEquals("contient", resultItem2.getRelation())
);
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -328,4 +328,63 @@ void should_return_1_commune_when_CommunesCodeSuivants_date19450626(){
);
}


////////////////////////////////////////////////////////////////////
/// geo/commune/{code}/intersections ///
////////////////////////////////////////////////////////////////////

// geo/commune/01053/intersections?date=2025-09-04
@Test
void should_return_30_territoires_when_CommuneCodeIntersections_code01053_date20250904(){
var response = endpoints.getcogcomintersect ("01053", LocalDate.of(2025,9,4), null);
var result = response.getBody();
assertNotNull(result);
var resultItem1= result.getFirst();

assertAll(
() -> assertEquals(30, result.size()),
() -> assertEquals("01", resultItem1.getCode()),
() -> assertEquals("http://id.insee.fr/geo/departement/84680e6f-2e99-44c9-a9ba-2e96a2ae48b7", resultItem1.getUri()),
() -> assertEquals(TerritoireBaseRelation.TypeEnum.DEPARTEMENT, resultItem1.getType()),
() -> assertEquals(LocalDate.of(1967,12,31), resultItem1.getDateCreation()),
() -> assertEquals("Ain", resultItem1.getIntituleSansArticle()),
() -> assertEquals(TerritoireBaseRelation.TypeArticleEnum._5, resultItem1.getTypeArticle()),
() -> assertEquals("Ain", resultItem1.getIntitule()),
() -> assertEquals("inclus", resultItem1.getRelation())
);
}



@Test
void should_return_2_cantons_when_CommuneCodeIntersections_code01053_date20250904_typeCanton(){
var response = endpoints.getcogcomintersect ("01053", LocalDate.of(2025,9,4), TypeEnum.CANTON);
var result = response.getBody();
assertNotNull(result);
var resultItem1= result.getFirst();
var resultItem2= result.get(1);

assertAll(
() -> assertEquals(2, result.size()),

() -> assertEquals("0105", resultItem1.getCode()),
() -> assertEquals("http://id.insee.fr/geo/canton/622ce50c-2ff4-470d-a0f3-f85baa8813a7", resultItem1.getUri()),
() -> assertEquals(TerritoireBaseRelation.TypeEnum.CANTON, resultItem1.getType()),
() -> assertEquals(LocalDate.of(2016,1,1), resultItem1.getDateCreation()),
() -> assertEquals("Bourg-en-Bresse-1", resultItem1.getIntituleSansArticle()),
() -> assertEquals(TerritoireBaseRelation.TypeArticleEnum._0, resultItem1.getTypeArticle()),
() -> assertEquals("Bourg-en-Bresse-1", resultItem1.getIntitule()),
() -> assertEquals("intersecte", resultItem1.getRelation()),

() -> assertEquals("0106", resultItem2.getCode()),
() -> assertEquals("http://id.insee.fr/geo/canton/888731da-1820-4662-9cc1-17be3544a01c", resultItem2.getUri()),
() -> assertEquals(TerritoireBaseRelation.TypeEnum.CANTON, resultItem2.getType()),
() -> assertEquals(LocalDate.of(2016,1,1), resultItem1.getDateCreation()),
() -> assertEquals("Bourg-en-Bresse-2", resultItem2.getIntituleSansArticle()),
() -> assertEquals(TerritoireBaseRelation.TypeArticleEnum._0, resultItem2.getTypeArticle()),
() -> assertEquals("Bourg-en-Bresse-2", resultItem2.getIntitule()),
() -> assertEquals("intersecte", resultItem2.getRelation())
);
}

}
Loading