/*
|
* 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.fdxconsultation.core.impl.helper;
|
|
import com.megatim.fdxcommons.model.dataproduction.CommonDataProduction;
|
import com.megatim.fdxcommons.model.enumeration.Operateur;
|
import com.megatim.fdxcommons.model.enumeration.StatutDataProduction;
|
import com.megatim.fdxcommons.tools.database.queries.CustomQueries;
|
import com.megatim.fdxcommons.tools.database.queries.DeleteTableDataQuery;
|
import com.megatim.fdxcommons.tools.database.queries.UpdateDataProductionQuery;
|
import com.megatim.fdxcommons.tools.database.queries.metadata.FdxTableDefinition;
|
import com.megatim.fdxcommons.tools.database.queries.metadata.QueryCriterion;
|
import com.megatim.fdxcommons.tools.database.tables.appcolumns.DataProductionIdColumnDefinition;
|
import com.megatim.fdxcommons.tools.database.tables.FdxConsultationTable;
|
import com.megatim.fdxcommons.tools.database.tables.FdxTableColumnData;
|
import com.megatim.fdxcommons.tools.database.tables.FdxTableRow;
|
import com.megatim.fdxcommons.tools.database.tables.appcolumns.IndexColumnDefinition;
|
import com.megatim.fdxconsultation.core.ifaces.helper.TableInsert;
|
import com.megatim.fdxconsultation.core.impl.factory.FdxConsultationTableFactory;
|
import java.sql.Connection;
|
import java.sql.SQLException;
|
import java.util.Arrays;
|
import java.util.List;
|
import java.util.Optional;
|
import java.util.stream.Collectors;
|
import javax.enterprise.context.Dependent;
|
import javax.naming.NamingException;
|
|
/**
|
*
|
* @author ASUS
|
*/
|
@Dependent
|
public class FdxConsultationTableInsert implements TableInsert {
|
|
@Override
|
public Long insert(CommonDataProduction dataProduction, List<FdxTableRow> data, Connection connection) throws NamingException, SQLException, Exception {
|
FdxConsultationTable fdxConsTable = FdxConsultationTableFactory.createTable(dataProduction.getCodeTypeFichier(),
|
dataProduction.getReferentielVersion(),
|
connection);
|
FdxTableDefinition tableDefinition = fdxConsTable.tableDefinition(connection);
|
final String tableName = fdxConsTable.getTableName().name(connection);
|
|
if (dataProduction.getId() != null) {
|
|
if (!data.isEmpty()) {
|
Optional<FdxTableColumnData> optIndexData = data.get(0).getDataColumns().stream().filter(p -> p.getName().equals(new IndexColumnDefinition().name())).findFirst();
|
|
//Si fdx_index est trouvé dans les données existantes, alors la nouvelle dataproduction est une modification et donc on doit supprimer les anciennes avant l'insertion
|
if (optIndexData.isPresent() && new CustomQueries().fdxIndexExists((Long) optIndexData.get().getValue(), tableName, connection)) {
|
List<Long> indexes = data
|
.stream()
|
.flatMap(f -> f.getDataColumns().stream().filter(p -> p.getName().equals(new IndexColumnDefinition().name())))
|
.map(m -> (Long) m.getValue())
|
.collect(Collectors.toList());
|
|
//Supprimer les anciennes lignes de même index
|
new DeleteTableDataQuery(tableName, connection, deleteExistingIndexesCriterion(indexes)).execute();
|
}
|
fdxConsTable.insert(data, dataProduction.getId(), connection);
|
}
|
|
if (dataProduction.getStatutDataProduction().equals(StatutDataProduction.A_CONSOMMER)) {
|
new UpdateDataProductionQuery(dataProduction, connection).execute();
|
|
if (tableDefinition.isReferentiel()) {
|
new DeleteTableDataQuery(tableName, connection, whereDataProductionIsNotEqualCriterion(dataProduction.getId())).execute();
|
}
|
}
|
}
|
return dataProduction.getStatutDataProduction().equals(StatutDataProduction.A_CONSOMMER) ? dataProduction.getId() : null;
|
}
|
|
private QueryCriterion deleteExistingIndexesCriterion(List<Long> indexes) {
|
return new QueryCriterion(new IndexColumnDefinition().name(), indexes, Operateur.IN, null, Arrays.asList());
|
}
|
|
private QueryCriterion whereDataProductionIsNotEqualCriterion(Long dataProductionId) {
|
return new QueryCriterion(new DataProductionIdColumnDefinition().name(), dataProductionId, Operateur.NOT_EQUALS, null, Arrays.asList());
|
}
|
}
|