use of de.symeda.sormas.api.Year in project SORMAS-Project by hzi-braunschweig.
the class StatisticsHelper method getTimeGroupingKeys.
/**
* @param attribute
* @param subAttribute
* @param caseFacade Needed for StatisticsCaseAttribute.ONSET_TIME, REPORT_TIME, OUTCOME_TIME
* @return
*/
public static List<StatisticsGroupingKey> getTimeGroupingKeys(StatisticsCaseAttribute attribute, StatisticsCaseSubAttribute subAttribute, CaseFacade caseFacade) {
Date oldestCaseDate = null;
switch(attribute) {
case ONSET_TIME:
oldestCaseDate = caseFacade.getOldestCaseOnsetDate();
break;
case REPORT_TIME:
oldestCaseDate = caseFacade.getOldestCaseReportDate();
break;
case OUTCOME_TIME:
oldestCaseDate = caseFacade.getOldestCaseOutcomeDate();
break;
default:
return new ArrayList<>();
}
LocalDate earliest = oldestCaseDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate now = LocalDate.now();
switch(subAttribute) {
case YEAR:
List<StatisticsGroupingKey> years = new ArrayList<>();
for (int i = earliest.getYear(); i <= now.getYear(); i++) {
years.add(new Year(i));
}
return years;
case QUARTER:
List<StatisticsGroupingKey> quarters = new ArrayList<>();
for (int i = 1; i <= 4; i++) {
quarters.add(new Quarter(i));
}
return quarters;
case MONTH:
return toGroupingKeys(Month.values());
case EPI_WEEK:
List<StatisticsGroupingKey> epiWeeks = new ArrayList<>();
for (int i = 1; i <= DateHelper.getMaximumEpiWeekNumber(); i++) {
epiWeeks.add(new EpiWeek(null, i));
}
return epiWeeks;
case QUARTER_OF_YEAR:
List<StatisticsGroupingKey> quarterOfYearList = new ArrayList<>();
QuarterOfYear earliestQuarter = new QuarterOfYear(new Quarter(1), new Year(earliest.getYear()));
QuarterOfYear latestQuarter = new QuarterOfYear(new Quarter(4), new Year(now.getYear()));
while (earliestQuarter.getYear().getValue() <= latestQuarter.getYear().getValue()) {
quarterOfYearList.add(new QuarterOfYear(earliestQuarter.getQuarter(), earliestQuarter.getYear()));
earliestQuarter.increaseQuarter();
}
return quarterOfYearList;
case MONTH_OF_YEAR:
List<StatisticsGroupingKey> monthOfYearList = new ArrayList<>();
for (int year = earliest.getYear(); year <= now.getYear(); year++) {
for (Month month : Month.values()) {
monthOfYearList.add(new MonthOfYear(month, year));
}
}
return monthOfYearList;
case EPI_WEEK_OF_YEAR:
List<StatisticsGroupingKey> epiWeekOfYearList = new ArrayList<>();
for (int year = earliest.getYear(); year <= now.getYear(); year++) {
epiWeekOfYearList.addAll(DateHelper.createEpiWeekList(year));
}
return epiWeekOfYearList;
default:
return new ArrayList<>();
}
}
use of de.symeda.sormas.api.Year in project SORMAS-Project by hzi-braunschweig.
the class StatisticsView method generateStatistics.
private List<StatisticsCaseCountDto> generateStatistics() {
fillCaseCriteria(showCaseIncidence);
if (showCaseIncidence) {
hasMissingPopulationData = false;
caseIncidencePossible = !hasIncidenceIncompatibleFilter() && !visualizationComponent.hasIncidenceIncompatibleGrouping();
missingPopulationDataNames = null;
if (caseIncidencePossible && !visualizationComponent.hasRegionGrouping() && !visualizationComponent.hasDistrictGrouping() && !visualizationComponent.hasCommunityGrouping()) {
// we don't have a territorial grouping, so the system will sum up the population of all regions.
// make sure the user is informed about regions with missing population data
List<Long> missingPopulationDataRegionIds = FacadeProvider.getPopulationDataFacade().getMissingPopulationDataForStatistics(caseCriteria, false, false, visualizationComponent.hasSexGrouping(), visualizationComponent.hasAgeGroupGroupingWithPopulationData());
hasMissingPopulationData = missingPopulationDataRegionIds.size() > 0;
if (hasMissingPopulationData) {
caseIncidencePossible = false;
List<String> missingPopulationDataNamesList = FacadeProvider.getRegionFacade().getNamesByIds(missingPopulationDataRegionIds);
missingPopulationDataNames = HtmlHelper.cleanHtml(String.join(", ", missingPopulationDataNamesList));
}
}
// Calculate projected population by either using the current year or, if a date filter has been selected, the maximum year from the date filter
populationReferenceYear = calculateMaximumReferenceYear(null, caseCriteria.getOnsetYears(), Comparator.naturalOrder(), e -> e.getValue());
populationReferenceYear = calculateMaximumReferenceYear(populationReferenceYear, caseCriteria.getReportYears(), Comparator.naturalOrder(), e -> e.getValue());
populationReferenceYear = calculateMaximumReferenceYear(populationReferenceYear, caseCriteria.getOnsetMonthsOfYear(), Comparator.naturalOrder(), e -> e.getYear().getValue());
populationReferenceYear = calculateMaximumReferenceYear(populationReferenceYear, caseCriteria.getReportMonthsOfYear(), Comparator.naturalOrder(), e -> e.getYear().getValue());
populationReferenceYear = calculateMaximumReferenceYear(populationReferenceYear, caseCriteria.getOnsetQuartersOfYear(), Comparator.naturalOrder(), e -> e.getYear().getValue());
populationReferenceYear = calculateMaximumReferenceYear(populationReferenceYear, caseCriteria.getReportQuartersOfYear(), Comparator.naturalOrder(), e -> e.getYear().getValue());
populationReferenceYear = calculateMaximumReferenceYear(populationReferenceYear, caseCriteria.getOnsetEpiWeeksOfYear(), Comparator.naturalOrder(), e -> e.getYear());
populationReferenceYear = calculateMaximumReferenceYear(populationReferenceYear, caseCriteria.getReportEpiWeeksOfYear(), Comparator.naturalOrder(), e -> e.getYear());
}
List<StatisticsCaseCountDto> resultData = FacadeProvider.getCaseStatisticsFacade().queryCaseCount(caseCriteria, visualizationComponent.getRowsAttribute(), visualizationComponent.getRowsSubAttribute(), visualizationComponent.getColumnsAttribute(), visualizationComponent.getColumnsSubAttribute(), showCaseIncidence && caseIncidencePossible, cbShowZeroValues.getValue(), populationReferenceYear);
StatisticsKeyComparator keyComparator = new StatisticsKeyComparator();
resultData.sort((c1, c2) -> {
int result = keyComparator.compare(c1.getRowKey(), c2.getRowKey());
if (result == 0) {
result = keyComparator.compare(c1.getColumnKey(), c2.getColumnKey());
}
return result;
});
return resultData;
}
use of de.symeda.sormas.api.Year in project SORMAS-Project by hzi-braunschweig.
the class StatisticsView method fillCaseCriteria.
private void fillCaseCriteria(boolean showCaseIncidence) {
caseCriteria = new StatisticsCaseCriteria();
for (StatisticsFilterComponent filterComponent : filterComponents) {
StatisticsFilterElement filterElement = filterComponent.getFilterElement();
switch(filterComponent.getSelectedAttribute()) {
case SEX:
if (filterElement.getSelectedValues() != null) {
List<Sex> sexes = new ArrayList<>();
for (TokenizableValue tokenizableValue : filterElement.getSelectedValues()) {
if (tokenizableValue.getValue().equals(I18nProperties.getString(Strings.notSpecified))) {
caseCriteria.sexUnknown(true);
} else {
sexes.add((Sex) tokenizableValue.getValue());
}
}
caseCriteria.sexes(sexes);
}
break;
case DISEASE:
if (filterElement.getSelectedValues() != null) {
List<Disease> diseases = new ArrayList<>();
for (TokenizableValue tokenizableValue : filterElement.getSelectedValues()) {
diseases.add((Disease) tokenizableValue.getValue());
}
caseCriteria.diseases(diseases);
}
break;
case CLASSIFICATION:
if (filterElement.getSelectedValues() != null) {
List<CaseClassification> classifications = new ArrayList<>();
for (TokenizableValue tokenizableValue : filterElement.getSelectedValues()) {
classifications.add((CaseClassification) tokenizableValue.getValue());
}
caseCriteria.classifications(classifications);
}
break;
case OUTCOME:
if (filterElement.getSelectedValues() != null) {
List<CaseOutcome> outcomes = new ArrayList<>();
for (TokenizableValue tokenizableValue : filterElement.getSelectedValues()) {
outcomes.add((CaseOutcome) tokenizableValue.getValue());
}
caseCriteria.outcomes(outcomes);
}
break;
case AGE_INTERVAL_1_YEAR:
case AGE_INTERVAL_5_YEARS:
case AGE_INTERVAL_CHILDREN_COARSE:
case AGE_INTERVAL_CHILDREN_FINE:
case AGE_INTERVAL_CHILDREN_MEDIUM:
case AGE_INTERVAL_BASIC:
if (filterElement.getSelectedValues() != null) {
List<IntegerRange> ageIntervals = new ArrayList<>();
for (TokenizableValue tokenizableValue : filterElement.getSelectedValues()) {
ageIntervals.add((IntegerRange) tokenizableValue.getValue());
}
caseCriteria.addAgeIntervals(ageIntervals);
// Fill age groups if 5 years interval has been selected and case incidence is shown
if (showCaseIncidence && filterComponent.getSelectedAttribute() == StatisticsCaseAttribute.AGE_INTERVAL_5_YEARS) {
List<AgeGroup> ageGroups = new ArrayList<>();
for (IntegerRange ageInterval : ageIntervals) {
if (ageInterval.getFrom() != null || ageInterval.getTo() != null) {
ageGroups.add(AgeGroup.getAgeGroupFromIntegerRange(ageInterval));
}
}
caseCriteria.addAgeGroups(ageGroups);
}
}
break;
case JURISDICTION:
StatisticsFilterJurisdictionElement jurisdictionElement = (StatisticsFilterJurisdictionElement) filterElement;
if (jurisdictionElement.getSelectedRegions() != null) {
List<RegionReferenceDto> regions = new ArrayList<>();
for (TokenizableValue tokenizableValue : jurisdictionElement.getSelectedRegions()) {
regions.add((RegionReferenceDto) tokenizableValue.getValue());
}
caseCriteria.regions(regions);
}
if (jurisdictionElement.getSelectedDistricts() != null) {
List<DistrictReferenceDto> districts = new ArrayList<>();
for (TokenizableValue tokenizableValue : jurisdictionElement.getSelectedDistricts()) {
districts.add((DistrictReferenceDto) tokenizableValue.getValue());
}
caseCriteria.districts(districts);
}
if (jurisdictionElement.getSelectedCommunities() != null) {
List<CommunityReferenceDto> communities = new ArrayList<>();
for (TokenizableValue tokenizableValue : jurisdictionElement.getSelectedCommunities()) {
communities.add((CommunityReferenceDto) tokenizableValue.getValue());
}
caseCriteria.communities(communities);
}
if (jurisdictionElement.getSelectedHealthFacilities() != null) {
List<FacilityReferenceDto> facilities = new ArrayList<>();
for (TokenizableValue tokenizableValue : jurisdictionElement.getSelectedHealthFacilities()) {
facilities.add((FacilityReferenceDto) tokenizableValue.getValue());
}
caseCriteria.healthFacilities(facilities);
}
break;
case PLACE_OF_RESIDENCE:
StatisticsFilterResidenceElement residenceElement = (StatisticsFilterResidenceElement) filterElement;
if (residenceElement.getSelectedRegions() != null) {
List<RegionReferenceDto> regions = new ArrayList<>();
for (TokenizableValue tokenizableValue : residenceElement.getSelectedRegions()) {
regions.add((RegionReferenceDto) tokenizableValue.getValue());
}
caseCriteria.personRegions(regions);
}
if (residenceElement.getSelectedDistricts() != null) {
List<DistrictReferenceDto> districts = new ArrayList<>();
for (TokenizableValue tokenizableValue : residenceElement.getSelectedDistricts()) {
districts.add((DistrictReferenceDto) tokenizableValue.getValue());
}
caseCriteria.personDistricts(districts);
}
if (residenceElement.getSelectedCommunities() != null) {
List<CommunityReferenceDto> communities = new ArrayList<>();
for (TokenizableValue tokenizableValue : residenceElement.getSelectedCommunities()) {
communities.add((CommunityReferenceDto) tokenizableValue.getValue());
}
caseCriteria.personCommunities(communities);
}
if (residenceElement.getCity() != null) {
caseCriteria.setPersonCity(residenceElement.getCity());
}
if (residenceElement.getPostcode() != null) {
caseCriteria.setPersonPostcode(residenceElement.getPostcode());
}
break;
case REPORTING_USER_ROLE:
if (filterElement.getSelectedValues() != null) {
List<UserRole> reportingUserRoles = new ArrayList<>();
for (TokenizableValue tokenizableValue : filterElement.getSelectedValues()) {
reportingUserRoles.add((UserRole) tokenizableValue.getValue());
}
caseCriteria.reportingUserRoles(reportingUserRoles);
}
break;
default:
switch(filterComponent.getSelectedSubAttribute()) {
case YEAR:
if (filterElement.getSelectedValues() != null) {
List<Year> years = new ArrayList<>();
for (TokenizableValue tokenizableValue : filterElement.getSelectedValues()) {
years.add((Year) tokenizableValue.getValue());
}
caseCriteria.years(years, filterComponent.getSelectedAttribute());
}
break;
case QUARTER:
if (filterElement.getSelectedValues() != null) {
List<Quarter> quarters = new ArrayList<>();
for (TokenizableValue tokenizableValue : filterElement.getSelectedValues()) {
quarters.add((Quarter) tokenizableValue.getValue());
}
caseCriteria.quarters(quarters, filterComponent.getSelectedAttribute());
}
break;
case MONTH:
if (filterElement.getSelectedValues() != null) {
List<Month> months = new ArrayList<>();
for (TokenizableValue tokenizableValue : filterElement.getSelectedValues()) {
months.add((Month) tokenizableValue.getValue());
}
caseCriteria.months(months, filterComponent.getSelectedAttribute());
}
break;
case EPI_WEEK:
if (filterElement.getSelectedValues() != null) {
List<EpiWeek> epiWeeks = new ArrayList<>();
for (TokenizableValue tokenizableValue : filterElement.getSelectedValues()) {
epiWeeks.add((EpiWeek) tokenizableValue.getValue());
}
caseCriteria.epiWeeks(epiWeeks, filterComponent.getSelectedAttribute());
}
break;
case QUARTER_OF_YEAR:
if (filterElement.getSelectedValues() != null) {
List<QuarterOfYear> quartersOfYear = new ArrayList<>();
for (TokenizableValue tokenizableValue : filterElement.getSelectedValues()) {
quartersOfYear.add((QuarterOfYear) tokenizableValue.getValue());
}
caseCriteria.quartersOfYear(quartersOfYear, filterComponent.getSelectedAttribute());
}
break;
case MONTH_OF_YEAR:
if (filterElement.getSelectedValues() != null) {
List<MonthOfYear> monthsOfYear = new ArrayList<>();
for (TokenizableValue tokenizableValue : filterElement.getSelectedValues()) {
monthsOfYear.add((MonthOfYear) tokenizableValue.getValue());
}
caseCriteria.monthsOfYear(monthsOfYear, filterComponent.getSelectedAttribute());
}
break;
case EPI_WEEK_OF_YEAR:
if (filterElement.getSelectedValues() != null) {
List<EpiWeek> epiWeeksOfYear = new ArrayList<>();
for (TokenizableValue tokenizableValue : filterElement.getSelectedValues()) {
epiWeeksOfYear.add((EpiWeek) tokenizableValue.getValue());
}
caseCriteria.epiWeeksOfYear(epiWeeksOfYear, filterComponent.getSelectedAttribute());
}
break;
case DATE_RANGE:
caseCriteria.dateRange((Date) filterElement.getSelectedValues().get(0).getValue(), (Date) filterElement.getSelectedValues().get(1).getValue(), filterComponent.getSelectedAttribute());
break;
default:
throw new IllegalArgumentException(filterComponent.getSelectedSubAttribute().toString());
}
}
}
}
use of de.symeda.sormas.api.Year in project SORMAS-Project by hzi-braunschweig.
the class CaseStatisticsFacadeEjbTest method testQueryCaseCountZeroValues.
@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(), null, null)));
criteria.addAgeIntervals(Arrays.asList(new IntegerRange(10, 40)));
List<StatisticsCaseCountDto> results = getCaseStatisticsFacade().queryCaseCount(criteria, StatisticsCaseAttribute.SEX, null, null, null, false, true, null);
// List should have one entry per sex
assertEquals(Sex.values().length, results.size());
}
use of de.symeda.sormas.api.Year in project SORMAS-Project by hzi-braunschweig.
the class CaseStatisticsFacadeEjbTest method testQueryCaseCount.
@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.setOutcomeDate(DateHelper.addWeeks(caze.getReportDate(), 2));
caze = getCaseFacade().save(caze);
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(), null, null)));
criteria.addAgeIntervals(Arrays.asList(new IntegerRange(10, 40)));
List<StatisticsCaseCountDto> results = getCaseStatisticsFacade().queryCaseCount(criteria, null, null, null, null, false, false, null);
// List should have one entry
assertEquals(1, results.size());
// try all groupings
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);
}
}
}
}
}
Aggregations