package org.raidenjpa.query.executor; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.raidenjpa.util.BadSmell; public class PoolerRows { @BadSmell("This first if is really weird") public Collection<QueryResultRow> group(List<QueryResultRow> rows, List<List<String>> paths) { if (rows.isEmpty() && paths.size() > 0 && paths.get(0).get(0).equals("fake_aggregation_for_group_all_rows")) { return Arrays.asList(new QueryResultRow("", null)); } Map<String, QueryResultRow> map = new HashMap<String, QueryResultRow>(); for (QueryResultRow row : rows) { String key = toKey(row, paths); QueryResultRow groupedRow = map.get(key); if (groupedRow == null) { groupedRow = row; map.put(key, groupedRow); } groupedRow.addGroupedRow(row); } return map.values(); } private String toKey(QueryResultRow row, List<List<String>> paths) { String key = ""; for (List<String> path : paths) { key += ";" + toStringPath(path) + "=" + row.getObject(path); } return key; } @BadSmell("Probably it would be better have a Path class") private String toStringPath(List<String> path) { String result = ""; for (String p : path) { result += p + "."; } return result; } }