From 677a60e1d92e53af6b56683bbbb390af14c7185a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Thu, 1 May 2025 22:30:03 +0200 Subject: [PATCH 1/3] fix: Update code --- pom.xml | 6 ++++ src/main/java/org/hisp/dhis/BaseDhis2.java | 23 ++++++++++--- .../dhis/query/analytics/AnalyticsQuery.java | 26 +++++++++++++++ .../dhis/{Dhis2Test.java => QueryTest.java} | 33 ++++++++++++------- 4 files changed, 73 insertions(+), 15 deletions(-) rename src/test/java/org/hisp/dhis/{Dhis2Test.java => QueryTest.java} (89%) diff --git a/pom.xml b/pom.xml index 2f3e9a2b..e92f8ecc 100644 --- a/pom.xml +++ b/pom.xml @@ -70,6 +70,7 @@ 3.5.2 2.18.0 3.17.0 + 4.5.0 2.44.3 @@ -89,6 +90,11 @@ commons-lang3 ${commons-lang3.version} + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + org.slf4j slf4j-api diff --git a/src/main/java/org/hisp/dhis/BaseDhis2.java b/src/main/java/org/hisp/dhis/BaseDhis2.java index 061ac3d8..2e5235e6 100644 --- a/src/main/java/org/hisp/dhis/BaseDhis2.java +++ b/src/main/java/org/hisp/dhis/BaseDhis2.java @@ -114,6 +114,8 @@ public class BaseDhis2 { protected static final String NAME_FIELDS = String.format("%s,shortName,description", ID_FIELDS); + private static final String SEP_DIM = ";"; + /** Option set fields. */ protected static final String OPTION_SET_FIELDS = String.format("%s,valueType,version", ID_FIELDS); @@ -170,7 +172,9 @@ public class BaseDhis2 { /** Indicator fields. */ protected static final String INDICATOR_FIELDS = String.format( - "%1$s,annualized,numerator,numeratorDescription,denominator,denominatorDescription,url,indicatorType[%2$s]", + """ + %1$s,annualized,numerator,numeratorDescription,\ + denominator,denominatorDescription,url,indicatorType[%2$s]""", NAME_FIELDS, INDICATOR_TYPE_FIELDS); /** Indicator group set fields. */ @@ -234,7 +238,9 @@ public class BaseDhis2 { /** Me / current user fields. */ protected static final String ME_FIELDS = String.format( - "%1$s,username,surname,firstName,email,settings,programs,dataSets,authorities,organisationUnits[%2$s]", + """ + %1$s,username,surname,firstName,email,settings,programs,\ + dataSets,authorities,organisationUnits[%2$s]""", ID_FIELDS, ORG_UNIT_FIELDS); /** Log level system property. */ @@ -259,8 +265,8 @@ public class BaseDhis2 { protected static final String VALIDATION_RULE_FIELDS = String.format( """ - %1$s,dimensionItem,instruction,importance,periodType,displayDescription,displayInstruction,displayName,\ - leftSide[%2$s],operator,rightSide[%2$s],skipFormValidation,legendSets""", + %1$s,dimensionItem,instruction,importance,periodType,displayDescription,displayInstruction,\ + displayName,leftSide[%2$s],operator,rightSide[%2$s],skipFormValidation,legendSets""", NAME_FIELDS, VALIDATION_SIDE_FIELDS); protected static final String DATA_SET_VALIDATION_FIELDS = @@ -439,6 +445,7 @@ protected URI getAnalyticsQuery(URIBuilder uriBuilder, AnalyticsQuery query) { addParameter(uriBuilder, "skipData", query.getSkipData()); addParameter(uriBuilder, "skipRounding", query.getSkipRounding()); addParameter(uriBuilder, "ignoreLimit", query.getIgnoreLimit()); + addParameter(uriBuilder, "tableLayout", query.getTableLayout()); addParameter(uriBuilder, "showHierarchy", query.getShowHierarchy()); addParameter(uriBuilder, "includeNumDen", query.getIncludeNumDen()); addParameter(uriBuilder, "includeMetadataDetails", query.getIncludeMetadataDetails()); @@ -447,6 +454,14 @@ protected URI getAnalyticsQuery(URIBuilder uriBuilder, AnalyticsQuery query) { addParameter(uriBuilder, "outputDataElementIdScheme", query.getOutputDataElementIdScheme()); addParameter(uriBuilder, "inputIdScheme", query.getInputIdScheme()); + if (query.hasColumns()) { + addParameter(uriBuilder, "columns", String.join(SEP_DIM, query.getColumns())); + } + + if (query.hasRows()) { + addParameter(uriBuilder, "rows", String.join(SEP_DIM, query.getRows())); + } + return HttpUtils.build(uriBuilder); } diff --git a/src/main/java/org/hisp/dhis/query/analytics/AnalyticsQuery.java b/src/main/java/org/hisp/dhis/query/analytics/AnalyticsQuery.java index 9e7faa54..50e2bc6e 100644 --- a/src/main/java/org/hisp/dhis/query/analytics/AnalyticsQuery.java +++ b/src/main/java/org/hisp/dhis/query/analytics/AnalyticsQuery.java @@ -27,6 +27,8 @@ */ package org.hisp.dhis.query.analytics; +import static org.apache.commons.collections4.CollectionUtils.isNotEmpty; + import java.util.ArrayList; import java.util.List; import lombok.Getter; @@ -58,6 +60,8 @@ public class AnalyticsQuery { private Boolean ignoreLimit; + private Boolean tableLayout; + private Boolean showHierarchy; private Boolean includeNumDen; @@ -72,6 +76,10 @@ public class AnalyticsQuery { private IdScheme inputIdScheme; + private List columns = new ArrayList<>(); + + private List rows = new ArrayList<>(); + private AnalyticsQuery() {} /** @@ -186,4 +194,22 @@ public AnalyticsQuery addPeriodFilter(List items) { public AnalyticsQuery addOrgUnitFilter(List items) { return addFilter(new Dimension(Dimension.DIMENSION_OU, items)); } + + /** + * Indicates whether any columns exist. + * + * @return true if any columns exist. + */ + public boolean hasColumns() { + return isNotEmpty(columns); + } + + /** + * Indicates whether any rows exist. + * + * @return true if any rows exist. + */ + public boolean hasRows() { + return isNotEmpty(rows); + } } diff --git a/src/test/java/org/hisp/dhis/Dhis2Test.java b/src/test/java/org/hisp/dhis/QueryTest.java similarity index 89% rename from src/test/java/org/hisp/dhis/Dhis2Test.java rename to src/test/java/org/hisp/dhis/QueryTest.java index 53b7c007..cbec3eb2 100644 --- a/src/test/java/org/hisp/dhis/Dhis2Test.java +++ b/src/test/java/org/hisp/dhis/QueryTest.java @@ -31,6 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.net.URI; +import java.util.List; import org.apache.hc.core5.net.URIBuilder; import org.hisp.dhis.model.AggregationType; import org.hisp.dhis.model.IdScheme; @@ -47,7 +48,7 @@ import org.junit.jupiter.api.Test; @Tag(TestTags.UNIT) -class Dhis2Test { +class QueryTest { @Test void testGetDhis2() { Dhis2Config config = getDhis2Config(); @@ -127,8 +128,10 @@ void testGetObjectQueryC() { URI uri = dhis2.getObjectQuery(uriBuilder, query); String expected = - "https://dhis2.org/api/dataSets?" - + "filter=name%3Alike%3AANC&page=1&pageSize=50&order=id%3Aasc"; + """ + https://dhis2.org/api/dataSets?\ + filter=name%3Alike%3AANC\ + &page=1&pageSize=50&order=id%3Aasc"""; assertEquals(expected, uri.toString()); } @@ -151,8 +154,10 @@ void testGetDataValueSetImportQuery() { URI uri = dhis2.getDataValueSetImportQuery(uriBuilder, options); String expected = - "https://dhis2.org/api/dataValueSets?" - + "async=true&dataElementIdScheme=code&dryRun=true&preheatCache=true&skipAudit=true"; + """ + https://dhis2.org/api/dataValueSets?\ + async=true&dataElementIdScheme=code&\ + dryRun=true&preheatCache=true&skipAudit=true"""; assertEquals(expected, uri.toString()); } @@ -170,7 +175,8 @@ void testGetAnalyticsQuery() { .setAggregationType(AggregationType.AVERAGE) .setIgnoreLimit(true) .setInputIdScheme(IdScheme.CODE) - .setOutputIdScheme(IdScheme.UID); + .setOutputIdScheme(IdScheme.UID) + .setColumns(List.of("dx", "pe")); URI uri = dhis2.getAnalyticsQuery(uriBuilder, query); @@ -180,7 +186,8 @@ void testGetAnalyticsQuery() { aggregationType=AVERAGE\ &ignoreLimit=true\ &outputIdScheme=uid\ - &inputIdScheme=code"""; + &inputIdScheme=code\ + &columns=dx%3Bpe"""; assertEquals(expected, uri.toString()); } @@ -204,8 +211,10 @@ void testGetEventsQuery() { URI uri = dhis2.getEventsQuery(uriBuilder, query); String expected = - "https://dhis2.org/api/tracker/events?" - + "program=hJhgt5cDs7j&programStatus=ACTIVE&followUp=true&idScheme=code"; + """ + https://dhis2.org/api/tracker/events?\ + program=hJhgt5cDs7j&programStatus=ACTIVE\ + &followUp=true&idScheme=code"""; assertEquals(expected, uri.toString()); } @@ -226,8 +235,10 @@ void testGetDataValueSetQuery() { .setChildren(true); String expected = - "https://dhis2.org/api/dataValueSets.json?" - + "dataElement=N9vniUuCcqY&orgUnit=ImspTQPwCqd&period=202211&children=true"; + """ + https://dhis2.org/api/dataValueSets.json?\ + dataElement=N9vniUuCcqY&orgUnit=ImspTQPwCqd\ + &period=202211&children=true"""; URI uri = dhis2.getDataValueSetQuery(uriBuilder, query); From 59bd52c05d5093efb17c309dd477a4f43ef374d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 2 May 2025 13:00:14 +0200 Subject: [PATCH 2/3] fix: Update code --- src/test/java/org/hisp/dhis/util/UidUtilsTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/org/hisp/dhis/util/UidUtilsTest.java b/src/test/java/org/hisp/dhis/util/UidUtilsTest.java index 5f249fa3..995226fe 100644 --- a/src/test/java/org/hisp/dhis/util/UidUtilsTest.java +++ b/src/test/java/org/hisp/dhis/util/UidUtilsTest.java @@ -32,7 +32,6 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; - import java.util.stream.IntStream; import org.hisp.dhis.support.TestTags; import org.junit.jupiter.api.Tag; @@ -92,7 +91,7 @@ void testToUidDeterminisism() { /** * Asserts that the method generates a valid UID based on the given identifier. * - * @param uid + * @param input the input string. */ private void assertToUid(String input) { String output = UidUtils.toUid(input); From ca8d9923ef36be4818ba71fe3f01343a26d16396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 2 May 2025 13:02:02 +0200 Subject: [PATCH 3/3] fix: Update code --- .../java/org/hisp/dhis/query/analytics/AnalyticsQuery.java | 6 +++++- src/main/java/org/hisp/dhis/query/analytics/Dimension.java | 5 +++++ .../CompleteDataSetRegistrationQuery.java | 1 + src/test/java/org/hisp/dhis/util/UidUtilsTest.java | 1 + 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/hisp/dhis/query/analytics/AnalyticsQuery.java b/src/main/java/org/hisp/dhis/query/analytics/AnalyticsQuery.java index 50e2bc6e..f7865e2b 100644 --- a/src/main/java/org/hisp/dhis/query/analytics/AnalyticsQuery.java +++ b/src/main/java/org/hisp/dhis/query/analytics/AnalyticsQuery.java @@ -37,7 +37,11 @@ import org.hisp.dhis.model.AggregationType; import org.hisp.dhis.model.IdScheme; -/** Analytics data query. */ +/** + * Analytics data query. + * + * @author Lars Helge Overland + */ @Getter @Setter @Accessors(chain = true) diff --git a/src/main/java/org/hisp/dhis/query/analytics/Dimension.java b/src/main/java/org/hisp/dhis/query/analytics/Dimension.java index 050df566..14d33a7a 100644 --- a/src/main/java/org/hisp/dhis/query/analytics/Dimension.java +++ b/src/main/java/org/hisp/dhis/query/analytics/Dimension.java @@ -33,6 +33,11 @@ import lombok.Setter; import org.apache.commons.lang3.StringUtils; +/** + * Analytics dimension. + * + * @author Lars Helge Overland + */ @Getter @Setter @RequiredArgsConstructor diff --git a/src/main/java/org/hisp/dhis/query/completedatasetregistration/CompleteDataSetRegistrationQuery.java b/src/main/java/org/hisp/dhis/query/completedatasetregistration/CompleteDataSetRegistrationQuery.java index 3d3832e8..6edb4e0a 100644 --- a/src/main/java/org/hisp/dhis/query/completedatasetregistration/CompleteDataSetRegistrationQuery.java +++ b/src/main/java/org/hisp/dhis/query/completedatasetregistration/CompleteDataSetRegistrationQuery.java @@ -35,6 +35,7 @@ import lombok.experimental.Accessors; import org.hisp.dhis.model.IdScheme; +/** Complete data set registration. */ @Getter @Setter @Accessors(chain = true) diff --git a/src/test/java/org/hisp/dhis/util/UidUtilsTest.java b/src/test/java/org/hisp/dhis/util/UidUtilsTest.java index 995226fe..668f7d6c 100644 --- a/src/test/java/org/hisp/dhis/util/UidUtilsTest.java +++ b/src/test/java/org/hisp/dhis/util/UidUtilsTest.java @@ -32,6 +32,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; + import java.util.stream.IntStream; import org.hisp.dhis.support.TestTags; import org.junit.jupiter.api.Tag;