package com.megatim.fdxconsultation.core.impl.stats; import com.megatim.fdxcommons.model.enumeration.FonctionAggregation; import com.megatim.fdxcommons.tools.database.connection.DBConnection; import com.megatim.fdxcommons.tools.database.queries.metadata.QueryCriterion; import com.megatim.fdxcommons.tools.database.tables.FdxTable; import com.megatim.fdxcommons.tools.utils.CriteriaEntityFromViewToQueryCriterion; import com.megatim.fdxconsultation.core.impl.factory.FdxConsultationTableFactory; import com.megatim.fdxconsultation.model.dto.stats.StatListResult; import com.megatim.fdxconsultation.model.dto.stats.StatResultDto; import com.megatim.fdxconsultation.model.dto.stats.StatScalarResult; import com.megatim.fdxconsultation.model.stats.TableConfiguration; import com.megatim.fdxconsultation.model.stats.TableauBord; import java.sql.Connection; import java.sql.SQLException; import java.util.List; import java.util.stream.Collectors; import javax.sql.DataSource; /** * * @author Gabuntu */ public class TableauBordResult { private final TableauBord tableauBord; private final DataSource dataSource; public TableauBordResult(TableauBord tableauBord, DataSource dataSource) { this.tableauBord = tableauBord; this.dataSource = dataSource; } public StatResultDto result() throws SQLException, Exception { StatResultDto statResultDto = new StatResultDto(); statResultDto.setDescription(tableauBord.getDescription()); try ( Connection connection = new DBConnection(dataSource).connection()) { FdxTable fdxTable = FdxConsultationTableFactory.createTable( tableauBord.getTypeFichier().getCode(), tableauBord.getReferentiel().getVersion(), connection ); for (TableConfiguration tableConfiguration : tableauBord.getTableConfigurations()) { List groupingColumns = groupingColumns(tableConfiguration); FonctionAggregation fonctionAggregation = tableConfiguration.getFonctionAggregation(); List results = tableConfiguration.getFonctionAggregation().equals(FonctionAggregation.COUNT) ? fdxTable.count(queryCriterion(tableConfiguration), connection, groupingColumns) : fdxTable.aggregate(connection, tableConfiguration.getTargetedColumn().getName(), groupingColumns, fonctionAggregation, queryCriterion(tableConfiguration) ); if (!groupingColumns.isEmpty()) { //GROUPE StatListResult statListResult = new StatListResult(); statListResult.setTypeResultatConfiguration(tableConfiguration.getTypeResultatConfiguration()); statListResult.setLibelle(tableConfiguration.getLibelle()); for (String[] result : results) { StatScalarResult statScalarResult = new StatScalarResult(); statScalarResult.setValue(result[0]); StringBuilder libelle = new StringBuilder(); for (int i = 1; i < result.length; i++) { //Colonnes d'aggrégration libelle.append(result[i]); if ((i + 1) < result.length) { libelle.append(" - "); } } statScalarResult.setLibelle(libelle.toString()); statListResult.getValues().add(statScalarResult); } statResultDto.getListResults().add(statListResult); } else { //ELEMENT if (!results.isEmpty()) { String[] result = results.get(0); StatScalarResult statScalarResult = new StatScalarResult(); statScalarResult.setLibelle(tableConfiguration.getLibelle()); statScalarResult.setColor(tableConfiguration.getColor()); statScalarResult.setValue(result[0]); statResultDto.getScalarResults().add(statScalarResult); } } } } return statResultDto; } private QueryCriterion queryCriterion(TableConfiguration tableConfiguration) { return new CriteriaEntityFromViewToQueryCriterion( new ConvertedCriteriaEntityFromView( tableConfiguration.getCriterion() ).criteriaEntityFromView() ).queryCriterion(); } private List groupingColumns(TableConfiguration tableConfiguration) { return tableConfiguration .getGroupingColumns() .stream() .map(c -> c.getName()) .collect(Collectors.toList()); } }