Kenmegne
7 days ago 23a46b4be35277e06ec89f48730eeb694e686be8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
 * 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());
    }
}