Projet

Général

Profil

Actions

Anomalie #26333

fermé

REVIEW - La recherche de documents n'aboutit pas pour certains utilisateurs

Ajouté par Etienne FAMERY il y a plus d'un an. Mis à jour il y a environ un an.

Statut:
R&D - Terminé
Priorité:
1-Majeur
Version cible:
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

Formats disponibles : Atom PDF