Skip to content
Snippets Groups Projects
Commit e04dc9dd authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Refonte de ColumnValueFilter

parent 7123469c
No related branches found
No related tags found
No related merge requests found
Pipeline #33175 failed
...@@ -89,9 +89,9 @@ return [ ...@@ -89,9 +89,9 @@ return [
// - tableau associatif spécifiant le filtre et paramètres de génération de la valeur. // - tableau associatif spécifiant le filtre et paramètres de génération de la valeur.
//'computed_columns' => [ //'computed_columns' => [
// 'sourceCode' => 'code', // la colonne calculée 'sourceCode' aura la même valeur que la colonne 'code' // 'sourceCode' => 'code', // la colonne calculée 'sourceCode' aura la même valeur que la colonne 'code'
// //'libelleCourt' => ['name' => SameColumnValueFilter::class, 'params' => ['column' => 'code']], // //['name' => SameColumnValueFilter::class, 'params' => ['column' => 'nomUsuel', 'source_column' => 'nomPatronymique']],
// //'libelleLong' => ['name' => ConcatColumnValueFilter::class, 'params' => ['columns' => ['code','libelleLong']]], // //['name' => ConcatColumnValueFilter::class, 'params' => ['column' => 'libelleLong', 'columns' => ['code','libelleLong']]],
// //'libelleLong' => ['name' => ConcatColumnValueFilter::class, 'params' => ['columns' => ['code',' : ','libelleLong'], 'separator' => '']], // //['name' => ConcatColumnValueFilter::class, 'params' => ['column' => 'libelleLong', 'columns' => ['code',': ','libelleLong'], 'separator' => '']],
//], //],
// Filtres à appliquer pour transformer des valeurs de colonnes/attributs issues de la source // Filtres à appliquer pour transformer des valeurs de colonnes/attributs issues de la source
...@@ -99,7 +99,8 @@ return [ ...@@ -99,7 +99,8 @@ return [
// Tableau ordonné de services ou de classes implémentant obligatoirement l'interface // Tableau ordonné de services ou de classes implémentant obligatoirement l'interface
// {@see \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface}. // {@see \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface}.
'column_value_filter' => [ '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 // Spécification du filtre à utiliser pour transformer chaque nom de colonne/attribut source en
......
...@@ -189,7 +189,7 @@ class Destination implements DestinationInterface ...@@ -189,7 +189,7 @@ class Destination implements DestinationInterface
public function getColumnValueFilter(): array public function getColumnValueFilter(): array
{ {
return $this->config->get('column_value_filter'); return $this->config->get('column_value_filter', []);
} }
public function getIdColumnStrategy(): ?string public function getIdColumnStrategy(): ?string
......
...@@ -10,6 +10,7 @@ use RuntimeException; ...@@ -10,6 +10,7 @@ use RuntimeException;
use stdClass; use stdClass;
use UnicaenDbImport\Config\ConfigException; use UnicaenDbImport\Config\ConfigException;
use UnicaenDbImport\Connection\ApiConnection; use UnicaenDbImport\Connection\ApiConnection;
use UnicaenDbImport\Connection\NoConnection;
use UnicaenDbImport\Filter\ColumnName\ColumnNameFilterInterface; use UnicaenDbImport\Filter\ColumnName\ColumnNameFilterInterface;
use UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface; use UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface;
...@@ -147,7 +148,7 @@ class Source implements SourceInterface ...@@ -147,7 +148,7 @@ class Source implements SourceInterface
*/ */
public function getComputedColumns(): array public function getComputedColumns(): array
{ {
return $this->config->get('computed_columns'); return $this->config->get('computed_columns', []);
} }
/** /**
...@@ -163,7 +164,7 @@ class Source implements SourceInterface ...@@ -163,7 +164,7 @@ class Source implements SourceInterface
*/ */
public function getColumnValueFilter() : array 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 ...@@ -233,7 +234,7 @@ class Source implements SourceInterface
} }
if ($computedColumns = $this->config->get($key = 'computed_columns')) { 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() ->isArray()
->all() ->all()
->isInstanceOf(ColumnValueFilterInterface::class); ->isInstanceOf(ColumnValueFilterInterface::class);
...@@ -252,9 +253,10 @@ class Source implements SourceInterface ...@@ -252,9 +253,10 @@ class Source implements SourceInterface
->string(); ->string();
$conn = $this->config->get($key = 'connection'); $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( 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 0, null, null
); );
} }
...@@ -263,6 +265,13 @@ class Source implements SourceInterface ...@@ -263,6 +265,13 @@ class Source implements SourceInterface
->notEmpty() ->notEmpty()
->string(); ->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')) { if ($this->config->offsetExists($key = 'extra')) {
(new AssertionChain($this->config->get($key), "Un tableau est requis pour la clé suivante: $key")) (new AssertionChain($this->config->get($key), "Un tableau est requis pour la clé suivante: $key"))
->isArray(); ->isArray();
......
...@@ -20,7 +20,7 @@ interface ColumnValueFilterInterface extends FilterInterface ...@@ -20,7 +20,7 @@ interface ColumnValueFilterInterface extends FilterInterface
public function __toString(): string; 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 * @param string $column Nom de colonne/attribut
*/ */
...@@ -34,10 +34,16 @@ interface ColumnValueFilterInterface extends FilterInterface ...@@ -34,10 +34,16 @@ interface ColumnValueFilterInterface extends FilterInterface
public function setParams(array $params): void; 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 * @param array $value Ex: ['code' => 'UMR6211', ...] avec {@see $column} = 'code'
* @return mixed Valeur transformée * @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
...@@ -16,9 +16,10 @@ class ConcatColumnValueFilter extends AbstractColumnValueFilter ...@@ -16,9 +16,10 @@ class ConcatColumnValueFilter extends AbstractColumnValueFilter
public function __toString(): string 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)), implode (', ', array_map(fn($c) => "'$c'", $this->columns)),
$this->separator $this->separator,
$this->column
); );
} }
...@@ -34,17 +35,16 @@ class ConcatColumnValueFilter extends AbstractColumnValueFilter ...@@ -34,17 +35,16 @@ class ConcatColumnValueFilter extends AbstractColumnValueFilter
parent::setParams($params); parent::setParams($params);
} }
/** public function filter($value): array
* @param array $value Ligne de données
* @return mixed Valeur de la colonne/attibut calculée
*/
public function filter($value): string
{ {
if (!is_array($value)) { if (!is_array($value)) {
throw new InvalidArgumentException("Les données reçues ne sont pas un tableau"); 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, $this->separator,
array_map( array_map(
function($column) use ($value) { function($column) use ($value) {
...@@ -57,5 +57,7 @@ class ConcatColumnValueFilter extends AbstractColumnValueFilter ...@@ -57,5 +57,7 @@ class ConcatColumnValueFilter extends AbstractColumnValueFilter
$this->columns $this->columns
) )
); );
return $value;
} }
} }
\ No newline at end of file
...@@ -7,20 +7,42 @@ use InvalidArgumentException; ...@@ -7,20 +7,42 @@ use InvalidArgumentException;
class SameColumnValueFilter extends AbstractColumnValueFilter class SameColumnValueFilter extends AbstractColumnValueFilter
{ {
/** /**
* Colonne/attribut existante dont on prendra la valeur pour générer la valeur de la colonne/attribut calculée. * Colonne/attribut existante dont on écrasera la valeur avec celle de la colonne/attribut source.
*/ */
protected string $column; protected string $column;
/**
* Colonne/attribut source existante dont on prendra la valeur.
*/
private string $sourceColumn;
public function __toString(): string public function __toString(): string
{ {
return sprintf("Même valeur que '%s'", $this->column); return sprintf(
"Colonne '%s' = colonne '%s'",
$this->column,
$this->sourceColumn,
);
}
public function setParams(array $params): void
{
if (array_key_exists('source_column', $params)) {
$this->setSourceColumn($params['source_column']);
}
parent::setParams($params);
} }
/** /**
* @param array $value Ligne de données * Spécifie la colonne/attribut source dont on prendra la valeur.
* @return mixed Valeur de la colonne/attibut calculée
*/ */
public function filter($value): mixed public function setSourceColumn(string $sourceColumn): void
{
$this->sourceColumn = $sourceColumn;
}
public function filter($value): array
{ {
if (!is_array($value)) { if (!is_array($value)) {
throw new InvalidArgumentException("Les données reçues ne sont pas un tableau"); throw new InvalidArgumentException("Les données reçues ne sont pas un tableau");
...@@ -28,7 +50,12 @@ class SameColumnValueFilter extends AbstractColumnValueFilter ...@@ -28,7 +50,12 @@ class SameColumnValueFilter extends AbstractColumnValueFilter
if (!array_key_exists($this->column, $value)) { if (!array_key_exists($this->column, $value)) {
throw new InvalidArgumentException("La colonne suivante est introuvable dans les données reçues : " . $this->column); throw new InvalidArgumentException("La colonne suivante est introuvable dans les données reçues : " . $this->column);
} }
if (!array_key_exists($this->sourceColumn, $value)) {
throw new InvalidArgumentException("La colonne source suivante est introuvable dans les données reçues : " . $this->column);
}
$value[$this->column] = $value[$this->sourceColumn];
return $value[$this->column]; return $value;
} }
} }
\ No newline at end of file
...@@ -301,7 +301,7 @@ class DatabaseService extends AbstractDatabaseService ...@@ -301,7 +301,7 @@ class DatabaseService extends AbstractDatabaseService
private function appendSourceComputedColumns(array &$row): void private function appendSourceComputedColumns(array &$row): void
{ {
foreach ($this->source->getComputedColumns() as $computedColumnName => $filter) { foreach ($this->source->getComputedColumns() as $computedColumnName => $filter) {
$row[$computedColumnName] = $filter->filter($row); $row = $filter->filter($row);
} }
} }
...@@ -314,9 +314,7 @@ class DatabaseService extends AbstractDatabaseService ...@@ -314,9 +314,7 @@ class DatabaseService extends AbstractDatabaseService
$columnValueFilters = $this->source->getColumnValueFilter(); $columnValueFilters = $this->source->getColumnValueFilter();
foreach ($columnValueFilters as $filter) { foreach ($columnValueFilters as $filter) {
$filter->setParams($this->source->getExtra()); $filter->setParams($this->source->getExtra());
foreach ($columnsValues as $columnName => $columnValue) { $columnsValues = $filter->filter($columnsValues);
$columnsValues[$columnName] = $filter->setColumn($columnName)->filter($columnValue);
}
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment