Migration vers ToPIA 3.0 - ordered vs indexed

Vous devez migrer votre modèle zargo depuis la beta-3 suite à une confusion entre ordered et indexed (stéréotypes à placer sur une association-end d’un lien entre deux entités).

  • Le stéréotype “indexed” est déprécié, vous devez le remplacer par l’attribut “ordered”
  • L’attribut (ou le stéréotype) “ordered” maintient l’ordre d’insertion en base, il faut donc vous assurer qu’une colonne _idx est bien présente dans la base de donnée et au besoin écrire la migration nécessaire (voir ci- dessous) pour ajouter la colonne et fixer les indexes manquants (en commençant à 0).
  • Les types des collections générées ont changé afin d’utiliser un contrat plus proche du modèle (selon la présence des stéréotypes “unique” et/ou “ordered”).

Dans ToPIA 2, la tagValue “ordered” (ou cocher “ordering” dans zargo) faisait simplement en sorte d’utiliser List<> plutôt que Collection<> dans le Bean de l’entité générée. L’ordre n’était pas conservé en base. Pour migrer à ToPIA 3, soit vous considérez que l’ordre n’était finalement pas important et vous devez supprimer la tagValue (sinon, il y aura des erreurs à l’exécution pour cause de colonne d’index manquante), soit vous la conserver mais vous devez écrire une migration pour rajouter les colonnes index manquantes.

Exemples de scripts de migration SQL

Cas simple d’une relation 1..n

--
-- relation is :   Car -----[*]- Tyre
--

-- Add index to be able to order tyres
ALTER TABLE tyre ADD COLUMN car_idx integer;

-- Generate unique car_idx according to topiaCreateDate and topiaId
UPDATE tyre SET car_idx = (
    SELECT COUNT(topiaId)
    FROM tyre t
    WHERE t.car = tyre.car
    AND (t.topiaCreateDate || t.topiaId) < (tyre.topiaCreateDate || tyre.topiaId)
);

Cas d’une relation 1..n vers une entité abstraite

Note : cela n’est nécessaire que pour la stratégie d’héritage union-subclass.

--
-- relation is :   Person -----[*]- Pet (abstract)
--                                   ^
--                                   |
--                              -----------
--                              |         |
--                             Cat       Dog
--

-- create a temporary table to be able to orders cats and dogs
CREATE TABLE person_to_pet_tmp (
    person              character varying(255) NOT NULL,
    type                character varying(255) NOT NULL,
    petTopiaId          character varying(255) NOT NULL,
    petTopiaCreateDate  timestamp without time zone,
    person_idx          integer
);

-- populate table with cats
INSERT INTO person_to_pet_tmp (person, type, petTopiaId, petTopiaCreateDate)
SELECT person, 'cat', topiaId, topiaCreateDate FROM cat;

-- populate table with dogs
INSERT INTO person_to_pet_tmp (person, type, petTopiaId, petTopiaCreateDate)
SELECT person, 'dog', topiaId, topiaCreateDate FROM dog;

-- compute index for cats and dogs together
UPDATE person_to_pet_tmp SET person_idx = (
    SELECT COUNT(ptpt.person)
    FROM person_to_pet_tmp ptpt
    WHERE ptpt.person = person_to_pet_tmp.person
    AND (ptpt.petTopiaCreateDate || ptpt.petTopiaId) < (person_to_pet_tmp.petTopiaCreateDate || person_to_pet_tmp.petTopiaId)
);

-- add index to be able to order cats
ALTER TABLE cat ADD COLUMN person_idx integer;

-- add indexes to cats
UPDATE cat SET person_idx = (
    SELECT person_idx
    FROM person_to_pet_tmp ptpt
    WHERE ptpt.petTopiaId = cat.topiaId
);

-- add index to be able to order dogs
ALTER TABLE dog ADD COLUMN person_idx integer;

-- add indexes to dogs
UPDATE dog SET person_idx = (
    SELECT person_idx
    FROM person_to_pet_tmp ptpt
    WHERE ptpt.petTopiaId = dog.topiaId
);

-- remove temporary table
DROP TABLE person_to_pet_tmp;