CaseStatisticsFacadeEjb implements CaseStatisticsFacade { @SuppressWarnings("unchecked") @Override public List<StatisticsCaseCountDto> queryCaseCount( StatisticsCaseCriteria caseCriteria, StatisticsCaseAttribute rowGrouping, StatisticsCaseSubAttribute rowSubGrouping, StatisticsCaseAttribute columnGrouping, StatisticsCaseSubAttribute columnSubGrouping, boolean includePopulation, boolean includeZeroValues, Integer populationReferenceYear) { Pair<String, List<Object>> caseCountQueryAndParams = buildCaseCountQuery(caseCriteria, rowGrouping, rowSubGrouping, columnGrouping, columnSubGrouping); Query caseCountQuery = em.createNativeQuery(caseCountQueryAndParams.getKey().toString()); for (int i = 0; i < caseCountQueryAndParams.getValue().size(); i++) { caseCountQuery.setParameter(i + 1, caseCountQueryAndParams.getValue().get(i)); } Function<Integer, RegionReferenceDto> regionProvider = id -> regionFacade.getRegionReferenceById(id); Function<Integer, DistrictReferenceDto> districtProvider = id -> districtFacade.getDistrictReferenceById(id); Function<Integer, CommunityReferenceDto> communityProvider = id -> communityFacade.getCommunityReferenceById(id); Function<Integer, FacilityReferenceDto> healthFacilityProvider = id -> facilityFacade.getFacilityReferenceById(id); List<StatisticsCaseCountDto> caseCountResults = ((Stream<Object[]>) caseCountQuery.getResultStream()).map(result -> { Object rowKey = "".equals(result[1]) ? null : result[1]; Object columnKey = "".equals(result[2]) ? null : result[2]; return new StatisticsCaseCountDto( result[0] != null ? ((Number) result[0]).intValue() : null, null, StatisticsHelper.buildGroupingKey( rowKey, rowGrouping, rowSubGrouping, regionProvider, districtProvider, communityProvider, healthFacilityProvider), StatisticsHelper.buildGroupingKey( columnKey, columnGrouping, columnSubGrouping, regionProvider, districtProvider, communityProvider, healthFacilityProvider)); }).collect(Collectors.toList()); if (includeZeroValues) { List<StatisticsGroupingKey> allRowKeys; if (rowGrouping != null) { allRowKeys = (List<StatisticsGroupingKey>) caseCriteria.getFilterValuesForGrouping(rowGrouping, rowSubGrouping); if (allRowKeys == null) { allRowKeys = StatisticsHelper.getAttributeGroupingKeys(rowGrouping, rowSubGrouping); } } else { allRowKeys = Arrays.asList((StatisticsGroupingKey) null); } List<StatisticsGroupingKey> allColumnKeys; if (columnGrouping != null) { allColumnKeys = (List<StatisticsGroupingKey>) caseCriteria.getFilterValuesForGrouping(columnGrouping, columnSubGrouping); if (allColumnKeys == null) { allColumnKeys = StatisticsHelper.getAttributeGroupingKeys(columnGrouping, columnSubGrouping); } } else { allColumnKeys = Arrays.asList((StatisticsGroupingKey) null); } for (StatisticsGroupingKey rowKey : allRowKeys) { for (StatisticsGroupingKey columnKey : allColumnKeys) { StatisticsCaseCountDto zeroDto = new StatisticsCaseCountDto(0, null, rowKey, columnKey); if (!caseCountResults.contains(zeroDto)) { caseCountResults.add(zeroDto); } } } } if (includePopulation) { Pair<String, List<Object>> populationQueryAndParams = buildPopulationQuery(caseCriteria, rowGrouping, rowSubGrouping, columnGrouping, columnSubGrouping, populationReferenceYear); Query populationQuery = em.createNativeQuery(populationQueryAndParams.getKey().toString()); for (int i = 0; i < populationQueryAndParams.getValue().size(); i++) { populationQuery.setParameter(i + 1, populationQueryAndParams.getValue().get(i)); } List<StatisticsCaseCountDto> populationResults = ((Stream<Object[]>) populationQuery.getResultStream()).map(result -> { Object rowKey = "".equals(result[1]) ? null : result[1]; Object columnKey = "".equals(result[2]) ? null : result[2]; return new StatisticsCaseCountDto( null, result[0] != null ? ((Number) result[0]).intValue() : null, StatisticsHelper.buildGroupingKey( rowKey, rowGrouping, rowSubGrouping, regionProvider, districtProvider, communityProvider, healthFacilityProvider), StatisticsHelper.buildGroupingKey( columnKey, columnGrouping, columnSubGrouping, regionProvider, districtProvider, communityProvider, healthFacilityProvider)); }).collect(Collectors.toList()); boolean rowIsPopulation = rowGrouping != null && rowGrouping.isPopulationData(); boolean columnIsPopulation = columnGrouping != null && columnGrouping.isPopulationData(); if (!populationResults.isEmpty()) { assert ((populationResults.get(0).getRowKey() != null) == rowIsPopulation); assert ((populationResults.get(0).getColumnKey() != null) == columnIsPopulation); } StatisticsCaseCountDto searchDto = new StatisticsCaseCountDto(null, null, null, null); for (StatisticsCaseCountDto caseCountResult : caseCountResults) { if (rowIsPopulation) { searchDto.setRowKey(caseCountResult.getRowKey()); } if (columnIsPopulation) { searchDto.setColumnKey(caseCountResult.getColumnKey()); } int index = populationResults.indexOf(searchDto); if (index >= 0) { caseCountResult.setPopulation(populationResults.get(index).getPopulation()); } } } return caseCountResults; }  @SuppressWarnings("unchecked") @Override List<StatisticsCaseCountDto> queryCaseCount(
		StatisticsCaseCriteria caseCriteria,
		StatisticsCaseAttribute rowGrouping,
		StatisticsCaseSubAttribute rowSubGrouping,
		StatisticsCaseAttribute columnGrouping,
		StatisticsCaseSubAttribute columnSubGrouping,
		boolean includePopulation,
		boolean includeZeroValues,
		Integer populationReferenceYear); Pair<String, List<Object>> buildCaseCountQuery(
		StatisticsCaseCriteria caseCriteria,
		StatisticsCaseAttribute groupingA,
		StatisticsCaseSubAttribute subGroupingA,
		StatisticsCaseAttribute groupingB,
		StatisticsCaseSubAttribute subGroupingB); Pair<String, List<Object>> buildPopulationQuery(
		StatisticsCaseCriteria caseCriteria,
		StatisticsCaseAttribute groupingA,
		StatisticsCaseSubAttribute subGroupingA,
		StatisticsCaseAttribute groupingB,
		StatisticsCaseSubAttribute subGroupingB,
		Integer populationReferenceYear);  }
@Test public void testQueryCaseCount() { RDCF rdcf = creator.createRDCF("Region", "District", "Community", "Facility"); UserDto user = creator .createUser(rdcf.region.getUuid(), rdcf.district.getUuid(), rdcf.facility.getUuid(), "Surv", "Sup", UserRole.SURVEILLANCE_SUPERVISOR); PersonDto cazePerson = creator.createPerson("Case", "Person"); cazePerson.setApproximateAge(30); cazePerson.setApproximateAgeReferenceDate(new Date()); cazePerson.setApproximateAgeType(ApproximateAgeType.YEARS); cazePerson = getPersonFacade().savePerson(cazePerson); CaseDataDto caze = creator.createCase( user.toReference(), cazePerson.toReference(), Disease.EVD, CaseClassification.PROBABLE, InvestigationStatus.PENDING, new Date(), rdcf); caze = getCaseFacade().getCaseDataByUuid(caze.getUuid()); StatisticsCaseCriteria criteria = new StatisticsCaseCriteria(); int year = DateHelper8.toLocalDate(caze.getSymptoms().getOnsetDate()).getYear(); criteria.years(Arrays.asList(new Year(year), new Year(year + 1)), StatisticsCaseAttribute.ONSET_TIME); criteria.regions(Arrays.asList(new RegionReferenceDto(rdcf.region.getUuid()))); criteria.addAgeIntervals(Arrays.asList(new IntegerRange(10, 40))); List<StatisticsCaseCountDto> results = getCaseStatisticsFacade().queryCaseCount(criteria, null, null, null, null, false, false, null); assertEquals(1, results.size()); for (StatisticsCaseAttribute groupingAttribute : StatisticsCaseAttribute.values()) { StatisticsCaseSubAttribute[] subAttributes = groupingAttribute.getSubAttributes(); if (subAttributes.length == 0) { getCaseStatisticsFacade().queryCaseCount(criteria, groupingAttribute, null, null, null, false, false, null); } else { for (StatisticsCaseSubAttribute subGroupingAttribute : groupingAttribute.getSubAttributes()) { if (subGroupingAttribute.isUsedForGrouping()) { getCaseStatisticsFacade().queryCaseCount(criteria, groupingAttribute, subGroupingAttribute, null, null, false, false, null); } } } } }
@Test public void testQueryCaseCountZeroValues() { RDCF rdcf = creator.createRDCF("Region", "District", "Community", "Facility"); UserDto user = creator .createUser(rdcf.region.getUuid(), rdcf.district.getUuid(), rdcf.facility.getUuid(), "Surv", "Sup", UserRole.SURVEILLANCE_SUPERVISOR); PersonDto cazePerson = creator.createPerson("Case", "Person"); cazePerson.setApproximateAge(30); cazePerson.setApproximateAgeReferenceDate(new Date()); cazePerson.setApproximateAgeType(ApproximateAgeType.YEARS); cazePerson = getPersonFacade().savePerson(cazePerson); CaseDataDto caze = creator.createCase( user.toReference(), cazePerson.toReference(), Disease.EVD, CaseClassification.PROBABLE, InvestigationStatus.PENDING, new Date(), rdcf); caze = getCaseFacade().getCaseDataByUuid(caze.getUuid()); StatisticsCaseCriteria criteria = new StatisticsCaseCriteria(); int year = DateHelper8.toLocalDate(caze.getSymptoms().getOnsetDate()).getYear(); criteria.years(Arrays.asList(new Year(year), new Year(year + 1)), StatisticsCaseAttribute.ONSET_TIME); criteria.regions(Arrays.asList(new RegionReferenceDto(rdcf.region.getUuid()))); criteria.addAgeIntervals(Arrays.asList(new IntegerRange(10, 40))); List<StatisticsCaseCountDto> results = getCaseStatisticsFacade().queryCaseCount(criteria, StatisticsCaseAttribute.SEX, null, null, null, false, true, null); assertEquals(Sex.values().length + 1, results.size()); }
@Test public void testQueryCaseCountPopulation() { RDCF rdcf = creator.createRDCF("Region", "District", "Community", "Facility"); UserDto user = creator .createUser(rdcf.region.getUuid(), rdcf.district.getUuid(), rdcf.facility.getUuid(), "Surv", "Sup", UserRole.SURVEILLANCE_SUPERVISOR); PersonDto cazePerson = creator.createPerson("Case", "Person"); cazePerson.setApproximateAge(30); cazePerson.setApproximateAgeReferenceDate(new Date()); cazePerson.setApproximateAgeType(ApproximateAgeType.YEARS); cazePerson = getPersonFacade().savePerson(cazePerson); CaseDataDto caze = creator.createCase( user.toReference(), cazePerson.toReference(), Disease.EVD, CaseClassification.PROBABLE, InvestigationStatus.PENDING, new Date(), rdcf); caze = getCaseFacade().getCaseDataByUuid(caze.getUuid()); StatisticsCaseCriteria criteria = new StatisticsCaseCriteria(); criteria.regions(Arrays.asList(rdcf.region)); List<StatisticsCaseCountDto> results = getCaseStatisticsFacade() .queryCaseCount(criteria, StatisticsCaseAttribute.JURISDICTION, StatisticsCaseSubAttribute.REGION, null, null, true, false, null); assertNull(results.get(0).getPopulation()); PopulationDataDto populationData = PopulationDataDto.build(new Date()); RegionDto region = getRegionFacade().getRegionByUuid(rdcf.region.getUuid()); region.setGrowthRate(10f); getRegionFacade().saveRegion(region); populationData.setRegion(rdcf.region); populationData.setPopulation(new Integer(10000)); getPopulationDataFacade().savePopulationData(Arrays.asList(populationData)); results = getCaseStatisticsFacade().queryCaseCount( criteria, StatisticsCaseAttribute.JURISDICTION, StatisticsCaseSubAttribute.REGION, null, null, true, false, LocalDate.now().getYear() + 2); assertEquals(Integer.valueOf(12214), results.get(0).getPopulation()); }