Cette PR retire les restrictions d'utilisation de values pour qu'elles soient utilisables pour toutes les classes. En particulier, il n'y a plus besoin de clé d'unicité et on peut en renseigner pour une clé primaire composite.
Désormais, topmodel connaît officiellement la notion d'enum (ce n'est pas une nouvelle notion mais elle était totalement implicite avant). Une enum est une classe avec une clé primaire non composite (ou sans clé primaire si on ne veut pas qu'elle soit persistée) dont les values sont exhaustives, c'est-à-dire qu'elles contiennent l'ensemble des instances possibles de cette classe. Il faut donc au moins une value pour être une enum. topmodel considère par défaut qu'une telle classe est une enum si le domaine de la clé primaire (ou la propriété qui la remplace, soit la première propriété non composée de la classe) précise que ses valeurs ne sont pas auto-générées (autoGeneratedValue: false, ce qui est le défaut). C'était déjà le comportement actuel avant cette PR (sans nommer ça "enum"), mais il est maintenant possible de surcharger cette catégorisation en renseignant enum: true | false sur la classe. enum: true n'est évidemment possible que si la classe peut effectivement être une enum.
Dans la génération, l'impact de la catégorisation en enum se verra sur la clé primaire, qui pourra être générée comme une vraie enum (C#/Java si possible/configuré), comme une union des valeurs possibles (JS), ou bien simplement comme son type avec une liste de constantes à côté (fallback C#/Java). La aussi, c'est tout à fait ce que topmodel faisait déjà avant cette PR.
La notion d'enum n'a rien à voir avec le notion de reference. reference indique que la classe est une "liste de référence", ce qui une indication pour les générateurs afin qu'ils puissent décider d'ajouter des indications pour de la mise en cache des valeurs. En particulier, une reference peut être une enum, ou non, et une reference peut avoir des values, ou non.
Impacts sur la génération
[C#] On ne génère plus de constantes pour les values avec PK autogénérée sur la clé d'unicité (puisqu'elle n'est plus demandée)
[C#] L'annotation DefaultProperty n'est désormais placée sur sur les classes reference.
[JS] Dans references.ts :
Ne génère plus de type pour la PK si la classe n'est pas une enum (le type était auparavant un alias inutile vers le type de la PK)
Ne génère plus de définition de référence (le type + l'objet {valueKey, labelKey} ou la liste des valeurs) si la classe n'est pas une reference
(Dans references.ts, on met toutes les enums, ainsi que les references dont la PK n'est pas autogénérée. Toutes les autres classes ont leur fichier de définition d'entité. C'est déjà ce qu'on faisait, mais moins explicitement.)
Fix #206
Cette PR retire les restrictions d'utilisation de
values
pour qu'elles soient utilisables pour toutes les classes. En particulier, il n'y a plus besoin de clé d'unicité et on peut en renseigner pour une clé primaire composite.Désormais, topmodel connaît officiellement la notion d'enum (ce n'est pas une nouvelle notion mais elle était totalement implicite avant). Une enum est une classe avec une clé primaire non composite (ou sans clé primaire si on ne veut pas qu'elle soit persistée) dont les
values
sont exhaustives, c'est-à-dire qu'elles contiennent l'ensemble des instances possibles de cette classe. Il faut donc au moins unevalue
pour être une enum. topmodel considère par défaut qu'une telle classe est une enum si le domaine de la clé primaire (ou la propriété qui la remplace, soit la première propriété non composée de la classe) précise que ses valeurs ne sont pas auto-générées (autoGeneratedValue: false
, ce qui est le défaut). C'était déjà le comportement actuel avant cette PR (sans nommer ça "enum"), mais il est maintenant possible de surcharger cette catégorisation en renseignantenum: true | false
sur la classe.enum: true
n'est évidemment possible que si la classe peut effectivement être une enum.Dans la génération, l'impact de la catégorisation en enum se verra sur la clé primaire, qui pourra être générée comme une vraie enum (C#/Java si possible/configuré), comme une union des valeurs possibles (JS), ou bien simplement comme son type avec une liste de constantes à côté (fallback C#/Java). La aussi, c'est tout à fait ce que topmodel faisait déjà avant cette PR.
La notion d'
enum
n'a rien à voir avec le notion dereference
.reference
indique que la classe est une "liste de référence", ce qui une indication pour les générateurs afin qu'ils puissent décider d'ajouter des indications pour de la mise en cache des valeurs. En particulier, unereference
peut être uneenum
, ou non, et unereference
peut avoir desvalues
, ou non.Impacts sur la génération
DefaultProperty
n'est désormais placée sur sur les classesreference
.[JS] Dans
references.ts
:enum
(le type était auparavant un alias inutile vers le type de la PK){valueKey, labelKey}
ou la liste des valeurs) si la classe n'est pas unereference
(Dans
references.ts
, on met toutes lesenums
, ainsi que lesreferences
dont la PK n'est pas autogénérée. Toutes les autres classes ont leur fichier de définition d'entité. C'est déjà ce qu'on faisait, mais moins explicitement.)