Commit 04478594 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Refonte de ColumnValueFilter

parent 029545b0
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -89,9 +89,9 @@ return [
                    // - 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' => '']],
                    //    //['name' => SameColumnValueFilter::class, 'params' => ['column' => 'nomUsuel', 'source_column' => 'nomPatronymique']],
                    //    //['name' => ConcatColumnValueFilter::class, 'params' => ['column' => 'libelleLong', 'columns' => ['code','libelleLong']]],
                    //    //['name' => ConcatColumnValueFilter::class, 'params' => ['column' => 'libelleLong', 'columns' => ['code',': ','libelleLong'], 'separator' => '']],
                    //],

                    // Filtres à appliquer pour transformer des valeurs de colonnes/attributs issues de la source
@@ -99,7 +99,8 @@ return [
                    // Tableau ordonné de services ou de classes implémentant obligatoirement l'interface
                    // {@see \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface}.
                    'column_value_filter' => [
                        // ['name' => ToLowercaseColumnValueFilter::class, 'params' => ['columns' => ['code']]]
                        // ['name' => ToLowercaseColumnValueFilter::class, 'params' => ['column' => 'code']],
                        // ['name' => SameColumnValueFilter::class, 'params' => ['column' => 'nomUsuel', 'source_column' => 'nomPatronymique']],
                    ],

                    // Spécification du filtre à utiliser pour transformer chaque nom de colonne/attribut source en
+1 −1
Original line number Diff line number Diff line
@@ -189,7 +189,7 @@ class Destination implements DestinationInterface

    public function getColumnValueFilter(): array
    {
        return $this->config->get('column_value_filter');
        return $this->config->get('column_value_filter', []);
    }

    public function getIdColumnStrategy(): ?string
+14 −5
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ use RuntimeException;
use stdClass;
use UnicaenDbImport\Config\ConfigException;
use UnicaenDbImport\Connection\ApiConnection;
use UnicaenDbImport\Connection\NoConnection;
use UnicaenDbImport\Filter\ColumnName\ColumnNameFilterInterface;
use UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface;

@@ -147,7 +148,7 @@ class Source implements SourceInterface
     */
    public function getComputedColumns(): array
    {
        return $this->config->get('computed_columns');
        return $this->config->get('computed_columns', []);
    }

    /**
@@ -163,7 +164,7 @@ class Source implements SourceInterface
     */
    public function getColumnValueFilter() : array
    {
        return $this->config->get('column_value_filter');
        return $this->config->get('column_value_filter', []);
    }

    /**
@@ -233,7 +234,7 @@ class Source implements SourceInterface
        }

        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"))
            (new AssertionChain($computedColumns, "Un tableau contenant uniquement des " . ColumnValueFilterInterface::class . " est requis pour la clé facultative suivante: $key"))
                ->isArray()
                ->all()
                ->isInstanceOf(ColumnValueFilterInterface::class);
@@ -252,9 +253,10 @@ class Source implements SourceInterface
                ->string();

        $conn = $this->config->get($key = 'connection');
        if (! $conn instanceof DbConnection && ! $conn instanceof ApiConnection) {
        if (! $conn instanceof DbConnection && ! $conn instanceof ApiConnection && ! $conn instanceof NoConnection) {
            throw new InvalidArgumentException(
                "Une instance de " . DbConnection::class . " ou de " . ApiConnection::class . " est requise pour la clé suivante: $key",
                "Une instance de l'une des classes suivantes est requise pour la clé '$key' : " .
                implode(', ', [DbConnection::class, ApiConnection::class, NoConnection::class]),
                0, null, null
            );
        }
@@ -263,6 +265,13 @@ class Source implements SourceInterface
            ->notEmpty()
            ->string();

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

        if ($this->config->offsetExists($key = 'extra')) {
            (new AssertionChain($this->config->get($key), "Un tableau est requis pour la clé suivante: $key"))
                ->isArray();
+11 −5
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ interface ColumnValueFilterInterface extends FilterInterface
    public function __toString(): string;

    /**
     * Spécifie le nom de la colonne/attribut dont on veut transformer la valeur.
     * Spécifie le nom de la colonne/attribut dont on veut calculer/transformer la valeur.
     *
     * @param string $column Nom de colonne/attribut
     */
@@ -34,10 +34,16 @@ interface ColumnValueFilterInterface extends FilterInterface
    public function setParams(array $params): void;

    /**
     * Retourne la valeur transformée.
     * Transforme la valeur de la colonne/attribut dans les données spécifiées.
     *
     * @param mixed $value Valeur de colonne/attribut à transformer
     * @return mixed Valeur transformée
     * @param array $value Ex: ['code' => 'UMR6211', ...] avec {@see $column} = 'code'
     * @return array Ex: ['code' => 'UCN::UMR6211', ...]
     */
    public function filter($value);
    /**
     * Transforme la valeur de la colonne/attribut dans les données spécifiées.
     *
     * @param array $value Ligne possédant la colonne/attribut dont la valeur doit être transformée
     * @return mixed Ligne après transformation
     */
    public function filter($value): array;
}
 No newline at end of file
+10 −8
Original line number Diff line number Diff line
@@ -16,9 +16,10 @@ class ConcatColumnValueFilter extends AbstractColumnValueFilter

    public function __toString(): string
    {
        return sprintf("Concaténation des valeurs de %s (séparées par '%s')",
        return sprintf("Concaténation des valeurs des colonnes %s (séparées par '%s') dans la colonne %s",
            implode (', ', array_map(fn($c) => "'$c'", $this->columns)),
            $this->separator
            $this->separator,
            $this->column
        );
    }

@@ -34,17 +35,16 @@ class ConcatColumnValueFilter extends AbstractColumnValueFilter
        parent::setParams($params);
    }

    /**
     * @param array $value Ligne de données
     * @return mixed Valeur de la colonne/attibut calculée
     */
    public function filter($value): string
    public function filter($value): array
    {
        if (!is_array($value)) {
            throw new InvalidArgumentException("Les données reçues ne sont pas un tableau");
        }
        if (!array_key_exists($this->column, $value)) {
            throw new InvalidArgumentException("La colonne '$this->column' est introuvable dans les données reçues");
        }

        return implode(
        $value[$this->column] = implode(
            $this->separator,
            array_map(
                function($column) use ($value) {
@@ -57,5 +57,7 @@ class ConcatColumnValueFilter extends AbstractColumnValueFilter
                $this->columns
            )
        );

        return $value;
    }
}
 No newline at end of file
Loading