Skip to content

Commit b15595e

Browse files
fix: include itemFilters in hasDateQueryItem check to prevent E7205 on stage date filters
--------- Co-authored-by: Jan Henrik Øverland <janhenrik.overland@gmail.com>
1 parent 3f4c7cb commit b15595e

13 files changed

Lines changed: 201 additions & 14 deletions

File tree

dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventQueryValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ public ErrorMessage validateForErrorMessage(EventQueryParams params) {
205205
}
206206

207207
private boolean hasDateQueryItem(EventQueryParams params) {
208-
return params.getItems().stream()
208+
return params.getItemsAndItemFilters().stream()
209209
.anyMatch(
210210
item ->
211211
EventAnalyticsColumnName.OCCURRED_DATE_COLUMN_NAME.equals(item.getItemId())

dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tracker/MetadataItemsHandler.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -870,13 +870,17 @@ private List<String> getDimensionItemUidsFrom(
870870
private static void addItemFiltersToDimensionItems(
871871
List<QueryItem> itemsFilter, Map<String, List<String>> dimensionItems) {
872872
for (QueryItem item : itemsFilter) {
873+
String itemUid = ResponseHelper.getItemUid(item);
874+
873875
if (item.hasOptionSet()) {
874-
dimensionItems.put(item.getItemId(), item.getOptionSetFilterItemsOrAll());
876+
dimensionItems.put(itemUid, item.getOptionSetFilterItemsOrAll());
875877
} else if (item.hasLegendSet()) {
876-
dimensionItems.put(item.getItemId(), item.getLegendSetFilterItemsOrAll());
878+
dimensionItems.put(itemUid, item.getLegendSetFilterItemsOrAll());
879+
} else if (!item.getDimensionValues().isEmpty()) {
880+
dimensionItems.put(itemUid, item.getDimensionValues());
877881
} else {
878882
dimensionItems.put(
879-
item.getItemId(),
883+
itemUid,
880884
item.getFiltersAsString() != null ? List.of(item.getFiltersAsString()) : emptyList());
881885
}
882886
}

dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventQueryValidatorTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,24 @@ void validateSuccessWithStageDateItem_ScheduledDate() {
494494
assertNull(error);
495495
}
496496

497+
@Test
498+
void validateSuccessWithStageDateItemFilter_OccurredDate() {
499+
BaseDimensionalItemObject item =
500+
new BaseDimensionalItemObject(EventAnalyticsColumnName.OCCURRED_DATE_COLUMN_NAME);
501+
QueryItem qi = new QueryItem(item, prA, null, ValueType.DATE, AggregationType.NONE, null);
502+
503+
EventQueryParams params =
504+
new EventQueryParams.Builder()
505+
.withProgram(prA)
506+
.withOrganisationUnits(List.of(ouA))
507+
.addItemFilter(qi)
508+
.build();
509+
510+
// Should not throw - stage date item filter provides period context
511+
ErrorMessage error = eventQueryValidator.validateForErrorMessage(params);
512+
assertNull(error);
513+
}
514+
497515
@Test
498516
void validateSuccessWithStaticDateItem_EnrollmentDate() {
499517
BaseDimensionalItemObject item =

dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/tracker/MetadataItemsHandlerTest.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1619,6 +1619,63 @@ void shouldIgnoreDimensionValuesForNonDateItems() {
16191619
assertNotNull(items);
16201620
assertFalse(items.containsKey("202205"));
16211621
}
1622+
1623+
@Test
1624+
@DisplayName(
1625+
"should include stage-prefixed dimension values for date item filters with period identifiers")
1626+
void shouldIncludeStagePrefixedDimensionValuesForDateItemFilters() {
1627+
// Given
1628+
Grid grid = new ListGrid();
1629+
1630+
org.hisp.dhis.program.ProgramStage programStage = createProgramStage('S', programA);
1631+
programStage.setUid("A03MvHHogjR");
1632+
1633+
org.hisp.dhis.common.BaseDimensionalItemObject eventDateItem =
1634+
new org.hisp.dhis.common.BaseDimensionalItemObject("occurreddate");
1635+
eventDateItem.setUid("occurreddate");
1636+
eventDateItem.setName("Event date");
1637+
1638+
QueryItem queryItem = new QueryItem(eventDateItem, null, ValueType.DATE, null, null);
1639+
queryItem.setProgramStage(programStage);
1640+
queryItem.setCustomHeader(
1641+
org.hisp.dhis.common.AnalyticsCustomHeader.forEventDate(programStage));
1642+
queryItem.addDimensionValue("202205");
1643+
queryItem.addFilter(new QueryFilter(QueryOperator.GE, "2022-05-01"));
1644+
queryItem.addFilter(new QueryFilter(QueryOperator.LE, "2022-05-31"));
1645+
1646+
EventQueryParams params =
1647+
new EventQueryParams.Builder()
1648+
.withProgram(programA)
1649+
.withSkipMeta(false)
1650+
.withEndpointAction(AGGREGATE)
1651+
.withOrganisationUnits(List.of(orgUnitA))
1652+
.withPeriods(createPeriodDimensions("2023Q1"), "quarterly")
1653+
.addItemFilter(queryItem)
1654+
.build();
1655+
1656+
when(userService.getUserByUsername(anyString())).thenReturn(null);
1657+
1658+
// When
1659+
metadataItemsHandler.addMetadata(grid, params, List.of());
1660+
1661+
// Then
1662+
@SuppressWarnings("unchecked")
1663+
Map<String, List<String>> dimensions =
1664+
(Map<String, List<String>>) grid.getMetaData().get(DIMENSIONS.getKey());
1665+
assertNotNull(dimensions);
1666+
1667+
assertTrue(
1668+
dimensions.containsKey("A03MvHHogjR.eventdate"),
1669+
"Dimensions should contain stage-prefixed key 'A03MvHHogjR.eventdate'");
1670+
assertEquals(
1671+
List.of("202205"),
1672+
dimensions.get("A03MvHHogjR.eventdate"),
1673+
"Dimension values should contain the period identifier '202205', not the filter string");
1674+
1675+
assertFalse(
1676+
dimensions.containsKey("occurreddate"),
1677+
"Dimensions should not contain raw 'occurreddate' key for stage-scoped filter items");
1678+
}
16221679
}
16231680

16241681
@Nested

dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/enrollment/aggregate/EnrollmentsAggregate4AutoTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ public void queryAggregatedenrollmentsmacase2() throws JSONException {
256256

257257
// Assert metaData.
258258
String expectedMetaData =
259-
"{\"pager\":{\"isLastPage\":true,\"pageSize\":50,\"page\":1},\"items\":{\"ou\":{\"name\":\"Organisation unit\"},\"202208\":{\"name\":\"August 2022\"},\"202307\":{\"name\":\"July 2023\"},\"202209\":{\"name\":\"September 2022\"},\"202305\":{\"name\":\"May 2023\"},\"202306\":{\"name\":\"June 2023\"},\"202303\":{\"name\":\"March 2023\"},\"202304\":{\"name\":\"April 2023\"},\"202301\":{\"name\":\"January 2023\"},\"202302\":{\"name\":\"February 2023\"},\"202211\":{\"name\":\"November 2022\"},\"ImspTQPwCqd\":{\"name\":\"Sierra Leone\"},\"202212\":{\"name\":\"December 2022\"},\"202210\":{\"name\":\"October 2022\"},\"pe\":{},\"VBqh0ynB2wv\":{\"name\":\"Malaria case registration\"},\"pTo4uMt3xur.F3ogKBuviRA\":{\"name\":\"Household location\"},\"pTo4uMt3xur\":{\"name\":\"Malaria case registration\"}},\"dimensions\":{\"F3ogKBuviRA\":[],\"pe\":[\"202208\",\"202209\",\"202210\",\"202211\",\"202212\",\"202301\",\"202302\",\"202303\",\"202304\",\"202305\",\"202306\",\"202307\"],\"ou\":[\"ImspTQPwCqd\"]}}";
259+
"{\"pager\":{\"isLastPage\":true,\"pageSize\":50,\"page\":1},\"items\":{\"ou\":{\"name\":\"Organisation unit\"},\"202208\":{\"name\":\"August 2022\"},\"202307\":{\"name\":\"July 2023\"},\"202209\":{\"name\":\"September 2022\"},\"202305\":{\"name\":\"May 2023\"},\"202306\":{\"name\":\"June 2023\"},\"202303\":{\"name\":\"March 2023\"},\"202304\":{\"name\":\"April 2023\"},\"202301\":{\"name\":\"January 2023\"},\"202302\":{\"name\":\"February 2023\"},\"202211\":{\"name\":\"November 2022\"},\"ImspTQPwCqd\":{\"name\":\"Sierra Leone\"},\"202212\":{\"name\":\"December 2022\"},\"202210\":{\"name\":\"October 2022\"},\"pe\":{},\"VBqh0ynB2wv\":{\"name\":\"Malaria case registration\"},\"pTo4uMt3xur.F3ogKBuviRA\":{\"name\":\"Household location\"},\"pTo4uMt3xur\":{\"name\":\"Malaria case registration\"}},\"dimensions\":{\"pTo4uMt3xur.F3ogKBuviRA\":[],\"pe\":[\"202208\",\"202209\",\"202210\",\"202211\",\"202212\",\"202301\",\"202302\",\"202303\",\"202304\",\"202305\",\"202306\",\"202307\"],\"ou\":[\"ImspTQPwCqd\"]}}";
260260
String actualMetaData = new JSONObject((Map) response.extract("metaData")).toString();
261261
assertEquals(expectedMetaData, actualMetaData, false);
262262

dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/enrollment/aggregate/EnrollmentsAggregate6AutoTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2576,7 +2576,7 @@ public void dataElementOrgUnitTypeFilter() throws JSONException {
25762576

25772577
// 3. Assert metaData.
25782578
String expectedMetaData =
2579-
"{\"pager\":{\"page\":1,\"pageSize\":50,\"isLastPage\":true},\"items\":{\"bbKtnxRZKEP\":{\"name\":\"Postpartum care visit\"},\"ou\":{\"name\":\"Organisation unit\"},\"edqlbukwRfQ\":{\"name\":\"Second antenatal care visit\"},\"2023\":{\"name\":\"2023\"},\"2022\":{\"name\":\"2022\"},\"2021\":{\"name\":\"2021\"},\"2020\":{\"name\":\"2020\"},\"PFDfvmGpsR3.n1rtSHYf6O6\":{\"name\":\"WHOMCH Hospital \\/ Birth clinic\"},\"ImspTQPwCqd\":{\"name\":\"Sierra Leone\"},\"PFDfvmGpsR3\":{\"name\":\"Care at birth\"},\"pe\":{},\"2024\":{\"name\":\"2024\"},\"PUZaKR0Jh2k\":{\"name\":\"Previous deliveries\"},\"WZbXY0S00lP\":{\"name\":\"First antenatal care visit\"},\"WSGAb5XwJ3Y\":{\"name\":\"WHO RMNCH Tracker\"}},\"dimensions\":{\"pe\":[\"2020\",\"2021\",\"2022\",\"2023\",\"2024\"],\"ou\":[\"ImspTQPwCqd\"],\"n1rtSHYf6O6\":[\"in ImspTQPwCqd\"]}}";
2579+
"{\"pager\":{\"page\":1,\"pageSize\":50,\"isLastPage\":true},\"items\":{\"bbKtnxRZKEP\":{\"name\":\"Postpartum care visit\"},\"ou\":{\"name\":\"Organisation unit\"},\"edqlbukwRfQ\":{\"name\":\"Second antenatal care visit\"},\"2023\":{\"name\":\"2023\"},\"2022\":{\"name\":\"2022\"},\"2021\":{\"name\":\"2021\"},\"2020\":{\"name\":\"2020\"},\"PFDfvmGpsR3.n1rtSHYf6O6\":{\"name\":\"WHOMCH Hospital \\/ Birth clinic\"},\"ImspTQPwCqd\":{\"name\":\"Sierra Leone\"},\"PFDfvmGpsR3\":{\"name\":\"Care at birth\"},\"pe\":{},\"2024\":{\"name\":\"2024\"},\"PUZaKR0Jh2k\":{\"name\":\"Previous deliveries\"},\"WZbXY0S00lP\":{\"name\":\"First antenatal care visit\"},\"WSGAb5XwJ3Y\":{\"name\":\"WHO RMNCH Tracker\"}},\"dimensions\":{\"pe\":[\"2020\",\"2021\",\"2022\",\"2023\",\"2024\"],\"ou\":[\"ImspTQPwCqd\"],\"PFDfvmGpsR3.n1rtSHYf6O6\":[\"in ImspTQPwCqd\"]}}";
25802580
String actualMetaData = new JSONObject((Map) response.extract("metaData")).toString();
25812581
assertEquals(expectedMetaData, actualMetaData, false);
25822582

0 commit comments

Comments
 (0)