Commit 995b48e9 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Import : possibilité de spécifier des colonnes dont la valeur est calculée...

Import : possibilité de spécifier des colonnes dont la valeur est calculée (clé 'computed_columns').
parent 1a0646b7
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ Changelog
6.1.2
-----
- Ajout de la colonne IMPORT_OBSERV_RESULT.SOURCE_ID permettant de filtrer selon la source de données.
- Import : possibilité de spécifier des colonnes dont la valeur est calculée (clé 'computed_columns').
- Possibilité de spécifier la liste des attributs/colonnes de la Source dans la config (clé 'columns').
- Possibilité de spécifier un tableau de filtres dans la clé 'column_value_filter' d'une source ou destination (et plus seulement un filtre unique).
- Source : plus de mise en majuscules systématique de la 'source code column' et des 'columns'.
+16 −0
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@
namespace Application;

use UnicaenDbImport\Entity\Db\Source;
use UnicaenDbImport\Filter\ColumnValue\ConcatColumnValueFilter;
use UnicaenDbImport\Filter\ColumnValue\SameColumnValueFilter;

return [
    'import' => [
@@ -78,6 +80,20 @@ return [
                    // Si la clé est absente, tous les attributs/colonnes sont pris en compte.
                    //'columns' => [],

                    // Liste éventuelle des colonnes/attributs dont la valeur est calculée.
                    // Tableau associatif de services ou de classes implémentant obligatoirement l'interface
                    // {@see \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface} dont chaque clé est
                    // le nom de la colonne.
                    // Valeurs possibles pour chaque valeur associée à un nom de colonne :
                    // - string : nom de la colonne dont on veut reprendre la valeur (duplication) ;
                    // - tableau associatif spécifiant le filtre et paramètres de génération de la valeur.
                    //'computed_columns' => [
                    //    'sourceCode' => 'code', // la colonne calculée 'sourceCode' aura la même valeur que la colonne 'code'
                    //    //'libelleCourt' => ['name' => SameColumnValueFilter::class, 'params' => ['column' => 'code']],
                    //    //'libelleLong' => ['name' => ConcatColumnValueFilter::class, 'params' => ['columns' => ['code','libelleLong']]],
                    //    //'libelleLong' => ['name' => ConcatColumnValueFilter::class, 'params' => ['columns' => ['code',' : ','libelleLong'], 'separator' => '']],
                    //],

                    // 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
+6 −4
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@ use UnicaenDbImport\Domain\Synchro;
use UnicaenDbImport\Filter\ColumnName\ArrayMapColumnNameFilter;
use UnicaenDbImport\Filter\ColumnName\ColumnNameFilterInterface;
use UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface;
use UnicaenDbImport\Filter\ColumnValue\SameColumnValueFilter;

class ConfigFactory
{
@@ -318,6 +319,7 @@ class ConfigFactory
        $connectionName = $sourceConfig['connection'];
        $sourceConfig['connection'] = $this->getConnectionByName($connectionName);

        $sourceConfig['computed_columns'] = $this->getColumnValueFilterInstances($sourceConfig, 'computed_columns');
        $sourceConfig['column_value_filter'] = $this->getColumnValueFilterInstances($sourceConfig, 'column_value_filter');

        $columnNameFilter = $sourceConfig['column_name_filter'] ?? null;
@@ -521,7 +523,7 @@ class ConfigFactory
        $columnValueFilter = $sourceConfig[$key] ?? [];

        $filterInstances = [];
        foreach ((array) $columnValueFilter as $spec) {
        foreach ((array) $columnValueFilter as $nameOrIndex => $spec) {
            try {
                $filterInstance = $this->getFilterInstance($spec);
            } catch (ConfigException $e) {
@@ -530,7 +532,7 @@ class ConfigFactory
            if ($filterInstance === NULL) {
                throw ConfigException::invalidValueForKey($key);
            }
            $filterInstances[] = $filterInstance;
            $filterInstances[$nameOrIndex] = $filterInstance;
        }

        return $filterInstances;
@@ -554,9 +556,7 @@ class ConfigFactory
            }
            $filterInstance = $this->getFilterInstance($spec[$key]);
            $filterParams = $spec['params'] ?? [];
            if ($filterParams) {
            $filterInstance->setParams($filterParams);
            }
        } elseif (is_string($spec)) {
            if ($this->container->has($spec)) {
                $filterInstance = $this->container->get($spec);
@@ -568,6 +568,8 @@ class ConfigFactory
                if (!$filterInstance instanceof ColumnValueFilterInterface) {
                    throw ConfigException::invalidValue($spec, "instance de type " . ColumnValueFilterInterface::class);
                }
            } else {
                $filterInstance = new SameColumnValueFilter(['column' => $spec]);
            }
        } elseif ($spec instanceof ColumnValueFilterInterface) {
            $filterInstance = $spec;
+19 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ use stdClass;
use UnicaenDbImport\Config\ConfigException;
use UnicaenDbImport\Connection\ApiConnection;
use UnicaenDbImport\Filter\ColumnName\ColumnNameFilterInterface;
use UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface;

class Source implements SourceInterface
{
@@ -141,6 +142,14 @@ class Source implements SourceInterface
        $this->columns = $this->normalizeColumns($columns);
    }

    /**
     * {@inheritDoc}
     */
    public function getComputedColumns(): array
    {
        return $this->config->get('computed_columns');
    }

    /**
     * {@inheritDoc}
     */
@@ -223,6 +232,13 @@ class Source implements SourceInterface
                ->string();
        }

        if ($computedColumns = $this->config->get($key = 'computed_columns')) {
            (new AssertionChain($computedColumns, "Un tableau contenant uniquement des callable est requis pour la clé facultative suivante: $key"))
                ->isArray()
                ->all()
                ->isInstanceOf(ColumnValueFilterInterface::class);
        }

        if ($table && $select) {
            throw ConfigException::exclusiveKeys(['table', 'select']);
        }
@@ -263,6 +279,9 @@ class Source implements SourceInterface
    {
        $sourceCodeColumn = $this->getSourceCodeColumn();

        // colonnes calculées
        $columns = array_merge($columns, array_keys($this->getComputedColumns()));

        // application du filtre de transformation éventuel
        $columnNameFilter = $this->getColumnNameFilter();
        if ($columnNameFilter !== null) {
+8 −0
Original line number Diff line number Diff line
@@ -87,6 +87,14 @@ interface SourceInterface
     */
    public function setColumns(array $columns);

    /**
     * Retourne les éventuels colonnes/attributs dont la valeur est caclulée, au format suivant :
     * 'nom de la colonne/attribut calculée' => {@see \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface}.
     *
     * @return \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface[]
     */
    public function getComputedColumns(): array;

    /**
     * Retourne l'instance de filtre permettant de transformer un nom de colonne/attribut source
     * en un nom de colonne destination.
Loading