/* * 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; import com.megatim.fdxcommons.tools.database.contrat.DefaultPreparedStatementProcessor; import com.megatim.fdxcommons.tools.database.contrat.JsonTypeFichierInsertMetaData; import com.megatim.fdxcommons.tools.database.contrat.PreparedStatementProcessor; import com.megatim.fdxcommons.tools.database.contrat.QueryMetaData; import com.megatim.fdxcommons.tools.database.contrat.TypeFichierDataColumn; import com.megatim.fdxcommons.tools.database.contrat.TypeFichierDataRow; import com.megatim.fdxcommons.tools.database.queries.metadata.DefaultTypeFichierDataColumn; import com.megatim.fdxcommons.tools.database.queries.metadata.JsonApiTypeFichierInsertData; import com.megatim.fdxcommons.tools.database.queries.metadata.JsonFdxParsedDataIterator; import com.megatim.fdxcommons.tools.database.queries.metadata.QueryParam; import com.megatim.fdxcommons.tools.database.tables.appcolumns.IndexColumnDefinition; import com.megatim.fdxcommons.tools.database.tables.appcolumns.ParentIdColumnDefinition; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; /** * * @author ASUS */ public class JsonInsertQuery implements QueryMetaData { private final Connection connection; private final JsonFdxParsedDataIterator parsedDataIterator; private final List dataColumnsToAdd; public JsonInsertQuery(Connection connection, JsonFdxParsedDataIterator parsedDataIterator, List dataColumnsToAdd) { this.connection = connection; this.parsedDataIterator = parsedDataIterator; this.dataColumnsToAdd = dataColumnsToAdd; } @Override public Void execute() throws Exception { List rows = parsedDataIterator.rows(); for (JsonApiTypeFichierInsertData insertMetaData : rows) { String query = insertQueryString(insertMetaData.columnNames(), insertMetaData.tableName(), false); TypeFichierDataRow row = insertMetaData.row(); System.out.println("---------------- parentQuery-----------------------"); System.out.println(query); System.out.println("-----------------------------------"); try ( PreparedStatement statement = connection.prepareStatement(query);) { execute(statement, row, dataColumnsToAdd, null); ResultSet resultSet = statement.executeQuery(); if (resultSet.next()) { Long fdxIndex = resultSet.getLong(1); insertChildren(insertMetaData.children(), fdxIndex); } } } return null; } private void insertChildren(List data, Long parentId) throws Exception { if (!data.isEmpty()) { for (JsonTypeFichierInsertMetaData insertData : data) { insertChild(insertData, parentId); } } } private void insertChild(JsonTypeFichierInsertMetaData child, Long parentId) throws Exception { String childQuery = insertQueryString(child.columnNames(), child.tableName(), true); System.out.println("------------------ childQuery---------------------------"); System.out.println(childQuery); System.out.println("---------------------------------------------------------"); try ( PreparedStatement statement = connection.prepareStatement(childQuery);) { TypeFichierDataRow row = child.row(); execute(statement, row, dataColumnsToAdd, parentId); ResultSet resultSet = statement.executeQuery(); if (resultSet.next()) { Long fdxIndex = resultSet.getLong(1); insertChildren(child.children(), fdxIndex); } } } private String insertQueryString(List columnNames, String tableName, boolean parentIdPresent) { List insertColumns = new ArrayList<>(columnNames); for (DefaultTypeFichierDataColumn dc : dataColumnsToAdd) { insertColumns.add(dc.column()); } if (parentIdPresent) { insertColumns.add(new ParentIdColumnDefinition().name());// Ajout de la clé du parent } StringBuilder query = new StringBuilder("INSERT INTO " + tableName + "("); insertColumns.forEach(column -> query.append(column).append(",")); query.replace(query.length() - 1, query.length(), ") VALUES("); insertColumns.forEach(s -> query.append("?,")); query.replace(query.length() - 1, query.length(), ")"); query.append(" RETURNING ").append(new IndexColumnDefinition().name()).append(";"); return query.toString(); } private void execute(PreparedStatement preparedStatement, TypeFichierDataRow row, List dataColumnsToAdd, Long parentId) throws SQLException, Exception { List queryParameters = new ArrayList<>(); if (row != null) { for (TypeFichierDataColumn dataColumn : row.columns()) { queryParameters.add(new QueryParam(dataColumn.column(), dataColumn.value())); } } //On ajoute les colonnes de dataColumnsToAdd for (DefaultTypeFichierDataColumn dc : dataColumnsToAdd) { queryParameters.add(new QueryParam(dc.column(), dc.value())); } if (parentId != null && parentId != 0L) { queryParameters.add(new QueryParam(new ParentIdColumnDefinition().name(), parentId));//Ajout clé du parent } PreparedStatementProcessor statementProcessor = new DefaultPreparedStatementProcessor(0); statementProcessor.process(preparedStatement, queryParameters); } }