package com.megatim.fdxcommons.tools.database.queries; import com.megatim.fdxcommons.model.enumeration.FonctionAggregation; import com.megatim.fdxcommons.tools.database.queries.metadata.QueryCriterion; import com.megatim.fdxcommons.tools.database.contrat.DefaultPreparedStatementProcessor; import com.megatim.fdxcommons.tools.database.contrat.QueryMetaData; import com.megatim.fdxcommons.tools.database.queries.metadata.WhereQueryParameters; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import java.util.stream.IntStream; /** * * @author Gabuntu */ public class AggregationQuery implements QueryMetaData> { private final String tableName; private final Connection connection; private final QueryCriterion queryCriterion; private final String targetColumn; private final FonctionAggregation fonctionAggregation; private final List groupingColumns; public AggregationQuery(String tableName, Connection connection, QueryCriterion queryCriterion, String targetColumn, List groupingColumns, FonctionAggregation fonctionAggregation) { this.tableName = tableName; this.targetColumn = targetColumn; this.connection = connection; this.queryCriterion = queryCriterion; this.groupingColumns = groupingColumns; this.fonctionAggregation = fonctionAggregation; } @Override public List execute() throws Exception { System.out.println("<------------------------------------------------------------------------------------------------------------------------------->"); System.out.println(aggregationQuery()); System.out.println("<------------------------------------------------------------------------------------------------------------------------------->"); try (PreparedStatement statement = connection.prepareStatement(aggregationQuery())) { new DefaultPreparedStatementProcessor().process(statement, new WhereQueryParameters(queryCriterion).parameters()); try ( ResultSet resultSet = statement.executeQuery()) { List results = new ArrayList<>(); while (resultSet.next()) { String[] result = new String[groupingColumns.size() + 1]; result[0] = resultSet.getString(aggregationColumnName()); for (int i = 0; i < groupingColumns.size(); i++) { String r = resultSet.getString(groupingColumns.get(i)); result[i + 1] = r != null ? r : ""; } results.add(result); } return results; } } } private String aggregationQuery() { StringBuilder query = new StringBuilder("SELECT COALESCE(" + fonctionAggregation.toString() + "(" + targetColumn + "), 0) AS " + aggregationColumnName() + groupingColumnsSelection() + " FROM ").append(tableName); query.append(new WhereQueryString(queryCriterion).query()); query.append(new GroupByQuery(groupingColumns).query()); return query.toString(); } private String aggregationColumnName() { return tableName + "_" + fonctionAggregation.toString(); } private String groupingColumnsSelection() { StringBuilder query = new StringBuilder(); int size = groupingColumns.size(); if (size > 0) { query.append(", "); } IntStream.range(0, size).forEach(index -> { String column = groupingColumns.get(index); query.append(column); if ((index + 1) < size) { query.append(","); } }); return query.toString(); } }