package com.megatim.fdxcommons.tools.database.queries; 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 CountQuery implements QueryMetaData> { private final String tableName; private final Connection connection; private final QueryCriterion queryCriterion; private final List groupingColumns; public CountQuery(String tableName, Connection connection, QueryCriterion queryCriterion, List groupingColumns) { this.tableName = tableName; this.connection = connection; this.queryCriterion = queryCriterion; this.groupingColumns = groupingColumns; } @Override public List execute() throws Exception { System.out.println("<------------------------------------------------------------------------------------------------------------------------------->"); System.out.println(countQuery()); System.out.println("<------------------------------------------------------------------------------------------------------------------------------->"); try ( PreparedStatement statement = connection.prepareStatement(countQuery())) { 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(countColumnName()); 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 countQuery() { StringBuilder query = new StringBuilder("SELECT COUNT(*) AS " + countColumnName() + groupingColumnsSelection() + " FROM ").append(tableName); query.append(new WhereQueryString(queryCriterion).query()); query.append(new GroupByQuery(groupingColumns).query()); return query.toString(); } private String countColumnName() { return tableName + "_count"; } 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(); } }