Skip to content

Commit

Permalink
[i18n] Extraction du script d'insertion dans un fichier séparé
Browse files Browse the repository at this point in the history
Fixes #174
  • Loading branch information
gideruette committed Apr 18, 2024
1 parent 6ecba25 commit aadb67c
Showing 21 changed files with 206 additions and 41 deletions.
1 change: 1 addition & 0 deletions TopModel.Generator.Sql/GeneratorRegistration.cs
Original file line number Diff line number Diff line change
@@ -31,6 +31,7 @@ public void Register(IServiceCollection services, SqlConfig config, int number)
CombinePath(config.OutputDirectory, config.Procedural, c => c.TypeFile);
CombinePath(config.OutputDirectory, config.Procedural, c => c.UniqueKeysFile);
CombinePath(config.OutputDirectory, config.Procedural, c => c.CommentFile);
CombinePath(config.OutputDirectory, config.Procedural, c => c.ResourceFile);

services.AddGenerator<ProceduralSqlGenerator, SqlConfig>(config, number);
}
103 changes: 62 additions & 41 deletions TopModel.Generator.Sql/Procedural/AbstractSchemaGenerator.cs
Original file line number Diff line number Diff line change
@@ -106,6 +106,7 @@ public void GenerateSchemaScript(IEnumerable<Class> classes)
SqlFileWriter? writerType = null;
SqlFileWriter? writerUk = null;
SqlFileWriter? writerComment = null;
SqlFileWriter? writerResource = null;

if (Config.TypeFile != null)
{
@@ -122,6 +123,11 @@ public void GenerateSchemaScript(IEnumerable<Class> classes)
writerComment = new SqlFileWriter(Config.CommentFile, _logger);
}

if (Config.ResourceFile != null)
{
writerResource = new SqlFileWriter(Config.ResourceFile, _logger);
}

var appName = classes.First().Namespace.App;

writerCrebas.WriteLine("-- =========================================================================================== ");
@@ -148,10 +154,16 @@ public void GenerateSchemaScript(IEnumerable<Class> classes)
writerComment?.WriteLine("-- Description : Script de création des commentaires. ");
writerComment?.WriteLine("-- =========================================================================================== ");

writerResource?.WriteLine("-- =========================================================================================== ");
writerResource?.WriteLine($"-- Application Name : {appName} ");
writerResource?.WriteLine("-- Script Name : " + Config.ResourceFile?.Split('/').Last());
writerResource?.WriteLine("-- Description : Script de création des resources (libellés traduits). ");
writerResource?.WriteLine("-- =========================================================================================== ");

var foreignKeys = classes
.OrderBy(c => c.SqlName)
.Where(c => c.IsPersistent && !c.Abstract && classes.Contains(c))
.SelectMany(classe => WriteTableDeclaration(classe, writerCrebas, writerUk, writerType, writerComment, classes.ToList()))
.SelectMany(classe => WriteTableDeclaration(classe, writerCrebas, writerUk, writerType, writerComment, writerResource, classes.ToList()))
.ToList();

if (_config.TranslateProperties!.Value || _config.TranslateReferences!.Value)
@@ -162,6 +174,7 @@ public void GenerateSchemaScript(IEnumerable<Class> classes)
writerType?.Dispose();
writerUk?.Dispose();
writerComment?.Dispose();
writerResource?.Dispose();

using var writer = new SqlFileWriter(Config.IndexFKFile, _logger);

@@ -185,7 +198,7 @@ public void GenerateSchemaScript(IEnumerable<Class> classes)
};
var targetProperty = new RegularProperty()
{
Name = "TradKey",
Name = "ResourceKey",
Class = targetClass
};
var resourceProperties = classes.Where(c => c.DefaultProperty != null && c.Values.Count() > 0 && c.Enum).Select(c => c.DefaultProperty!);
@@ -374,6 +387,11 @@ private string Quote(string name)
return !UseQuotes ? name : $@"""{name}""";
}

private string SingleQuote(string name)
{
return $@"'{name.Replace("'", "''")}'";
}

/// <summary>
/// Ecrit dans le writer le script d'insertion dans la table staticTable ayant pour model modelClass.
/// </summary>
@@ -388,38 +406,6 @@ private void WriteInsert(SqlFileWriter writer, Class modelClass, IEnumerable<Cla
writer.WriteLine(GetInsertLine(modelClass, initItem, availableClasses));
}

if (_config.ResourcesTableName != null)
{
if (_config.TranslateProperties!.Value && modelClass.Properties.OfType<IFieldProperty>().Where(p => p.Label != null).Count() > 0)
{
writer.WriteLine();
writer.WriteLine("/**\t\tInitialisation des traductions des propriétés de la table " + modelClass.SqlName + "\t\t**/");
foreach (var lang in _translationStore.Translations.Keys)
{
foreach (var property in modelClass.Properties.OfType<IFieldProperty>())
{
if (property.Label != null)
{
writer.WriteLine($@"INSERT INTO {_config.ResourcesTableName}(TRAD_KEY, LOCALE, LABEL) VALUES(""{property.ResourceKey}"", ""{(string.IsNullOrEmpty(lang) ? "null" : lang)}"", ""{_translationStore.GetTranslation(property, lang)}"");");
}
}
}
}

if (modelClass.DefaultProperty != null && modelClass.Values.Count() > 0 && _config.TranslateReferences!.Value)
{
writer.WriteLine();
writer.WriteLine("/**\t\tInitialisation des traductions des valeurs de la table " + modelClass.SqlName + "\t\t**/");
foreach (var lang in _translationStore.Translations.Keys)
{
foreach (var val in modelClass.Values)
{
writer.WriteLine(@$"INSERT INTO {_config.ResourcesTableName}(TRAD_KEY, LOCALE, LABEL) VALUES(""{val.ResourceKey}"", ""{(string.IsNullOrEmpty(lang) ? "null" : lang)}"", ""{_translationStore.GetTranslation(val, lang)}"");");
}
}
}
}

writer.WriteLine();
}

@@ -455,22 +441,51 @@ private void WriteResourceTableDeclaration(SqlFileWriter writer)
writer.WriteLine(" * Création de ta table " + tableName + " contenant les traductions");
writer.WriteLine(" **/");
writer.WriteLine($"create table {_config.ResourcesTableName} (");
writer.WriteLine(1, "TRAD_KEY varchar(100) not null,");
writer.WriteLine(1, "RESOURCE_KEY varchar(255),");
writer.WriteLine(1, "LOCALE varchar(10),");
writer.WriteLine(1, "LABEL varchar(100),");
writer.WriteLine(1, "constraint PK_KEY_LOCALE primary key (TRAD_KEY, LOCALE)");
writer.WriteLine(1, "LABEL varchar(255),");
writer.WriteLine(1, "constraint PK_KEY_LOCALE primary key (RESOURCE_KEY, LOCALE)");
writer.WriteLine(")");

writer.WriteLine("/**");
writer.WriteLine(" * Création de l'index pour " + tableName + " (TRAD_KEY, LOCALE)");
writer.WriteLine(" * Création de l'index pour " + tableName + " (RESOURCE_KEY, LOCALE)");
writer.WriteLine(" **/");
writer.WriteLine("create index " + Quote($"IDX_{_config.ResourcesTableName}_TRAD_KEY_LOCALE") + " on " + tableName + " (");
writer.WriteLine("\t" + "TRAD_KEY, LOCALE" + " ASC");
writer.WriteLine("create index " + Quote($"IDX_{_config.ResourcesTableName}_RESOURCE_KEY_LOCALE") + " on " + tableName + " (");
writer.WriteLine("\t" + "RESOURCE_KEY, LOCALE" + " ASC");
writer.WriteLine($"){BatchSeparator}");
writer.WriteLine();
}
}

private void WriteResources(SqlFileWriter writer, Class modelClass)
{
if (_config.TranslateProperties!.Value && modelClass.Properties.OfType<IFieldProperty>().Where(p => p.Label != null).Count() > 0 && modelClass.ModelFile != null)
{
writer.WriteLine();
writer.WriteLine("/**\t\tInitialisation des traductions des propriétés de la table " + modelClass.SqlName + "\t\t**/");
foreach (var lang in _translationStore.Translations.Keys)
{
foreach (var property in modelClass.Properties.OfType<IFieldProperty>().Where(p => p.Label != null))
{
writer.WriteLine($@"INSERT INTO {_config.ResourcesTableName}(RESOURCE_KEY, LOCALE, LABEL) VALUES({SingleQuote(property.ResourceKey)}, {(string.IsNullOrEmpty(lang) ? "null" : @$"{SingleQuote(lang)}")}, {SingleQuote(_translationStore.GetTranslation(property, lang))});");
}
}
}

if (modelClass.DefaultProperty != null && modelClass.Values.Count() > 0 && _config.TranslateReferences!.Value)
{
writer.WriteLine();
writer.WriteLine("/**\t\tInitialisation des traductions des valeurs de la table " + modelClass.SqlName + "\t\t**/");
foreach (var lang in _translationStore.Translations.Keys)
{
foreach (var val in modelClass.Values)
{
writer.WriteLine(@$"INSERT INTO {_config.ResourcesTableName}(RESOURCE_KEY, LOCALE, LABEL) VALUES({SingleQuote(val.ResourceKey)}, {(string.IsNullOrEmpty(lang) ? "null" : @$"{SingleQuote(lang)}")}, ""{SingleQuote(_translationStore.GetTranslation(val, lang))});");
}
}
}
}

/// <summary>
/// Déclaration de la table.
/// </summary>
@@ -479,8 +494,9 @@ private void WriteResourceTableDeclaration(SqlFileWriter writer)
/// <param name="writerUk">Flux d'écriture Unique Key.</param>
/// <param name="writerType">Flux d'écritures des types.</param>
/// <param name="writerComment">Flux d'écritures des commentaires.</param>
/// <param name="writerResources">Flux d'écritures des commentaires.</param>
/// <returns>Liste des propriétés étrangères persistentes.</returns>
private IEnumerable<AssociationProperty> WriteTableDeclaration(Class classe, SqlFileWriter writerCrebas, SqlFileWriter? writerUk, SqlFileWriter? writerType, SqlFileWriter? writerComment, IList<Class> availableClasses)
private IEnumerable<AssociationProperty> WriteTableDeclaration(Class classe, SqlFileWriter writerCrebas, SqlFileWriter? writerUk, SqlFileWriter? writerType, SqlFileWriter? writerComment, SqlFileWriter? writerResources, IList<Class> availableClasses)
{
var fkPropertiesList = new List<AssociationProperty>();

@@ -607,6 +623,11 @@ private IEnumerable<AssociationProperty> WriteTableDeclaration(Class classe, Sql
WriteComments(writerComment, classe, tableName, properties);
}

if (writerResources is not null)
{
WriteResources(writerResources, classe);
}

writerCrebas.WriteLine();

if (isContainsInsertKey)
5 changes: 5 additions & 0 deletions TopModel.Generator.Sql/Procedural/ProceduralSqlConfig.cs
Original file line number Diff line number Diff line change
@@ -32,6 +32,11 @@ public class ProceduralSqlConfig
/// </summary>
public string? CommentFile { get; set; }

/// <summary>
/// Retourne ou définit l'emplacement du fichier de création des commentaires (SQL).
/// </summary>
public string? ResourceFile { get; set; }

/// <summary>
/// Retourne ou définit l'emplacement du script d'insertion des données des listes de référence (SQL).
/// </summary>
Original file line number Diff line number Diff line change
@@ -30,6 +30,7 @@ public ProceduralSqlGenerator(ILogger<ProceduralSqlGenerator> logger, Translatio
Config.Procedural!.InitListFile!,
Config.Procedural!.UniqueKeysFile!,
Config.Procedural!.CommentFile!,
Config.Procedural!.ResourceFile!,
}.Where(t => !string.IsNullOrEmpty(t));

protected override bool PersistentOnly => true;
4 changes: 4 additions & 0 deletions TopModel.Generator.Sql/sql.config.json
Original file line number Diff line number Diff line change
@@ -94,6 +94,10 @@
"type": "string",
"description": "Emplacement du fichier de création des commentaires."
},
"resourceFile": {
"type": "string",
"description": "Emplacement du fichier d'insertion des resources (libellés traduits)."
},
"initListFile": {
"type": "string",
"description": "Emplacement du script d'insertion des données des listes de référence."
7 changes: 7 additions & 0 deletions docs/generator/sql.md
Original file line number Diff line number Diff line change
@@ -12,6 +12,7 @@ Le générateur SQL en mode `procedural` peut générer les fichiers suivants :
- Un fichier d'insertion des valeurs pour toutes les classes persistées du modèle qui ont des `values`.
- Un fichier d'insertion des commentaires pour toutes les classes persistées du modèle, ainsi que pour leurs colonnes (`postgresql` uniquement).
- Un fichier de définition des types toutes les classes persistées du modèle, ainsi que pour leurs colonnes (`sqlserver` uniquement).
- Un fichier d'insertion des traductions dans la table définie par le paramètre `resourcesTableName`.

### SSDT

@@ -39,6 +40,7 @@ _Remarque : A l'inverse de tous les autres générateurs, le générateur SQL es
- `initListFile` : Nom du fichier d'insertion des listes de références.
- `commentFile` : Nom du fichier d'insertion des commentaires.
- `typeFile` : Nom du fichier de création des types.
- `resourceFile` : Nom du fichier d'insertion des traductions.

- `ssdt`

@@ -68,6 +70,10 @@ _Remarque : A l'inverse de tous les autres générateurs, le générateur SQL es

Début de la séquence générée.

- `resourcesTableName`

Nom de la table contenant les traductions

### Exemple

```yaml
@@ -82,6 +88,7 @@ sql:
uniqueKeysFile: 03_unique_keys.sql
initListFile: 04_references.sql
commentFile: 05_comments.sql
resourceFile: 06_resources.sql
identity:
increment: 50
start: 1000
4 changes: 4 additions & 0 deletions samples/generators/angular/topmodel.config.schema.json
Original file line number Diff line number Diff line change
@@ -853,6 +853,10 @@
"type": "string",
"description": "Emplacement du fichier de création des commentaires."
},
"resourceFile": {
"type": "string",
"description": "Emplacement du fichier d'insertion des resources (libellés traduits)."
},
"initListFile": {
"type": "string",
"description": "Emplacement du script d'insertion des données des listes de référence."
4 changes: 4 additions & 0 deletions samples/generators/csharp/topmodel.config.schema.json
Original file line number Diff line number Diff line change
@@ -853,6 +853,10 @@
"type": "string",
"description": "Emplacement du fichier de création des commentaires."
},
"resourceFile": {
"type": "string",
"description": "Emplacement du fichier d'insertion des resources (libellés traduits)."
},
"initListFile": {
"type": "string",
"description": "Emplacement du script d'insertion des données des listes de référence."
4 changes: 4 additions & 0 deletions samples/generators/database/topmodel.config.schema.json
Original file line number Diff line number Diff line change
@@ -853,6 +853,10 @@
"type": "string",
"description": "Emplacement du fichier de création des commentaires."
},
"resourceFile": {
"type": "string",
"description": "Emplacement du fichier d'insertion des resources (libellés traduits)."
},
"initListFile": {
"type": "string",
"description": "Emplacement du script d'insertion des données des listes de référence."
4 changes: 4 additions & 0 deletions samples/generators/focus/topmodel.config.schema.json
Original file line number Diff line number Diff line change
@@ -853,6 +853,10 @@
"type": "string",
"description": "Emplacement du fichier de création des commentaires."
},
"resourceFile": {
"type": "string",
"description": "Emplacement du fichier d'insertion des resources (libellés traduits)."
},
"initListFile": {
"type": "string",
"description": "Emplacement du script d'insertion des données des listes de référence."
4 changes: 4 additions & 0 deletions samples/generators/jpa/topmodel.config.schema.json
Original file line number Diff line number Diff line change
@@ -853,6 +853,10 @@
"type": "string",
"description": "Emplacement du fichier de création des commentaires."
},
"resourceFile": {
"type": "string",
"description": "Emplacement du fichier d'insertion des resources (libellés traduits)."
},
"initListFile": {
"type": "string",
"description": "Emplacement du script d'insertion des données des listes de référence."
4 changes: 4 additions & 0 deletions samples/generators/open-api/topmodel.config.schema.json
Original file line number Diff line number Diff line change
@@ -853,6 +853,10 @@
"type": "string",
"description": "Emplacement du fichier de création des commentaires."
},
"resourceFile": {
"type": "string",
"description": "Emplacement du fichier d'insertion des resources (libellés traduits)."
},
"initListFile": {
"type": "string",
"description": "Emplacement du script d'insertion des données des listes de référence."
16 changes: 16 additions & 0 deletions samples/generators/pg/src/01_tables.sql
Original file line number Diff line number Diff line change
@@ -81,3 +81,19 @@ create table UTILISATEUR (
constraint PK_UTILISATEUR primary key (UTI_ID)
);

/**
* Création de ta table TRANSLATION contenant les traductions
**/
create table TRANSLATION (
RESOURCE_KEY varchar(255),
LOCALE varchar(10),
LABEL varchar(255),
constraint PK_KEY_LOCALE primary key (RESOURCE_KEY, LOCALE)
)
/**
* Création de l'index pour TRANSLATION (RESOURCE_KEY, LOCALE)
**/
create index IDX_TRANSLATION_RESOURCE_KEY_LOCALE on TRANSLATION (
RESOURCE_KEY, LOCALE ASC
);

42 changes: 42 additions & 0 deletions samples/generators/pg/src/02_fk_indexes.sql
Original file line number Diff line number Diff line change
@@ -77,3 +77,45 @@ alter table UTILISATEUR
add constraint FK_UTILISATEUR_TUT_CODE foreign key (TUT_CODE)
references TYPE_UTILISATEUR (TUT_CODE);

/**
* Création de l'index de clef étrangère pour DROIT.DRO_LIBELLE
**/
create index IDX_DRO_DRO_LIBELLE_FK on DROIT (
DRO_LIBELLE ASC
);

/**
* Génération de la contrainte de clef étrangère pour DROIT.DRO_LIBELLE
**/
alter table DROIT
add constraint FK_DROIT_DRO_LIBELLE foreign key (DRO_LIBELLE)
references TRANSLATION (RESOURCE_KEY);

/**
* Création de l'index de clef étrangère pour TYPE_DROIT.TDR_LIBELLE
**/
create index IDX_TDR_TDR_LIBELLE_FK on TYPE_DROIT (
TDR_LIBELLE ASC
);

/**
* Génération de la contrainte de clef étrangère pour TYPE_DROIT.TDR_LIBELLE
**/
alter table TYPE_DROIT
add constraint FK_TYPE_DROIT_TDR_LIBELLE foreign key (TDR_LIBELLE)
references TRANSLATION (RESOURCE_KEY);

/**
* Création de l'index de clef étrangère pour TYPE_UTILISATEUR.TUT_LIBELLE
**/
create index IDX_TUT_TUT_LIBELLE_FK on TYPE_UTILISATEUR (
TUT_LIBELLE ASC
);

/**
* Génération de la contrainte de clef étrangère pour TYPE_UTILISATEUR.TUT_LIBELLE
**/
alter table TYPE_UTILISATEUR
add constraint FK_TYPE_UTILISATEUR_TUT_LIBELLE foreign key (TUT_LIBELLE)
references TRANSLATION (RESOURCE_KEY);

Loading

0 comments on commit aadb67c

Please sign in to comment.