private void applyAggregationLevels(List<AnalyticsTable> tables) { int maxLevels = organisationUnitService.getNumberOfOrganisationalLevels(); boolean hasAggLevels = false; levelLoop: for (int i = 0; i < maxLevels; i++) { int level = maxLevels - i; Collection<String> dataElements = IdentifiableObjectUtils.getUids( dataElementService.getDataElementsByAggregationLevel(level)); if (dataElements.isEmpty()) { continue levelLoop; } hasAggLevels = true; ConcurrentLinkedQueue<AnalyticsTable> tableQ = new ConcurrentLinkedQueue<>(tables); List<Future<?>> futures = new ArrayList<>(); for (int j = 0; j < getProcessNo(); j++) { futures.add(tableManager.applyAggregationLevels(tableQ, dataElements, level)); } ConcurrentUtils.waitForCompletion(futures); } if (hasAggLevels) { vacuumTables(tables); log.info("Vacuumed tables"); } }