Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🐛 Fixe (vraiment) le filtre des indicateurs par plan action #3245

Merged
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
81 changes: 48 additions & 33 deletions data_layer/sqitch/deploy/indicateur/filtre.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,54 @@

BEGIN;

-- Recrée la même fonction sans la vérification des droits
-- qui pose des problèmes de performance lors du `fetchFilteredIndicateurs`
-- (requête +30s qui timeout sur l'app)

create or replace function
axes(indicateur_definitions)
returns setof axe
language sql
security definer
stable
begin
atomic
select axe
from fiche_action_indicateur fai
join fiche_action_axe faa using (fiche_id)
join axe on faa.axe_id = axe.id
left join definition_referentiel($1) def on true
where
-- indicateur prédéfini
(($1.indicateur_id is not null
and fai.indicateur_id = $1.indicateur_id
and collectivite_id = $1.collectivite_id)
-- indicateur prédéfini dont les valeurs sont celles d'un autre
or ($1.indicateur_id is not null
and fai.indicateur_id = def.valeur_indicateur
and collectivite_id = $1.collectivite_id)
-- indicateur perso
or ($1.indicateur_perso_id is not null
and fai.indicateur_personnalise_id = $1.indicateur_perso_id))
;
end;
comment on function axes(indicateur_definitions) is
'Les axes (plans d''action) associés à un indicateur.';
-- Nouveaux index sur les colonnes utilisées dans les requêtes de jointures
-- liées aux filtres sur les indicateurs, en particulier utilisant la fonction axes ci-dessous.

CREATE INDEX IF NOT EXISTS fiche_action_indicateur_indicateur_id_idx
ON fiche_action_indicateur (indicateur_id);

CREATE INDEX IF NOT EXISTS fiche_action_indicateur_fiche_id_idx
ON fiche_action_indicateur (fiche_id);

CREATE INDEX IF NOT EXISTS fiche_action_indicateur_indicateur_personnalise_id_idx
ON fiche_action_indicateur (indicateur_personnalise_id);

CREATE INDEX IF NOT EXISTS fiche_action_axe_axe_id_idx
ON fiche_action_axe (axe_id);

CREATE INDEX IF NOT EXISTS indicateur_definition_valeur_indicateur_idx
ON indicateur_definition (valeur_indicateur);


-- Nouvelle version de la fonction axes qui ne fait pas de LEFT JOIN sur la table indicateur_definition
-- qui résout les problèmes de performance. (20s -> 0.1s quand appelée depuis la vue indicateur_definitions)
CREATE OR REPLACE FUNCTION public.axes(indicateur_definitions)
RETURNS SETOF axe
LANGUAGE sql
STABLE SECURITY DEFINER
BEGIN ATOMIC
select axe.*
from (
select fai.fiche_id
from indicateur_definition def
join fiche_action_indicateur fai on def.id = fai.indicateur_id
join fiche_action fa on fai.fiche_id = fa.id
where (def.id = $1.indicateur_id or def.valeur_indicateur = $1.indicateur_id)
and fa.collectivite_id = $1.collectivite_id

UNION

select fai.fiche_id
from indicateur_personnalise_definition def
join fiche_action_indicateur fai on def.id = fai.indicateur_personnalise_id
where def.id = $1.indicateur_perso_id
and def.collectivite_id = $1.collectivite_id

) f
join fiche_action_axe faa on faa.fiche_id = f.fiche_id
join axe on faa.axe_id = axe.id;
END;



COMMIT;
40 changes: 40 additions & 0 deletions data_layer/sqitch/deploy/indicateur/filtre@v3.6.0.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
-- Deploy tet:indicateur/filtre to pg

BEGIN;

-- Recrée la même fonction sans la vérification des droits
-- qui pose des problèmes de performance lors du `fetchFilteredIndicateurs`
-- (requête +30s qui timeout sur l'app)

create or replace function
axes(indicateur_definitions)
returns setof axe
language sql
security definer
stable
begin
atomic
select axe
from fiche_action_indicateur fai
join fiche_action_axe faa using (fiche_id)
join axe on faa.axe_id = axe.id
left join definition_referentiel($1) def on true
where
-- indicateur prédéfini
(($1.indicateur_id is not null
and fai.indicateur_id = $1.indicateur_id
and collectivite_id = $1.collectivite_id)
-- indicateur prédéfini dont les valeurs sont celles d'un autre
or ($1.indicateur_id is not null
and fai.indicateur_id = def.valeur_indicateur
and collectivite_id = $1.collectivite_id)
-- indicateur perso
or ($1.indicateur_perso_id is not null
and fai.indicateur_personnalise_id = $1.indicateur_perso_id))
;
end;
comment on function axes(indicateur_definitions) is
'Les axes (plans d''action) associés à un indicateur.';


COMMIT;
11 changes: 9 additions & 2 deletions data_layer/sqitch/revert/indicateur/filtre.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,15 @@

BEGIN;

-- Revert les axes pour appliquer de nouveau la verification de droits
-- Supprime les index
DROP INDEX IF EXISTS fiche_action_indicateur_indicateur_id_idx;
DROP INDEX IF EXISTS fiche_action_indicateur_fiche_id_idx;
DROP INDEX IF EXISTS fiche_action_indicateur_indicateur_personnalise_id_idx;
DROP INDEX IF EXISTS fiche_action_axe_axe_id_idx;
DROP INDEX IF EXISTS indicateur_definition_valeur_indicateur_idx;


-- Recrée la fonction axes
create or replace function
axes(indicateur_definitions)
returns setof axe
Expand All @@ -29,7 +36,7 @@ begin
-- indicateur perso
or ($1.indicateur_perso_id is not null
and fai.indicateur_personnalise_id = $1.indicateur_perso_id))
and can_read_acces_restreint(axe.collectivite_id);
;
end;
comment on function axes(indicateur_definitions) is
'Les axes (plans d''action) associés à un indicateur.';
Expand Down
37 changes: 37 additions & 0 deletions data_layer/sqitch/revert/indicateur/filtre@v3.6.0.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
-- Deploy tet:indicateur/filtre to pg

BEGIN;

-- Revert les axes pour appliquer de nouveau la verification de droits

create or replace function
axes(indicateur_definitions)
returns setof axe
language sql
security definer
stable
begin
atomic
select axe
from fiche_action_indicateur fai
join fiche_action_axe faa using (fiche_id)
join axe on faa.axe_id = axe.id
left join definition_referentiel($1) def on true
where
-- indicateur prédéfini
(($1.indicateur_id is not null
and fai.indicateur_id = $1.indicateur_id
and collectivite_id = $1.collectivite_id)
-- indicateur prédéfini dont les valeurs sont celles d'un autre
or ($1.indicateur_id is not null
and fai.indicateur_id = def.valeur_indicateur
and collectivite_id = $1.collectivite_id)
-- indicateur perso
or ($1.indicateur_perso_id is not null
and fai.indicateur_personnalise_id = $1.indicateur_perso_id))
and can_read_acces_restreint(axe.collectivite_id);
end;
comment on function axes(indicateur_definitions) is
'Les axes (plans d''action) associés à un indicateur.';

COMMIT;
1 change: 1 addition & 0 deletions data_layer/sqitch/sqitch.plan
Original file line number Diff line number Diff line change
Expand Up @@ -676,3 +676,4 @@ utilisateur/membre [utilisateur/membre@v3.4.0] 2024-06-04T12:58:19Z Marc Rutkows
indicateur/filtre [indicateur/filtre@v3.5.0] 2024-06-25T09:00:01Z Frederic Arnoux <frederic.arnoux@beta.gouv.fr> # Supprime la vérification des droits sur la fonction axes
@v3.6.0 2024-06-25T13:27:12Z Frederic Arnoux <frederic.arnoux@beta.gouv.fr> # Supprime la vérification de droits sur les axes liés aux indicateurs.\nCette vérification est par ailleurs déjà faite sur la vue indicateur_definitions qui l'utilise.\nCette suppression permet de corriger le filtre des indicateurs par plan action.

indicateur/filtre [indicateur/filtre@v3.6.0] 2024-06-25T15:16:51Z Frederic Arnoux <frederic.arnoux@beta.gouv.fr> # Ajoute des indexes pour améliorer la performance des requêtes de filtrage des indicateurs
7 changes: 7 additions & 0 deletions data_layer/sqitch/verify/indicateur/filtre@v3.6.0.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
-- Verify tet:indicateur/filtre on pg

BEGIN;

select has_function_privilege('axes(indicateur_definitions)', 'execute');

ROLLBACK;
Loading