/* * 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 { private final Connection connection; private final AppColumnDefinitions appColumnDefinitions; private final JsonTableDefinition tableDefinition; private final List 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 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(); } }