From 23a46b4be35277e06ec89f48730eeb694e686be8 Mon Sep 17 00:00:00 2001
From: Kenmegne <stephanie.kenmegne@gmail.com>
Date: Thu, 18 Jun 2026 15:40:06 +0000
Subject: [PATCH] add fdx-commons and fdx-consultation

---
 fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/json/CreateJsonTableIfNotExistQuery.java |  161 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 161 insertions(+), 0 deletions(-)

diff --git a/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/json/CreateJsonTableIfNotExistQuery.java b/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/json/CreateJsonTableIfNotExistQuery.java
new file mode 100644
index 0000000..cd4017c
--- /dev/null
+++ b/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/json/CreateJsonTableIfNotExistQuery.java
@@ -0,0 +1,161 @@
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
+ */
+package com.megatim.fdxcommons.tools.database.queries.json;
+
+import com.megatim.fdxcommons.model.enumeration.TypeDonnee;
+import static com.megatim.fdxcommons.model.enumeration.TypeDonnee.ALPHANUMERIQUE;
+import static com.megatim.fdxcommons.model.enumeration.TypeDonnee.DATE;
+import static com.megatim.fdxcommons.model.enumeration.TypeDonnee.DECIMAL;
+import static com.megatim.fdxcommons.model.enumeration.TypeDonnee.NUMERIQUE;
+import com.megatim.fdxcommons.model.integration.ColumnDefinition;
+import com.megatim.fdxcommons.tools.database.contrat.AppColumnDefinition;
+import com.megatim.fdxcommons.tools.database.contrat.QueryMetaData;
+import com.megatim.fdxcommons.tools.database.exceptions.BadColumnTypeException;
+import com.megatim.fdxcommons.tools.database.tables.appcolumns.AppColumnDefinitions;
+import com.megatim.fdxcommons.tools.database.tables.appcolumns.IndexColumnDefinition;
+import com.megatim.fdxcommons.tools.database.tables.appcolumns.ParentIdColumnDefinition;
+import com.megatim.fdxcommons.model.pojo.JsonTableDefinition;
+import java.sql.Connection;
+import java.sql.JDBCType;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author ASUS
+ */
+public class CreateJsonTableIfNotExistQuery implements QueryMetaData<Void> {
+
+    private final Connection connection;
+    private final AppColumnDefinitions appColumnDefinitions;
+    private final JsonTableDefinition tableDefinition;
+    private final List<String> queries = new ArrayList<>();
+
+    public CreateJsonTableIfNotExistQuery(Connection connection, AppColumnDefinitions appColumnDefinitions, JsonTableDefinition tableDefinition) {
+        this.connection = connection;
+        this.appColumnDefinitions = appColumnDefinitions;
+        this.tableDefinition = tableDefinition;
+    }
+
+    @Override
+    public Void execute() throws Exception {
+        query(tableDefinition);
+
+        for (String query : queries) {
+            System.out.println(query);
+        }
+
+        try ( Statement stmt = connection.createStatement()) {
+            for (String query : queries) {
+                stmt.execute(query);
+            }
+        }
+        return null;
+    }
+
+    private void query(JsonTableDefinition jsonTableDefinition) throws BadColumnTypeException {
+        StringBuilder query = new StringBuilder("CREATE TABLE IF NOT EXISTS " + jsonTableDefinition.getTableName() + "(");
+        List<AppColumnDefinition> primaryKeys = new ArrayList<>();
+
+        for (ColumnDefinition colDef : jsonTableDefinition.getColumnDefs()) {
+            query.append(colDef.getName().toLowerCase()).append(" ").append(sqlColumnType(colDef));
+            if (colDef.isRequired()) {
+                query.append(" NOT NULL");
+            }
+            query.append(", ");
+        }
+
+        for (AppColumnDefinition appColumnDefinition : appColumnDefinitions.appColumns()) {
+            query.append(columnDefinitonString(appColumnDefinition)).append(", ");
+
+            if (appColumnDefinition.isPrimaryKey()) {
+                primaryKeys.add(appColumnDefinition);
+            }
+        }
+        //Defintion de la colonne fdx_parent_id
+        if (jsonTableDefinition.getParentTableName() != null) {
+            query.append(columnDefinitonString(new ParentIdColumnDefinition())).append(", ");
+        }
+
+        if (!primaryKeys.isEmpty()) {
+            query.append(" PRIMARY KEY(");
+            primaryKeys.stream().forEach(pk -> query.append(pk.name()).append(", "));
+
+            //Retirer la dernière virgule
+            query.replace(query.length() - 2, query.length(), ")");
+        } else {
+            //Retirer la dernière virgule
+            query.replace(query.length() - 2, query.length(), "");
+        }
+
+        //Contrainte de clé étrangère sur fdx_parent_id
+        if (jsonTableDefinition.getParentTableName() != null) {
+            query.append(parentIdDefintion(jsonTableDefinition.getParentTableName(), new ParentIdColumnDefinition().name(), new IndexColumnDefinition().name()));
+        }
+        query.append(");");
+
+        queries.add(query.toString());
+
+        if (!jsonTableDefinition.getTablesDefinition().isEmpty()) {
+            for (JsonTableDefinition tableDef : jsonTableDefinition.getTablesDefinition()) {
+                query(tableDef);
+            }
+        }
+    }
+
+    private String parentIdDefintion(String parentTableName, String parentIdColumnName, String indexColumnName) {
+        StringBuilder builder = new StringBuilder("");
+        builder.append(", FOREIGN KEY (").append(parentIdColumnName).append(") REFERENCES ").append(parentTableName).append("(").append(indexColumnName).append(")");
+
+        return builder.toString();
+    }
+
+    private String sqlColumnType(ColumnDefinition colDef) throws BadColumnTypeException {
+        switch (TypeDonnee.fromValeur(colDef.getTypeDonnee())) {
+            case ALPHANUMERIQUE:
+                return jdbcType(colDef) + "(" + colDef.getTaille() + ")";
+            case NUMERIQUE:
+                return jdbcType(colDef).getName();
+            case DATE:
+                String requiredDefinition = colDef.isRequired() ? " NOT NULL" : " NULL";
+                return jdbcType(colDef).getName() + requiredDefinition;
+            case DECIMAL:
+                return jdbcType(colDef) + "(" + colDef.getTaille() + "," + 4 + ")";
+        }
+        throw new BadColumnTypeException("Type de colonne incorrect " + colDef.getTypeDonnee());
+    }
+
+    private JDBCType jdbcType(ColumnDefinition colDef) throws BadColumnTypeException {
+        switch (TypeDonnee.fromValeur(colDef.getTypeDonnee())) {
+            case NUMERIQUE:
+                return colDef.getTaille() < 5 ? JDBCType.SMALLINT : JDBCType.BIGINT;
+            case DECIMAL:
+                return JDBCType.DECIMAL;
+            case DATE:
+                return JDBCType.TIMESTAMP;
+            case ALPHANUMERIQUE:
+                return JDBCType.VARCHAR;
+        }
+        throw new BadColumnTypeException("Type de colonne incorrect " + colDef.getName());
+    }
+
+    private String columnDefinitonString(AppColumnDefinition column) throws BadColumnTypeException {
+        StringBuilder definition = new StringBuilder();
+        definition
+                .append(column.name().toLowerCase())
+                .append(" ")
+                .append(column.type())
+                .append(" ")
+                .append(column.isNull() ? "NULL " : "NOT NULL ");
+        
+        if (column.defaultValue() != null) {
+            definition
+                    .append("DEFAULT ")
+                    .append(column.defaultValue());
+        }
+        return definition.toString();
+    }
+}

--
Gitblit v1.10.0