Actions
Anomalie #26333
ferméREVIEW - La recherche de documents n'aboutit pas pour certains utilisateurs
Début:
21/08/2023
Echéance:
Projet Parapheur:
2301.0.3 (Correctif)
Description
Sur une instance MaarchParapheur de production contenant un certain volume de données :
select count() from main_documents;
66714
(1 ligne)
select count() from workflows;
78221
(1 ligne)
La recherche de documents pour les utlisateurs n'ayant pas le privilège "Accéder à tous les documents et gérer le circuit" n'aboutit jamais. La requête en cause est la suivante dans le fichier src/app/search/controllers/SearchController.php l.44 :
SELECT id, title, reference, typist, status, count(1) OVER() FROM main_documents WHERE id IN (
SELECT DISTINCT ws1.main_document_id
FROM workflows ws1
WHERE typist = $val
OR (ws1.process_date IS NOT NULL AND ws1.user_id = $val)
OR (
ws1.user_id IN (
SELECT (SELECT $val) UNION (SELECT id FROM users WHERE substitute = $val)
)
AND ws1."order" = (
SELECT min(ws2."order") FROM workflows ws2 WHERE ws2.process_date IS NULL AND ws2.main_document_id = ws1.main_document_id
)
)
) ORDER BY creation_date desc LIMIT 10;
On peut constater en lancant la requete sur une base vide (demo) , un temps d'exécution de 600ms. Le temps n'a pas pu être déterminé sur l'instance du client car la requête n'aboutit pas.
Une requête optimisée corrigeait le problème avec un temps d'exécution de 100 ms, par exemple :
WITH relevant_users AS (
SELECT $val AS id
UNION
SELECT id FROM users WHERE substitute = $val
)
, min_orders AS (
SELECT main_document_id, MIN("order") as min_order
FROM workflows
WHERE process_date IS NULL
GROUP BY main_document_id
)
SELECT d.id, d.title, d.reference, d.typist, d.status, count(1) OVER()
FROM main_documents d
JOIN workflows ws1 ON d.id = ws1.main_document_id
LEFT JOIN min_orders mo ON ws1.main_document_id = mo.main_document_id
WHERE d.typist = $val
OR (ws1.process_date IS NOT NULL AND ws1.user_id = $val)
OR (ws1.user_id IN (SELECT id FROM relevant_users) AND ws1."order" = mo.min_order)
ORDER BY d.creation_date DESC
LIMIT 10;
Actions