Commit 0dd85692 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Synchro dans le cas où les données sources sont susceptibles de contenir des...

Synchro dans le cas où les données sources sont susceptibles de contenir des doublons en terme de couple (source_id ; source_code) : possibilité spécifier un tri afin de ne retenir qu'une ligne parmi les doublons (clé ).
parent b785a499
Loading
Loading
Loading
Loading
+1 −0
Changes for CHANGELOG.md: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ Changelog

8.0.0
-----
- Synchro dans le cas où les données sources sont susceptibles de contenir des doublons en terme de couple (source_id ; source_code) : possibilité spécifier un tri afin de ne retenir qu'une ligne parmi les doublons (clé `duplicates_order_by`).
- Import : obtention des données sources via un Generator PHP (NB: la clé 'source' devient obligatoire dans la config de la source).
- Import/synchro : construit via un plugin manager ; introduction de l'héritage de config ; possibilité de spécifier la classe de l'Import/Synchro.
- Import depuis une API : possibilité d'injecter des attributs supplémentaires dans les données obtenues (via un select au format array contenant la clé 'columns').
+8 −0
Changes for config/unicaen-db-import.global.php.dist: 8 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -351,6 +351,14 @@ return [
                    // NB : les noms de colonnes/attributs utilisé ici sont ceux AVANT tranformation par les éventuelles
                    // transformations de noms de colonnes/attributs (clé 'column_name_filter').
                    //'where' => "TEM_OUV_DRT_SSO_PAY = 'N'",

                    // Uniquement dans le cas où les données sources sont susceptibles de contenir des doublons
                    // en terme de couple (source_id ; source_code), vous pouvez spécifier ici le tri qui permettra
                    // de placer en 1ere position la seule ligne qui vous intéresse parmi toutes les lignes ayant le
                    // même couple (source_id ; source_code) afin de ne retenir qu'elle.
                    // Exemple pour ne retenir que la ligne la plus récente parmi des données ayant une colonne
                    // histo_creation (date d'insertion dans la table) : 'histo_creation desc'.
                    //'duplicates_order_by' => 'histo_creation desc',
                ],

                // Configuration de la destination des données synchronisées
+15 −3
Changes for data/oracle.sql: 15 added lines, 3 removed lines.
Original line number Diff line number Diff line
------------------------------------------------------------------------------------------------------------------------
--                                         Bibliothèque unicaen/db-import
------------------------------------------------------------------------------------------------------------------------

-- NB : Objets à créer dans la base de données destination Oracle.


--
-- Table de déclaration des sources de données.
--
create table SOURCE
(
	ID NUMBER not null constraint SOURCE_PK primary key,
@@ -22,7 +32,9 @@ INSERT INTO SOURCE (ID, CODE, LIBELLE, IMPORTABLE) VALUES (1, 'app', 'Applicatio

/*
--
-- Ajout des colonnes SOURCE_ID et SOURCE_CODE dans une table destination.
-- Ajout des colonnes obigatoires SOURCE_ID et SOURCE_CODE dans une table destination.
--   NB : la contrainte d'unicité sur le couple (source_id, source_code) est souhaitable (mais si les doublons sont
--   inévitables dans les données sources, cf. paramètre de config 'duplicates_order_by').
--
alter table TABLE_DESTINATION add SOURCE_CODE VARCHAR2(64 char) not null; -- identifiant unique commun
alter table TABLE_DESTINATION add SOURCE_ID NUMBER not null;
@@ -30,7 +42,7 @@ alter table TABLE_DESTINATION add constraint TABLE_DESTINATION_SOURCE_FK foreign
create unique index TABLE_DESTINATION_SOURCE_CODE_UN on TABLE_DESTINATION(SOURCE_CODE);

--
-- Ajout des colonnes de gestion de l'historique dans une table destination.
-- Ajout des colonnes obligatoires pour la gestion de l'historique dans une table destination.
--
alter table TABLE_DESTINATION add CREATED_BY NUMBER not null;
alter table TABLE_DESTINATION add CREATED_ON DATE default SYSDATE not null;
@@ -45,7 +57,7 @@ alter table TABLE_DESTINATION add constraint TABLE_DESTINATION_HD_FK foreign key


--
-- Tables nécessaires pour l'observation de la synchro.
-- Tables nécessaires pour l'observation des synchros.
--
create table IMPORT_OBSERV (
    ID NUMBER not null constraint IMPORT_OBSERV_PK primary key,
+25 −16
Changes for data/postgresql.sql: 25 added lines, 16 removed lines.
Original line number Diff line number Diff line
------------------------------------------------------------------------------------------------------------------------
--                                         Bibliothèque unicaen/db-import
------------------------------------------------------------------------------------------------------------------------

-- NB : Objets à créer dans la base de données destination Postgresql.


--
-- Table des sources.
-- Table de déclaration des sources de données.
--
create table source
(
@@ -25,25 +32,27 @@ INSERT INTO SOURCE (CODE, LIBELLE, IMPORTABLE) VALUES ('app', 'Application', fal

/*
--
-- Ajout des colonnes SOURCE_ID et SOURCE_CODE dans une table destination.
-- Ajout des colonnes obigatoires SOURCE_ID et SOURCE_CODE dans une table destination.
--   NB : la contrainte d'unicité sur le couple (source_id, source_code) est souhaitable (mais si les doublons sont
--   inévitables dans les données sources, cf. paramètre de config 'duplicates_order_by').
--
alter table TABLE_DESTINATION add SOURCE_CODE VARCHAR(64) not null; -- identifiant unique commun
alter table TABLE_DESTINATION add SOURCE_ID INTEGER not null;
alter table TABLE_DESTINATION add constraint TABLE_DESTINATION_SOURCE_FK foreign key (SOURCE_ID) references SOURCE(ID) on delete cascade;
create unique index TABLE_DESTINATION_SOURCE_CODE_UN on TABLE_DESTINATION(SOURCE_CODE);
alter table table_destination add source_code varchar(64) not null; -- identifiant unique commun
alter table table_destination add source_id integer not null;
alter table table_destination add constraint table_destination_source_fk foreign key (source_id) references source(id);
create unique index table_destination_source_code_un on table_destination(source_id, source_code);

--
-- Ajout des colonnes de gestion de l'historique dans une table destination.
-- Ajout des colonnes obligatoires pour la gestion de l'historique dans une table destination.
--
alter table TABLE_DESTINATION add CREATED_BY INTEGER not null;
alter table TABLE_DESTINATION add CREATED_ON TIMESTAMP WITHOUT TIME ZONE default now() not null;
alter table TABLE_DESTINATION add UPDATED_BY INTEGER;
alter table TABLE_DESTINATION add UPDATED_ON TIMESTAMP WITHOUT TIME ZONE;
alter table TABLE_DESTINATION add DELETED_BY INTEGER;
alter table TABLE_DESTINATION add DELETED_ON TIMESTAMP WITHOUT TIME ZONE;
alter table TABLE_DESTINATION add constraint TABLE_DESTINATION_HC_FK foreign key (CREATED_BY) references UTILISATEUR(ID) on delete cascade;
alter table TABLE_DESTINATION add constraint TABLE_DESTINATION_HM_FK foreign key (UPDATED_BY) references UTILISATEUR(ID) on delete cascade;
alter table TABLE_DESTINATION add constraint TABLE_DESTINATION_HD_FK foreign key (DELETED_BY) references UTILISATEUR(ID) on delete cascade;
alter table table_destination add created_by integer not null;
alter table table_destination add created_on timestamp without time zone default now() not null;
alter table table_destination add updated_by integer;
alter table table_destination add updated_on timestamp without time zone;
alter table table_destination add deleted_by integer;
alter table table_destination add deleted_on timestamp without time zone;
alter table table_destination add constraint table_destination_hc_fk foreign key (created_by) references utilisateur(id);
alter table table_destination add constraint table_destination_hm_fk foreign key (updated_by) references utilisateur(id);
alter table table_destination add constraint table_destination_hd_fk foreign key (deleted_by) references utilisateur(id);
*/


+24 −41
Changes for src/UnicaenDbImport/CodeGenerator/CodeGenerator.php: 24 added lines, 41 removed lines.
Original line number Diff line number Diff line
@@ -4,7 +4,6 @@ namespace UnicaenDbImport\CodeGenerator;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Generator;
use InvalidArgumentException;
use RuntimeException;
use UnicaenDbImport\CodeGenerator\Helper\LogTableHelper;
use UnicaenDbImport\CodeGenerator\Helper\TableHelper;
@@ -24,25 +23,10 @@ abstract class CodeGenerator implements CodeGeneratorInterface
{
    use ConfigAwareTrait;

    /**
     * @var AbstractPlatform
     */
    protected $platform;

    /**
     * @var TableHelper
     */
    protected $tableHelper;

    /**
     * @var TableValidationHelper
     */
    protected $tableValidationHelper;

    /**
     * @var LogTableHelper
     */
    protected $logTableHelper;
    protected AbstractPlatform $platform;
    protected TableHelper $tableHelper;
    protected TableValidationHelper $tableValidationHelper;
    protected LogTableHelper $logTableHelper;

    /**
     * @param TableHelper $tableHelper
@@ -340,13 +324,6 @@ abstract class CodeGenerator implements CodeGeneratorInterface
        return $this->tableHelper->generateDiffViewName($destinationTable);
    }

    /**
     * @param SourceInterface $source
     * @param DestinationInterface $destination
     * @param string $diffViewName
     * @param string|null $intermediateTable
     * @return string
     */
    public function generateSQLForDiffViewCreation(SourceInterface $source,
                                                   DestinationInterface $destination,
                                                   string $diffViewName,
@@ -358,6 +335,7 @@ abstract class CodeGenerator implements CodeGeneratorInterface
        $includeIdColumn = $destination->getIdColumnStrategy() === DestinationInterface::ID_STRATEGY_IDENTITY;
        $undeleteEnabledColumn = $destination->getUndeleteEnabledColumn();
        $updateOnDeletedEnabledColumn = $destination->getUpdateOnDeletedEnabledColumn();
        $duplicatesOrderBy = $source->getDuplicatesOrderBy();

        // les éventuelles colonnes d'historique dans les données sources seront écrasées :
        $columns = array_diff($columns, [
@@ -379,18 +357,15 @@ abstract class CodeGenerator implements CodeGeneratorInterface
            $columns,
            $includeIdColumn,
            $undeleteEnabledColumn,
            $updateOnDeletedEnabledColumn);
            $updateOnDeletedEnabledColumn,
            $duplicatesOrderBy);
    }

    /**
     * @param SourceInterface $source
     * @param DestinationInterface $destination
     * @return string
     */
    public function generateSQLForDiffViewSelect(SourceInterface $source, DestinationInterface $destination): string
    {
        $destinationTable = $destination->getTable();
        $sourceCodeColumn = $source->getSourceCodeColumn();
        $duplicatesOrderBy = $source->getDuplicatesOrderBy();
        $columns = $source->getColumns();
        $where = $destination->getWhere();
        $includeIdColumn = $destination->getIdColumnStrategy() === DestinationInterface::ID_STRATEGY_IDENTITY;
@@ -405,12 +380,15 @@ abstract class CodeGenerator implements CodeGeneratorInterface
            strtolower($c = $this->config->getHistoColumnAliasForDeletedBy()), strtoupper($c),
        ]);

        return $this->tableHelper->generateSQLForDiffViewSelect($destinationTable, $sourceCodeColumn, $columns, $where, $includeIdColumn);
        return $this->tableHelper->generateSQLForDiffViewSelect(
            $destinationTable,
            $sourceCodeColumn,
            $columns,
            $where,
            $includeIdColumn,
            $duplicatesOrderBy);
    }

    /**
     * @inheritDoc
     */
    public function generateSQLForDestinationUpdate(
        string               $operation,
        SourceInterface      $source,
@@ -421,6 +399,7 @@ abstract class CodeGenerator implements CodeGeneratorInterface
        $idColumnSequence = $destination->getIdColumnSequence();
        $where = $destination->getWhere();
        $sourceCodeColumn = $source->getSourceCodeColumn();
        $duplicatesOrderBy = $source->getDuplicatesOrderBy();
        $columns = $source->getColumns();

        // les éventuelles colonnes d'historique dans les données sources seront écrasées :
@@ -441,28 +420,32 @@ abstract class CodeGenerator implements CodeGeneratorInterface
                        $columns,
                        $where,
                        $idColumnStrategy,
                        $idColumnSequence);
                        $idColumnSequence,
                        $duplicatesOrderBy);
                break;
            case Operation::OPERATION_UPDATE;
                $sql = $this->tableHelper->generateSQLForUpdateOperationInDestinationTable(
                        $destinationTable,
                        $sourceCodeColumn,
                        $columns,
                        $where);
                        $where,
                        $duplicatesOrderBy);
                break;
            case Operation::OPERATION_DELETE;
                $sql = $this->tableHelper->generateSQLForDeleteOperationInDestinationTable(
                        $destinationTable,
                        $sourceCodeColumn,
                        $columns,
                        $where);
                        $where,
                        $duplicatesOrderBy);
                break;
            case Operation::OPERATION_UNDELETE;
                $sql = $this->tableHelper->generateSQLForUndeleteOperationInDestinationTable(
                        $destinationTable,
                        $sourceCodeColumn,
                        $columns,
                        $where);
                        $where,
                        $duplicatesOrderBy);
                break;
            default:
                throw new RuntimeException("Opération inattendue");
Loading