Loading CHANGELOG.md +1 −0 Original line number Diff line number Diff line Loading @@ -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'. Loading config/unicaen-db-import.global.php.dist +16 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ namespace Application; use UnicaenDbImport\Entity\Db\Source; use UnicaenDbImport\Filter\ColumnValue\ConcatColumnValueFilter; use UnicaenDbImport\Filter\ColumnValue\SameColumnValueFilter; return [ 'import' => [ Loading Loading @@ -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 Loading src/UnicaenDbImport/Config/ConfigFactory.php +6 −4 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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; Loading Loading @@ -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) { Loading @@ -530,7 +532,7 @@ class ConfigFactory if ($filterInstance === NULL) { throw ConfigException::invalidValueForKey($key); } $filterInstances[] = $filterInstance; $filterInstances[$nameOrIndex] = $filterInstance; } return $filterInstances; Loading @@ -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); Loading @@ -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; Loading src/UnicaenDbImport/Domain/Source.php +19 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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} */ Loading Loading @@ -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']); } Loading Loading @@ -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) { Loading src/UnicaenDbImport/Domain/SourceInterface.php +8 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
CHANGELOG.md +1 −0 Original line number Diff line number Diff line Loading @@ -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'. Loading
config/unicaen-db-import.global.php.dist +16 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ namespace Application; use UnicaenDbImport\Entity\Db\Source; use UnicaenDbImport\Filter\ColumnValue\ConcatColumnValueFilter; use UnicaenDbImport\Filter\ColumnValue\SameColumnValueFilter; return [ 'import' => [ Loading Loading @@ -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 Loading
src/UnicaenDbImport/Config/ConfigFactory.php +6 −4 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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; Loading Loading @@ -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) { Loading @@ -530,7 +532,7 @@ class ConfigFactory if ($filterInstance === NULL) { throw ConfigException::invalidValueForKey($key); } $filterInstances[] = $filterInstance; $filterInstances[$nameOrIndex] = $filterInstance; } return $filterInstances; Loading @@ -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); Loading @@ -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; Loading
src/UnicaenDbImport/Domain/Source.php +19 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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} */ Loading Loading @@ -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']); } Loading Loading @@ -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) { Loading
src/UnicaenDbImport/Domain/SourceInterface.php +8 −0 Original line number Diff line number Diff line Loading @@ -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