/* * 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.model.dataproduction.CommonDataProduction; import com.megatim.fdxcommons.model.enumeration.CriteriaLogicConnector; import com.megatim.fdxcommons.model.enumeration.Operateur; import com.megatim.fdxcommons.model.integration.ColumnDefinition; import com.megatim.fdxcommons.tools.database.exceptions.BadDataValueException; import com.megatim.fdxcommons.tools.database.exceptions.ColumnNotFoundException; import com.megatim.fdxcommons.tools.database.exceptions.LocalDateTimeValueParseError; import com.megatim.fdxcommons.tools.database.queries.metadata.JsonDataRowToUpdate; import com.megatim.fdxcommons.tools.database.queries.metadata.QueryCriterion; import com.megatim.fdxcommons.tools.database.queries.metadata.QueryParam; import com.megatim.fdxcommons.tools.database.queries.metadata.WhereQueryParameters; import com.megatim.fdxcommons.tools.database.tables.appcolumns.DataProductionUpdateIdColumnDefinition; import com.megatim.fdxcommons.tools.database.tables.appcolumns.DateMiseAJourColumnDefinition; import com.megatim.fdxcommons.tools.database.tables.appcolumns.IndexColumnDefinition; import com.megatim.fdxcommons.tools.utils.JsonDataUtil; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; /** * * @author ASUS */ public class JsonUpdate { private final Connection connection; private final Map matchedData; private final List columnsDefinition; private final String rootTableName; private final Map dataToSet; private final CommonDataProduction dataProduction; public JsonUpdate(Connection connection, Map matchedData, List columnsDefinition, String rootTableName, Map dataToSet, CommonDataProduction dataProduction) { this.connection = connection; this.matchedData = matchedData; this.columnsDefinition = columnsDefinition; this.rootTableName = rootTableName; this.dataToSet = dataToSet; this.dataProduction = dataProduction; } public void update() throws ColumnNotFoundException, SQLException, BadDataValueException, LocalDateTimeValueParseError, Exception { Map> tableToDataRow = new JsonDataRowToUpdate(dataToSet, rootTableName, columnsDefinition).dataRow(); Map> tableToMatchingIndexes = new JsonDataUtil().tableToMatchingIndexes(matchedData, rootTableName); for (Map.Entry> entry : tableToDataRow.entrySet()) { Set indexes = tableToMatchingIndexes.get(entry.getKey()); if (indexes != null) { QueryCriterion queryCriterion = queryCriterion(indexes); List params = parameters(entry.getValue(), queryCriterion); new UpdateQuery(connection, queryCriterion, entry.getKey(), columnsName(entry.getValue()), params).execute(); } } } private List parameters(Map updateData, QueryCriterion queryCriterion) throws Exception { List params = new ArrayList<>(); //On ajoute les paramètres de la clause SET updateData.forEach((k, v) -> { params.add(new QueryParam(k, v)); }); //On ajoute les paramètres de l'application params.add(new QueryParam(new DataProductionUpdateIdColumnDefinition().name(), dataProduction.getId())); params.add(new QueryParam(new DateMiseAJourColumnDefinition().name(), dataProduction.getDateProduction())); //On ajoute ensuite les paramètre de la clause WHERE params.addAll(new WhereQueryParameters(queryCriterion).parameters()); return params; } private QueryCriterion queryCriterion(Set indexes) { List criteria = new ArrayList<>(); indexes.stream().forEach(i -> criteria.add(new QueryCriterion(new IndexColumnDefinition().name(), i, Operateur.EQUALS, null, Arrays.asList()))); return new QueryCriterion(null, null, null, CriteriaLogicConnector.OR, criteria); } private List columnsName(Map data) { List columnsName = new ArrayList<>(); columnsName.addAll(data.keySet().stream().collect(Collectors.toList())); columnsName.add(new DataProductionUpdateIdColumnDefinition().name()); columnsName.add(new DateMiseAJourColumnDefinition().name()); return columnsName; } }