/*
|
* 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<Void> {
|
|
private final Connection connection;
|
private final JsonFdxParsedDataIterator parsedDataIterator;
|
private final List<DefaultTypeFichierDataColumn> dataColumnsToAdd;
|
|
public JsonInsertQuery(Connection connection, JsonFdxParsedDataIterator parsedDataIterator, List<DefaultTypeFichierDataColumn> dataColumnsToAdd) {
|
this.connection = connection;
|
this.parsedDataIterator = parsedDataIterator;
|
this.dataColumnsToAdd = dataColumnsToAdd;
|
}
|
|
@Override
|
public Void execute() throws Exception {
|
List<JsonApiTypeFichierInsertData> 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<JsonTypeFichierInsertMetaData> 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<String> columnNames, String tableName, boolean parentIdPresent) {
|
List<String> 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<DefaultTypeFichierDataColumn> dataColumnsToAdd, Long parentId) throws SQLException, Exception {
|
|
List<QueryParam> 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);
|
|
}
|
}
|