Project

General

Profile

Fonctionnalité #18094

Recherche par agent SEDA 2

Added by Cyril VAZQUEZ 5 months ago. Updated 12 days ago.

Status:
Rejeté
Priority:
1-Majeur
Assignee:
Target version:
Start date:
08/24/2021
Due date:
09/21/2021
Tags RM:
Sprint (itération):

Description

En tant que service demandeur d'archives, je veux rechercher les unités d'archives selon les informations d'un agent présent dans les métadonnées descriptives afin de retrouver les contenus liés à un agent.

Détail
Le SEDA 2 a introduit la structure Agent pour rattacher des personnes ou organismes à la description des unités d'archive, avec des rôles prédéfinis (destinataire, rédacteur, émetteur, etc...)
Le SEDA 2.2 ajoutera un agent "générique" et utilisera la notion de rôle pour définir la relation avec le contenu décrit.

Ces structures sont intégrées sous la forme de tableau d'objets agents.
Dans la version 2.7, la recherche n'est possible qu'en mode texte intégral, moins fiable que des index et des mots-clés, ce qui pose des problèmes lorsque l'agent est l'un des principaux critères métier discriminants (bulletins de salaire).

La demande est donc d'ajouter au moteur de recherche la gestion d'un critère "agent" avec la construction d'une requête dans le document descriptif, à la manière de ce qui est fait pour les mots-clés qui sont aussi un tableau d'objet.

Dans un premier temps, il est raisonnable par contre de restreindre à une seule ligne de critère (recherche un seul agent) pour ne pas complexifier le moteur et grever les performances.

Conditions d'acceptation
Le formulaire de recherche du registre des archives publiques comporte un bloc permettant de saisir tout ou partie des valeurs de propriétés d'un agent recherché (nom, prénom, date de naissance, fonction, rôle, identifiant...) à l'aide d'égalité stricte ou de termes approchants (joker)

Les critères des parties d'agent sont liés par un opérateur "ET"
Lorsque le rôle n'est pas précisé, la recherche est réalisée dans TOUS les agents liés (nommés en SEDA 2.1 ou générique "agent") avec un opérateur "OU".

En SEDA 1, l'usage de ce formulaire ne ramène aucun résultat (AND avec autres critères, sous peine de tout ramener si aucun autre critère)

History

#1 Updated by Cyril VAZQUEZ 5 months ago

Analyse d'impact et complexité :

Front

  • formulaire agent dans le registre
  • sérialisation JSON du formulaire :
{
  "agent": {
    "firstName": "Alain",
    "givenName" : "CONNU",
    "role" : "addressee"
  }
}

Back

Ajouter le critère "Agent" de type objet aux interfaces :
- ext/archivesPubliques/presentation/maarchRM/UserStory/archiveRetrieval/searchPublicArchiveInterface.php
- ext/archivesPubliques/bundle/archivesPubliques/contentInterface.php

Opportunité d'ajouter en tant que tableau (comme mots-clés) pour prévoir la fonction plus tard ?

Ajouter le code de construction du SQL dans le contrôleur :
- ext/archivesPubliques/bundle/archivesPubliques/Controller/content.php

Pour les fonctions find() et count(), ajouter le critère dans les paramètres.
Pour la fonction searchJson() construire le SQL spécifique :

    if (is_array($agent) && !empty($agent)) {
        // SEDA 2 and 2.1 named agent groups
        // New SEDA 2.2 agents will use 'role' attribute
        $namedAgents = ['authorizedAgent', 'writer', 'addressee', 'recipient', 'transmitter', 'sender'];
        $queryAgent = [];

        foreach ($agent as $agentObj) {
            if (isset($agentObj->role) && in_array($agentObj->role, $namedAgents)) {
                $properties = [$agentObj->role];
                unset($agentObj->role);
            } else {
                $properties = array_merge($namedAgents, ['agent']);
            }

            $queryAgentParts = [];
            foreach ($properties as $property) {
                $queryAgentPropertyParts = [];
                foreach ($agentObj as $name => $value) {
                    $queryAgentPropertyParts[] = '"description"->\''.$property.'\' @> \'[{"'.$name.'": "'.$value.'"}]\'';
                }
                $queryAgentParts[] = '('.implode (' AND ', $queryAgentPropertyParts).')';
            }

            $queryAgent[] = implode (' OR ', $queryAgentParts);
        }

        $queryParts['agent'] = '<?SQL ('.implode(' OR ', $queryAgent).') ?>';
    }

Pour la fonction searchTable renvoyer une requête fausse:

        if (is_array($agent) && !empty($agent)) {
            $queryParts['agent'] = '0=1';
        }

#3 Updated by Emmanuel DILLARD 5 months ago

  • Due date set to 09/21/2021

#4 Updated by Emmanuel DILLARD 5 months ago

  • Status changed from Prêt à développer (S) to En cours (S)
  • Sprint (itération) set to 210907

#5 Updated by Emmanuel DILLARD 4 months ago

  • Status changed from En cours (S) to Prêt à développer (S)
  • Priority changed from 0-Bloquant to 1-Majeur

#6 Updated by Emmanuel DILLARD 4 months ago

  • Sprint (itération) deleted (210907)

#7 Updated by Cyril VAZQUEZ about 1 month ago

  • Status changed from Prêt à développer (S) to En cours
  • Assignee set to Cyril VAZQUEZ
  • Target version changed from 2.8 to 2.8.1
  • Tags RM deleted (2.8.0)

Lié à transformation SIP conformément à modèle OAIS, autre demande #

#8 Updated by Cyril VAZQUEZ 12 days ago

  • Status changed from En cours to Rejeté

Rendu inutile par conversion AIP V3

Also available in: Atom PDF