From 23a46b4be35277e06ec89f48730eeb694e686be8 Mon Sep 17 00:00:00 2001
From: Kenmegne <stephanie.kenmegne@gmail.com>
Date: Thu, 18 Jun 2026 15:40:06 +0000
Subject: [PATCH] add fdx-commons and fdx-consultation

---
 fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/AggregationQuery.java |   99 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 99 insertions(+), 0 deletions(-)

diff --git a/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/AggregationQuery.java b/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/AggregationQuery.java
new file mode 100644
index 0000000..fab1510
--- /dev/null
+++ b/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/AggregationQuery.java
@@ -0,0 +1,99 @@
+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<List<String[]>> {
+
+    private final String tableName;
+    private final Connection connection;
+    private final QueryCriterion queryCriterion;
+    private final String targetColumn;
+    private final FonctionAggregation fonctionAggregation;
+    private final List<String> groupingColumns;
+
+    public AggregationQuery(String tableName, Connection connection, QueryCriterion queryCriterion, String targetColumn, List<String> groupingColumns, FonctionAggregation fonctionAggregation) {
+        this.tableName = tableName;
+        this.targetColumn = targetColumn;
+        this.connection = connection;
+        this.queryCriterion = queryCriterion;
+        this.groupingColumns = groupingColumns;
+        this.fonctionAggregation = fonctionAggregation;
+    }
+
+    @Override
+    public List<String[]> 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<String[]> 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();
+    }
+}

--
Gitblit v1.10.0