diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/EventAggregateService.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/EventAggregateService.java index 1b368dc043f1..8f5eecc33bd5 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/EventAggregateService.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/EventAggregateService.java @@ -493,7 +493,7 @@ private void addEventReportDimensionalItems( (List) ((Map) grid.getMetaData().get(DIMENSIONS.getKey())).get(dimension); - if (legendOptions.isEmpty()) { + if (legendOptions == null || legendOptions.isEmpty()) { List legends = eventDimensionalItemObject.getLegendSet().getSortedLegends(); addLegends(dimensionalItems, parentUid, legends); } else { @@ -604,7 +604,7 @@ private Grid generateOutputGrid( MetadataItem metadataItem = (MetadataItem) ((Map) grid.getMetaData().get(ITEMS.getKey())).get(row); - String name = defaultIfEmpty(metadataItem.getName(), row); + String name = metadataItem == null ? row : defaultIfEmpty(metadataItem.getName(), row); String col = defaultIfEmpty(COLUMN_NAMES.get(row), row); outputGrid.addHeader(new GridHeader(name, col, TEXT, false, true)); diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventAggregateServiceTest.java b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventAggregateServiceTest.java index 966d15b4b560..4e17c7bd40c1 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventAggregateServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventAggregateServiceTest.java @@ -32,20 +32,32 @@ import static org.hisp.dhis.analytics.DataQueryParams.VALUE_ID; import static org.hisp.dhis.common.DimensionConstants.PERIOD_DIM_ID; import static org.hisp.dhis.common.DimensionType.PERIOD; +import static org.hisp.dhis.test.TestBase.createDataElement; +import static org.hisp.dhis.test.TestBase.createLegend; +import static org.hisp.dhis.test.TestBase.createLegendSet; import static org.hisp.dhis.test.TestBase.createOrganisationUnit; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.hisp.dhis.analytics.AnalyticsMetaDataKey; +import org.hisp.dhis.analytics.EventAnalyticsDimensionalItem; import org.hisp.dhis.analytics.common.ColumnHeader; import org.hisp.dhis.analytics.event.EventQueryParams; import org.hisp.dhis.common.BaseDimensionalObject; import org.hisp.dhis.common.DimensionalItemObject; import org.hisp.dhis.common.Grid; import org.hisp.dhis.common.GridHeader; +import org.hisp.dhis.common.ValueType; +import org.hisp.dhis.common.ValueTypedDimensionalItemObject; +import org.hisp.dhis.dataelement.DataElement; +import org.hisp.dhis.legend.Legend; +import org.hisp.dhis.legend.LegendSet; import org.hisp.dhis.period.PeriodDimension; import org.hisp.dhis.program.Program; import org.hisp.dhis.system.grid.ListGrid; @@ -123,6 +135,39 @@ void shouldRemoveRawPeMetadataWhenNoDefaultAggregatePeriodIsVisible() throws Exc assertEquals(List.of("scheduleddate"), dimensions.keySet().stream().toList()); } + @Test + void shouldFallBackToAllLegendsWhenDimensionsMetadataOmitsLegendSetDataElement() + throws Exception { + Legend legendA = createLegend('A', 0.0, 2.0); + Legend legendB = createLegend('B', 2.0, 4.0); + LegendSet legendSet = createLegendSet('A', legendA, legendB); + + DataElement dataElement = createDataElement('A'); + dataElement.setValueType(ValueType.NUMBER); + dataElement.setLegendSets(List.of(legendSet)); + + Grid grid = new ListGrid(); + grid.getMetaData().put(AnalyticsMetaDataKey.DIMENSIONS.getKey(), new HashMap()); + + List dimensionalItems = new ArrayList<>(); + + invokeAddEventReportDimensionalItems(dataElement, dimensionalItems, grid, dataElement.getUid()); + + assertFalse(dimensionalItems.isEmpty()); + } + + @Test + void shouldNotNpeWhenItemsMetadataOmitsRowDimension() throws Exception { + String missingDimensionUid = "deUidAAAAA"; + + Grid grid = new ListGrid(); + grid.getMetaData().put(AnalyticsMetaDataKey.ITEMS.getKey(), new HashMap()); + + EventQueryParams params = new EventQueryParams.Builder().build(); + + invokeGenerateOutputGrid(grid, params, List.of(), List.of(), List.of(missingDimensionUid)); + } + @Test void shouldKeepValueAndEnrollmentOuHeadersUnchanged() throws Exception { EventQueryParams params = @@ -157,6 +202,44 @@ private void invokePrivate( method.invoke(service, arg0, arg1); } + private void invokeAddEventReportDimensionalItems( + ValueTypedDimensionalItemObject item, + List dimensionalItems, + Grid grid, + String dimension) + throws Exception { + Method method = + EventAggregateService.class.getDeclaredMethod( + "addEventReportDimensionalItems", + ValueTypedDimensionalItemObject.class, + List.class, + Grid.class, + String.class); + method.setAccessible(true); + method.invoke(service, item, dimensionalItems, grid, dimension); + } + + private Grid invokeGenerateOutputGrid( + Grid grid, + EventQueryParams params, + List> rowPermutations, + List> columnPermutations, + List rowDimensions) + throws Exception { + + Method method = + EventAggregateService.class.getDeclaredMethod( + "generateOutputGrid", + Grid.class, + EventQueryParams.class, + List.class, + List.class, + List.class); + method.setAccessible(true); + return (Grid) + method.invoke(service, grid, params, rowPermutations, columnPermutations, rowDimensions); + } + private EventQueryParams singleDateFieldParams(String dateField, Program program) { PeriodDimension period = PeriodDimension.of("2021").setDateField(dateField); BaseDimensionalObject periodDimension =