Commit 629a5085 authored by Adrien Pavie's avatar Adrien Pavie
Browse files

Better perf for large requests

parent 602bfb87
......@@ -57,15 +57,15 @@ Elle décrit le type de géométrie à interroger pour ce thème. Les types poss
### Le reste du fichier
Les lignes suivantes du fichiers contiennent la requête SQL permettant d'extraire les données OpenStreetMap souhaitées. La liste des colonnes et leur ordre sera utilisé pour définir les données attributaires du fichier de sortie. La requête est à renseigner une seule fois même si l'on souhaite récupérer différents types de géométries. La table à utiliser dans le `FROM` doit être `<TABLE>` (le motif sera remplacé par l'API par le nom correct). La structure de la table à interroger correspond à ce que vous avez configuré dans le fichier `db/import.style` (voir ci-après). Enfin, la géométrie de l'objet est à représenter avec la balise `<GEOM>`. Selon les paramètres passés par l'utilisateur, `<GEOM>` contiendra soit la géométrie initiale, soit le centroïde de celle-ci.
Les lignes suivantes du fichiers contiennent la requête SQL permettant d'extraire les données OpenStreetMap souhaitées. La liste des colonnes et leur ordre sera utilisé pour définir les données attributaires du fichier de sortie. Chaque colonne utilisée doit être préfixée par `t.` (alias pour le nom de la table). La requête est à renseigner une seule fois même si l'on souhaite récupérer différents types de géométries. La table à utiliser dans le `FROM` doit être `<TABLE>` (le motif sera remplacé par l'API par le nom correct). La structure de la table à interroger correspond à ce que vous avez configuré dans le fichier `db/import.style` (voir ci-après). La géométrie de l'objet est à représenter avec la balise `<GEOM>`. Selon les paramètres passés par l'utilisateur, `<GEOM>` contiendra soit la géométrie initiale, soit le centroïde de celle-ci. Enfin, la condition de filtrage sur le territoire sélectionné est à renseigner avec `<GEOMCOND>`. Cette balise sera remplacé dynamiquement par le nom des champs appropriés.
```sql
SELECT
osm_id, name, access, tags->'operator' AS operator,
tags->'opening_hours' AS opening_hours,
tags->'defibrillator:location' AS location, <GEOM>
t.osm_id, t.name, t.access, t.tags->'operator' AS operator,
t.tags->'opening_hours' AS opening_hours,
t.tags->'defibrillator:location' AS location, <GEOM>
FROM <TABLE>
WHERE emergency = 'defibrillator'
WHERE <GEOMCOND> AND emergency = 'defibrillator'
```
......
......@@ -95,13 +95,12 @@ function getThemeData(theme, boundary, options) {
// Create view in DB
boundary = "'" + boundary.replace(/'/g, "") + "'";
const dist = options.radius > 0 ? options.radius * 1000 : null;
let request =
`CREATE OR REPLACE VIEW ${resultViewName} AS
${theme.sql
.replace(/<BID>/g, boundary)
.replace(/<GEOM>/g, options.aspoint ? "ST_Centroid(geom) AS geom" : "geom")
.replace(/<GEOMCOND>/g, dist ? `ST_DWithin(p.way, b.center, ${dist})` : "p.way && b.way AND ST_Intersects(p.way, b.way)")
}`;
const request = `CREATE OR REPLACE VIEW ${resultViewName} AS ` + theme.geomtypes.map(g => (
theme.sql
.replace(/<TABLE>/g, `boundary b, planet_osm_${g} t`)
.replace(/<GEOMCOND>/g, `b.osm_id = ${boundary} AND ${dist ? `ST_DWithin(t.way, b.center, ${dist})` : "t.way && b.way AND ST_Intersects(t.way, b.way)"}`)
.replace(/<GEOM>/g, options.aspoint ? "ST_Centroid(t.way) AS geom" : "t.way AS geom")
)).join(" UNION ");
// console.log(request);
return pool.query(request)
......
......@@ -34,12 +34,7 @@ fs.readdirSync(folder).forEach((file) => {
// Append data
themesLight.push(Object.assign({ id: themeId }, metadata));
let completeSQL = "WITH data AS ("+geom.map(g => (
"SELECT p.*, p.way AS geom FROM planet_osm_"+g+" p, boundary b WHERE b.osm_id = <BID> AND <GEOMCOND>"
)).join(" UNION ")+") ";
completeSQL += sql.replace(/<TABLE>/g, "data");
themes.push(Object.assign({ id: themeId, sql: completeSQL.trim(), geomtypes: geom }, metadata));
themes.push(Object.assign({ id: themeId, sql: sql, geomtypes: geom }, metadata));
}
catch(e) {
throw new Error("Invalid theme file: "+file+" "+e.message);
......
......@@ -2,8 +2,8 @@
--GEOMETRY=point
SELECT
osm_id, name, access, tags->'operator' AS operator,
tags->'opening_hours' AS opening_hours,
tags->'defibrillator:location' AS location, <GEOM>
t.osm_id, t.name, t.access, t.tags->'operator' AS operator,
t.tags->'opening_hours' AS opening_hours,
t.tags->'defibrillator:location' AS location, <GEOM>
FROM <TABLE>
WHERE emergency = 'defibrillator'
WHERE <GEOMCOND> AND t.emergency = 'defibrillator'
......@@ -2,8 +2,8 @@
--GEOMETRY=point,polygon
SELECT
osm_id, name, access, tags->'operator' AS operator,
tags->'covered' AS covered, tags->'capacity' AS capacity,
tags->'bicycle_parking' AS type, <GEOM>
t.osm_id, t.name, t.access, t.tags->'operator' AS operator,
t.tags->'covered' AS covered, t.tags->'capacity' AS capacity,
t.tags->'bicycle_parking' AS type, <GEOM>
FROM <TABLE>
WHERE amenity = 'bicycle_parking'
WHERE <GEOMCOND> AND t.amenity = 'bicycle_parking'
......@@ -2,6 +2,6 @@
--GEOMETRY=point,polygon
SELECT
osm_id, name, tags->'amenity' AS type, tags->'operator:type' AS statut, <GEOM>
t.osm_id, t.name, t.tags->'amenity' AS type, t.tags->'operator:type' AS statut, <GEOM>
FROM <TABLE>
WHERE amenity IN ('school', 'kindergarten', 'college', 'university')
WHERE <GEOMCOND> AND t.amenity IN ('school', 'kindergarten', 'college', 'university')
......@@ -2,10 +2,10 @@
--GEOMETRY=point,polygon
SELECT
osm_id, internet_access AS connexion_type, tags->'internet_access:fee' AS fee,
COALESCE(tags->'internet_access:description', tags->'description') AS description,
tags->'internet_access:operator' AS internet_operator, tags->'internet_access:ssid' AS ssid,
name AS place_name, access AS place_access, tags->'opening_hours' AS place_opening_hours,
COALESCE(amenity, shop, tourism, office, 'unknown') AS place_type, <GEOM>
t.osm_id, t.internet_access AS connexion_type, t.tags->'internet_access:fee' AS fee,
COALESCE(t.tags->'internet_access:description', t.tags->'description') AS description,
t.tags->'internet_access:operator' AS internet_operator, t.tags->'internet_access:ssid' AS ssid,
t.name AS place_name, t.access AS place_access, t.tags->'opening_hours' AS place_opening_hours,
COALESCE(t.amenity, t.shop, t.tourism, t.office, 'unknown') AS place_type, <GEOM>
FROM <TABLE>
WHERE internet_access IS NOT NULL AND internet_access != 'no'
WHERE <GEOMCOND> AND internet_access IS NOT NULL AND internet_access != 'no'
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment