Commit 6fa5e6d0 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Possibilité de spécifier la liste des attributs/colonnes de la Source dans la...

Possibilité de spécifier la liste des attributs/colonnes de la Source dans la config (clé 'columns').
parent fc1fe290
Loading
Loading
Loading
Loading
+11 −1
Changes for config/unicaen-db-import.global.php.dist: 11 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -72,12 +72,22 @@ return [
                    // Complément de l'URL de l'API permettant l'interrogation des données
                    'select' => '/regions?fields=nom,code',

                    // Nom de l'attribut dans les données source contenant l'identifiant unique
                    // Nom de l'attribut ou colonne discriminant·e dans les données source, contenant l'identifiant unique.
                    'source_code_column' => 'code',

                    // Taille des pages de données demandée à l'API (si supportée par l'API)
                    //'page_size'          => 20,

                    // Liste exhaustive éventuelle des seuls attributs/colonnes qui nous intéressent dans la source.
                    // Si la clé est absente, tous les attributs/colonnes sont pris en compte.
                    //'columns' => [],

                    // Filtres à appliquer pour transformer des valeurs de colonnes/attributs issues de la source
                    // en nouvelles valeurs de colonnes destination.
                    // Tableau ordonné de services ou de classes implémentant obligatoirement l'interface
                    // {@see \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface}.
                    'column_value_filter' => [],

                    // Spécification du filtre à utiliser pour transformer chaque nom de colonne/attribut source en
                    // le nom de la colonne dans la table destination. Valeurs possibles :
                    // - array : un filtre de type `\UnicaenDbImport\Filter\ColumnName\ArrayMapColumnNameFilter`
+23 −11
Changes for src/UnicaenDbImport/Domain/Source.php: 23 added lines, 11 removed lines.
Original line number Diff line number Diff line
@@ -53,6 +53,10 @@ class Source implements SourceInterface
    protected function __construct(array $config)
    {
        $this->config = new Parameters($config);

        if ($columns = $this->config->get('columns')) {
            $this->setColumns($columns);
        }
    }

    /**
@@ -130,6 +134,14 @@ class Source implements SourceInterface
        return array_map('strtoupper',$this->columns);
    }

    /**
     * {@inheritDoc}
     */
    public function setColumns(array $columns)
    {
        $this->columns = $this->normalizeColumns($columns);
    }

    /**
     * {@inheritDoc}
     */
@@ -154,14 +166,6 @@ class Source implements SourceInterface
        return $this->config->get('extra', []);
    }

    /**
     * {@inheritDoc}
     */
    public function setColumns(array $columns)
    {
        $this->columns = $this->normalizeColumns($columns);
    }

    /**
     * {@inheritDoc}
     */
@@ -190,7 +194,7 @@ class Source implements SourceInterface
     * @throws \Assert\InvalidArgumentException
     * @throws \UnicaenDbImport\Config\ConfigException
     */
    protected function validateConfig()
    protected function validateConfig(): void
    {
        (new AssertionChain($this->config->get($key = 'name'), "Une string non vide est requise pour la clé suivante: $key"))
            ->notEmpty()
@@ -212,6 +216,14 @@ class Source implements SourceInterface
                ->notEmpty()
                ->string();

        if ($this->config->offsetExists($key = 'columns')) {
            (new AssertionChain($this->config->get($key), "Un tableau non vide contenant uniquement des chaînes de caractères est requis pour la clé suivante: $key"))
                ->isArray()
                ->notEmpty()
                ->all()
                ->string();
        }

        if ($table && $select) {
            throw ConfigException::exclusiveKeys(['table', 'select']);
        }
@@ -258,13 +270,13 @@ class Source implements SourceInterface
            $columns = array_map([$columnNameFilter, 'filter'], $columns);
        }

        // recherche puis retrait de la "source code column"
        // recherche puis retrait de la "source code column" (colonne discriminante)
        if (is_int($index = array_search(strtolower($sourceCodeColumn), $columns)) ||
            is_int($index = array_search(strtoupper($sourceCodeColumn), $columns))) {
            unset($columns[$index]);
        } else {
            throw new RuntimeException(
                "La colonne de référence '$sourceCodeColumn' est introuvable dans les colonnes de la source");
                "La colonne ou l'attribut de référence '$sourceCodeColumn' est introuvable dans les colonnes/attributs de la source");
        }

        // la source ne peut pas comporter de colonne nommée comme l'une des colonnes d'historique
+6 −1
Changes for src/UnicaenDbImport/Service/Facade/AbstractFacadeService.php: 6 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -165,8 +165,13 @@ abstract class AbstractFacadeService
     * @see SourceInterface::getColumns()
     * @see SourceInterface::getData()
     */
    public function discoverSourceColumns()
    public function discoverSourceColumns(): void
    {
        // la liste des attributs/colonnes peut avoir été fournie dès la config
        if ($this->source->getColumns()) {
            return;
        }

        $data = $this->source->getData();

        if (count($data) > 0) {
+4 −0
Changes for view/unicaen-db-import/partial/source-dl.phtml: 4 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -18,6 +18,10 @@ use UnicaenDbImport\Utils;
    <dd class="col-md-8"><?php echo $source->getTable() ?: $source->getSelect(); ?></dd>
    <dt class="col-md-4">Where</dt>
    <dd class="col-md-8"><?php echo $source->getWhere() ?: '-'; ?></dd>
    <?php if ($columns = $source->getColumns()): ?>
    <dt class="col-md-4">Colonnes (sans colonne discriminante)</dt>
    <dd class="col-md-8"><?php echo implode(', ', $columns); ?></dd>
    <?php endif ?>
    <dt class="col-md-4">Colonne discriminante</dt>
    <dd class="col-md-8"><?php echo $source->getSourceCodeColumn(); ?></dd>
    <dt class="col-md-4">Column Value Filter</dt>