From af49a2671250e4cca04c4785197bb15882e6b097 Mon Sep 17 00:00:00 2001 From: zubaira Date: Fri, 19 Sep 2025 09:48:22 +0200 Subject: [PATCH 1/7] refact: Use SupplementaryKey instead of raw Strings --- build.gradle.kts | 2 +- .../dhis/lib/expression/eval/Calculator.kt | 19 +++++- .../dhis/lib/expression/spi/DynamicKey.kt | 14 ++++ .../dhis/lib/expression/spi/ExpressionData.kt | 2 +- .../hisp/dhis/lib/expression/spi/FixedKey.kt | 15 ++++ .../lib/expression/spi/SupplementaryKey.kt | 22 ++++++ .../expression/function/HasUserRoleTest.kt | 28 ++++++-- .../expression/function/InOrgUnitGroupTest.kt | 68 ++++++++++++++----- .../expression/function/InUserGroupTest.kt | 10 +-- 9 files changed, 148 insertions(+), 32 deletions(-) create mode 100644 src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/DynamicKey.kt create mode 100644 src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/FixedKey.kt create mode 100644 src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/SupplementaryKey.kt diff --git a/build.gradle.kts b/build.gradle.kts index 7bf746e..abaa1b4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ repositories { mavenCentral() } -version = "1.1.12-SNAPSHOT" +version = "1.2.0-SNAPSHOT" group = "org.hisp.dhis.lib.expression" if (project.hasProperty("removeSnapshotSuffix")) { diff --git a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/eval/Calculator.kt b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/eval/Calculator.kt index d5494cd..808bcbb 100644 --- a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/eval/Calculator.kt +++ b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/eval/Calculator.kt @@ -92,10 +92,10 @@ internal class Calculator( NamedFunction.d2_floor -> functions.d2_floor(evalToNumber(fn.child(0))) NamedFunction.d2_hasUserRole -> functions.d2_hasUserRole( evalToString(fn.child(0)), - data.supplementaryValues["USER_ROLES"]) + data.supplementaryValues[SupplementaryKey.Fixed(FixedKey.USER_ROLES)]) NamedFunction.d2_inUserGroup -> functions.d2_inUserGroup( evalToString(fn.child(0)), - data.supplementaryValues["USER_GROUPS"]) + data.supplementaryValues[SupplementaryKey.Fixed(FixedKey.USER_GROUPS)]) NamedFunction.d2_hasValue -> try { functions.d2_hasValue(evalToVar(fn.child(0))) } catch (e: IllegalExpressionException) { @@ -104,7 +104,7 @@ internal class Calculator( NamedFunction.d2_inOrgUnitGroup -> functions.d2_inOrgUnitGroup( evalToString(fn.child(0)), data.programRuleVariableValues["org_unit"], - data.supplementaryValues) + extractOrgUnitGroupSetData(data.supplementaryValues)) NamedFunction.d2_lastEventDate -> functions.d2_lastEventDate( evalToVar(fn.child(0))) NamedFunction.d2_left -> functions.d2_left( @@ -180,6 +180,19 @@ internal class Calculator( } } + private fun extractOrgUnitGroupSetData( + data: Map> + ): Map> { + return data + .filterKeys { key -> + key is SupplementaryKey.Dynamic && + key.type == DynamicKey.ORG_UNIT_GROUP_SET + } + .mapKeys { (key, _) -> + (key as SupplementaryKey.Dynamic).uid + } + } + private fun evalAggFunction(fn: Node): Double? { val items: MutableList = mutableListOf() fn.child(0).visit(NodeType.DATA_ITEM) { node: Node<*> -> diff --git a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/DynamicKey.kt b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/DynamicKey.kt new file mode 100644 index 0000000..ab10ed0 --- /dev/null +++ b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/DynamicKey.kt @@ -0,0 +1,14 @@ +package org.hisp.dhis.lib.expression.spi + +/** + * Enumeration of dynamic supplementary keys that depend on metadata objects. + * + * For example, [DynamicKey.ORG_UNIT_GROUP_SET] represents the UID of an + * organisation unit group set, which is used by expressions like + * d2:inOrgUnitGroup(). + * + * @author Zubair Asghar + */ +enum class DynamicKey { + ORG_UNIT_GROUP_SET +} \ No newline at end of file diff --git a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/ExpressionData.kt b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/ExpressionData.kt index 5e7e7c5..851fdf4 100644 --- a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/ExpressionData.kt +++ b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/ExpressionData.kt @@ -9,7 +9,7 @@ package org.hisp.dhis.lib.expression.spi data class ExpressionData( val programRuleVariableValues: Map, val programVariableValues: Map, - val supplementaryValues: Map>, + val supplementaryValues: Map>, val dataItemValues: Map, val namedValues: Map ) { diff --git a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/FixedKey.kt b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/FixedKey.kt new file mode 100644 index 0000000..5e4c07f --- /dev/null +++ b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/FixedKey.kt @@ -0,0 +1,15 @@ +package org.hisp.dhis.lib.expression.spi + +/** + * Enumeration of fixed supplementary keys that are always available + * in the system and do not depend on external metadata. + * + * Used to store data like user roles or user groups in expressions + * (e.g., d2:hasUserRole()). + * + * @author Zubair Asghar + */ +enum class FixedKey { + USER_ROLES, + USER_GROUPS +} \ No newline at end of file diff --git a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/SupplementaryKey.kt b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/SupplementaryKey.kt new file mode 100644 index 0000000..6095eb6 --- /dev/null +++ b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/SupplementaryKey.kt @@ -0,0 +1,22 @@ +package org.hisp.dhis.lib.expression.spi + +/** + * Supplementary keys provide extra contextual data (like user roles, user groups, + * or membership in organisation unit groups) that cannot be derived from + * the tracked entity or event data alone. + * + * This key can be either [Fixed], for well-defined values for example user roles, + * or [Dynamic], for metadata-driven keys (e.g., organisation unit group sets). + * + * @author Zubair Asghar + */ +sealed class SupplementaryKey { + data class Fixed( + val type: FixedKey + ) : SupplementaryKey() + + data class Dynamic( + val type: DynamicKey, + val uid: String + ) : SupplementaryKey() +} diff --git a/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/HasUserRoleTest.kt b/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/HasUserRoleTest.kt index c9ae64b..af238e5 100644 --- a/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/HasUserRoleTest.kt +++ b/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/HasUserRoleTest.kt @@ -3,7 +3,9 @@ package org.hisp.dhis.lib.expression.function import org.hisp.dhis.lib.expression.Expression import org.hisp.dhis.lib.expression.ExpressionMode import org.hisp.dhis.lib.expression.spi.ExpressionData +import org.hisp.dhis.lib.expression.spi.FixedKey import org.hisp.dhis.lib.expression.spi.IllegalExpressionException +import org.hisp.dhis.lib.expression.spi.SupplementaryKey import kotlin.test.* /** @@ -15,7 +17,8 @@ internal class HasUserRoleTest { @Test fun testHasUserRole_Null() { - assertFalse(evaluate("d2:hasUserRole(null)", mapOf("USER_ROLES" to listOf("admin")))) + assertFalse(evaluate("d2:hasUserRole(null)",mapOf(SupplementaryKey.Fixed(FixedKey.USER_ROLES) to listOf("admin")) + )) } @Test @@ -26,12 +29,27 @@ internal class HasUserRoleTest { @Test fun testHasUserRole() { - assertTrue(evaluate("d2:hasUserRole(\"admin\")", mapOf("USER_ROLES" to listOf("admin")))) - assertFalse(evaluate("d2:hasUserRole(\"admin\")", mapOf("USER_ROLES" to listOf("guest")))) - assertTrue(evaluate("d2:hasUserRole(\"admin\")", mapOf("USER_ROLES" to listOf("foo","admin")))) + assertTrue( + evaluate( + "d2:hasUserRole(\"admin\")", + mapOf(SupplementaryKey.Fixed(FixedKey.USER_ROLES) to listOf("admin")) + ) + ) + assertFalse( + evaluate( + "d2:hasUserRole(\"admin\")", + mapOf(SupplementaryKey.Fixed(FixedKey.USER_ROLES) to listOf("guest")) + ) + ) + assertTrue( + evaluate( + "d2:hasUserRole(\"admin\")", + mapOf(SupplementaryKey.Fixed(FixedKey.USER_ROLES) to listOf("foo", "admin")) + ) + ) } - private fun evaluate(expression: String, supplementaryValues: Map>): Boolean { + private fun evaluate(expression: String, supplementaryValues: Map>): Boolean { val data: ExpressionData = ExpressionData().copy(supplementaryValues = supplementaryValues) return Expression(expression, ExpressionMode.RULE_ENGINE_ACTION).evaluate( { _: String -> null }, data) as Boolean } diff --git a/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InOrgUnitGroupTest.kt b/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InOrgUnitGroupTest.kt index ef9d168..8fb8dd6 100644 --- a/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InOrgUnitGroupTest.kt +++ b/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InOrgUnitGroupTest.kt @@ -2,9 +2,7 @@ package org.hisp.dhis.lib.expression.function import org.hisp.dhis.lib.expression.Expression import org.hisp.dhis.lib.expression.ExpressionMode -import org.hisp.dhis.lib.expression.spi.ExpressionData -import org.hisp.dhis.lib.expression.spi.ValueType -import org.hisp.dhis.lib.expression.spi.VariableValue +import org.hisp.dhis.lib.expression.spi.* import kotlin.test.Test import kotlin.test.assertFalse import kotlin.test.assertTrue @@ -18,39 +16,73 @@ internal class InOrgUnitGroupTest { @Test fun testInOrgUnitGroup_Null() { - val supplementaryValues = mapOf("uidougroup0" to listOf("uiduser0001", "uiduser0001")) - val programRuleVariableValues = mapOf("org_unit" to VariableValue(ValueType.STRING)) - assertFalse(evaluate("d2:inOrgUnitGroup(null)", supplementaryValues, programRuleVariableValues)) + val programRuleVariableValues = + mapOf("org_unit" to VariableValue(ValueType.STRING)) + assertFalse( + evaluate( + "d2:inOrgUnitGroup(null)", + mapOf( + SupplementaryKey.Dynamic(DynamicKey.ORG_UNIT_GROUP_SET, "uidougroup0") to + listOf("uiduser0001", "uiduser0001") + ), + programRuleVariableValues + ) + ) } @Test fun testInOrgUnitGroup() { - val supplementaryValues = mapOf("uidougroup0" to listOf("uiduser0001", "uiduser0002")) - val programRuleVariableValues = mapOf("org_unit" to VariableValue(ValueType.STRING).copy(value = "uiduser0001")) - assertTrue(evaluate("d2:inOrgUnitGroup(\"uidougroup0\")", supplementaryValues, programRuleVariableValues)) - + val programRuleVariableValues = + mapOf("org_unit" to VariableValue(ValueType.STRING).copy(value = "uiduser0001")) + assertTrue( + evaluate( + "d2:inOrgUnitGroup(\"uidougroup0\")", + mapOf( + SupplementaryKey.Dynamic(DynamicKey.ORG_UNIT_GROUP_SET, "uidougroup0") to + listOf("uiduser0001", "uiduser0002") + ), + programRuleVariableValues + ) + ) } @Test fun testInOrgUnitGroup_GroupNotDefined() { - val programRuleVariableValues = mapOf("org_unit" to VariableValue(ValueType.STRING).copy(value = "uiduser0001")) - assertFalse(evaluate("d2:inOrgUnitGroup(\"uidougroup5\")", mapOf(), programRuleVariableValues)) + val programRuleVariableValues = + mapOf("org_unit" to VariableValue(ValueType.STRING).copy(value = "uiduser0001")) + assertFalse( + evaluate( + "d2:inOrgUnitGroup(\"uidougroup5\")", + emptyMap(), + programRuleVariableValues + ) + ) } @Test fun testInOrgUnitGroup_OrgUnitNotDefined() { - val supplementaryValues = mapOf("uidougroup0" to listOf("uiduser0001", "uiduser0002")) - assertFalse(evaluate("d2:inOrgUnitGroup(\"uidougroup0\")", supplementaryValues, mapOf())) + assertFalse( + evaluate( + "d2:inOrgUnitGroup(\"uidougroup0\")", + mapOf( + SupplementaryKey.Dynamic(DynamicKey.ORG_UNIT_GROUP_SET, "uidougroup0") to + listOf("uiduser0001", "uiduser0002") + ), + emptyMap() + ) + ) } private fun evaluate( expression: String, - supplementaryValues: Map>, + supplementaryValues: Map>, programRuleVariableValues: Map ): Boolean { val data: ExpressionData = ExpressionData().copy( supplementaryValues = supplementaryValues, - programRuleVariableValues = programRuleVariableValues) - return Expression(expression, ExpressionMode.RULE_ENGINE_ACTION).evaluate( { _: String -> null }, data) as Boolean + programRuleVariableValues = programRuleVariableValues + ) + return Expression(expression, ExpressionMode.RULE_ENGINE_ACTION) + .evaluate({ _: String -> null }, data) as Boolean } -} \ No newline at end of file +} diff --git a/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InUserGroupTest.kt b/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InUserGroupTest.kt index 87275aa..7b6e275 100644 --- a/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InUserGroupTest.kt +++ b/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InUserGroupTest.kt @@ -3,7 +3,9 @@ package org.hisp.dhis.lib.expression.function import org.hisp.dhis.lib.expression.Expression import org.hisp.dhis.lib.expression.ExpressionMode import org.hisp.dhis.lib.expression.spi.ExpressionData +import org.hisp.dhis.lib.expression.spi.FixedKey import org.hisp.dhis.lib.expression.spi.IllegalExpressionException +import org.hisp.dhis.lib.expression.spi.SupplementaryKey import kotlin.test.* /** @@ -15,7 +17,7 @@ internal class InUserGroupTest { @Test fun testInUserGroup_Null() { - assertFalse(evaluate("d2:inUserGroup(null)", mapOf("USER_GROUPS" to listOf("uidusgroup0")))) + assertFalse(evaluate("d2:inUserGroup(null)", mapOf(SupplementaryKey.Fixed(FixedKey.USER_GROUPS) to listOf("uidusgroup0")))) } @Test @@ -26,11 +28,11 @@ internal class InUserGroupTest { @Test fun testInUserGroup() { - assertTrue(evaluate("d2:inUserGroup(\"uidusgroup0\")", mapOf("USER_GROUPS" to listOf("uidusgroup0")))) - assertFalse(evaluate("d2:inUserGroup(\"uidusgroup0\")", mapOf("USER_GROUPS" to listOf("uidusgroup1")))) + assertTrue(evaluate("d2:inUserGroup(\"uidusgroup0\")", mapOf(SupplementaryKey.Fixed(FixedKey.USER_GROUPS) to listOf("uidusgroup0")))) + assertFalse(evaluate("d2:inUserGroup(\"uidusgroup0\")", mapOf(SupplementaryKey.Fixed(FixedKey.USER_GROUPS) to listOf("uidusgroup1")))) } - private fun evaluate(expression: String, supplementaryValues: Map>): Boolean { + private fun evaluate(expression: String, supplementaryValues: Map>): Boolean { val data: ExpressionData = ExpressionData().copy(supplementaryValues = supplementaryValues) return Expression(expression, ExpressionMode.RULE_ENGINE_ACTION).evaluate( { _: String -> null }, data) as Boolean } From 094403961c124531595c69f061faa10502066424 Mon Sep 17 00:00:00 2001 From: zubaira Date: Fri, 19 Sep 2025 10:17:05 +0200 Subject: [PATCH 2/7] fix error --- .../ExpressionJs.kt | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/jsMain/kotlin/org.hisp.dhis.lib.expression.js/ExpressionJs.kt b/src/jsMain/kotlin/org.hisp.dhis.lib.expression.js/ExpressionJs.kt index ca036fa..bfddd10 100644 --- a/src/jsMain/kotlin/org.hisp.dhis.lib.expression.js/ExpressionJs.kt +++ b/src/jsMain/kotlin/org.hisp.dhis.lib.expression.js/ExpressionJs.kt @@ -121,7 +121,11 @@ class ExpressionJs(expression: String, mode: ExpressionMode) { return org.hisp.dhis.lib.expression.spi.ExpressionData( programRuleVariableValues = toMap(data.programRuleVariableValues, {it}, ::toVariableValueJava), programVariableValues = toMap(data.programVariableValues, {it}, {it}), - supplementaryValues = toMap(data.supplementaryValues, {it}, {v -> v.toList()}), + supplementaryValues = toMap( + data.supplementaryValues, + { key -> toSupplementaryKey(key) }, + { v -> v.toList() } + ), dataItemValues = toMap(data.dataItemValues, ::toDataItemJava) { it }, namedValues = toMap(data.namedValues, {it}, {it})) } @@ -136,6 +140,21 @@ class ExpressionJs(expression: String, mode: ExpressionMode) { } } +private fun toSupplementaryKey(key: String): org.hisp.dhis.lib.expression.spi.SupplementaryKey { + return when (key) { + "USER_ROLES" -> org.hisp.dhis.lib.expression.spi.SupplementaryKey.Fixed( + org.hisp.dhis.lib.expression.spi.FixedKey.USER_ROLES + ) + "USER_GROUPS" -> org.hisp.dhis.lib.expression.spi.SupplementaryKey.Fixed( + org.hisp.dhis.lib.expression.spi.FixedKey.USER_GROUPS + ) + else -> org.hisp.dhis.lib.expression.spi.SupplementaryKey.Dynamic( + org.hisp.dhis.lib.expression.spi.DynamicKey.ORG_UNIT_GROUP_SET, + key + ) + } +} + private fun String.map(transform: (String) -> T): T { return transform(this) } From 3da5fe88f35b55a584a2e614f6a84cd6b3b60098 Mon Sep 17 00:00:00 2001 From: zubaira Date: Fri, 19 Sep 2025 10:22:00 +0200 Subject: [PATCH 3/7] update api --- api/expression-parser.api | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/api/expression-parser.api b/api/expression-parser.api index 759b6b2..632c430 100644 --- a/api/expression-parser.api +++ b/api/expression-parser.api @@ -1347,6 +1347,13 @@ public final class org/hisp/dhis/lib/expression/spi/DataItemType$Companion { public final fun fromSymbol (Ljava/lang/String;)Lorg/hisp/dhis/lib/expression/spi/DataItemType; } +public final class org/hisp/dhis/lib/expression/spi/DynamicKey : java/lang/Enum { + public static final field ORG_UNIT_GROUP_SET Lorg/hisp/dhis/lib/expression/spi/DynamicKey; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lorg/hisp/dhis/lib/expression/spi/DynamicKey; + public static fun values ()[Lorg/hisp/dhis/lib/expression/spi/DynamicKey; +} + public final class org/hisp/dhis/lib/expression/spi/ExpressionData { public fun ()V public fun (Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V @@ -1490,6 +1497,14 @@ public final class org/hisp/dhis/lib/expression/spi/ExpressionFunctions$DefaultI public static fun variance (Lorg/hisp/dhis/lib/expression/spi/ExpressionFunctions;[D)Ljava/lang/Double; } +public final class org/hisp/dhis/lib/expression/spi/FixedKey : java/lang/Enum { + public static final field USER_GROUPS Lorg/hisp/dhis/lib/expression/spi/FixedKey; + public static final field USER_ROLES Lorg/hisp/dhis/lib/expression/spi/FixedKey; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lorg/hisp/dhis/lib/expression/spi/FixedKey; + public static fun values ()[Lorg/hisp/dhis/lib/expression/spi/FixedKey; +} + public final class org/hisp/dhis/lib/expression/spi/ID { public fun (Lorg/hisp/dhis/lib/expression/spi/IDType;Ljava/lang/String;)V public final fun component1 ()Lorg/hisp/dhis/lib/expression/spi/IDType; @@ -1633,6 +1648,33 @@ public final class org/hisp/dhis/lib/expression/spi/QueryModifiers { public fun toString ()Ljava/lang/String; } +public abstract class org/hisp/dhis/lib/expression/spi/SupplementaryKey { +} + +public final class org/hisp/dhis/lib/expression/spi/SupplementaryKey$Dynamic : org/hisp/dhis/lib/expression/spi/SupplementaryKey { + public fun (Lorg/hisp/dhis/lib/expression/spi/DynamicKey;Ljava/lang/String;)V + public final fun component1 ()Lorg/hisp/dhis/lib/expression/spi/DynamicKey; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Lorg/hisp/dhis/lib/expression/spi/DynamicKey;Ljava/lang/String;)Lorg/hisp/dhis/lib/expression/spi/SupplementaryKey$Dynamic; + public static synthetic fun copy$default (Lorg/hisp/dhis/lib/expression/spi/SupplementaryKey$Dynamic;Lorg/hisp/dhis/lib/expression/spi/DynamicKey;Ljava/lang/String;ILjava/lang/Object;)Lorg/hisp/dhis/lib/expression/spi/SupplementaryKey$Dynamic; + public fun equals (Ljava/lang/Object;)Z + public final fun getType ()Lorg/hisp/dhis/lib/expression/spi/DynamicKey; + public final fun getUid ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class org/hisp/dhis/lib/expression/spi/SupplementaryKey$Fixed : org/hisp/dhis/lib/expression/spi/SupplementaryKey { + public fun (Lorg/hisp/dhis/lib/expression/spi/FixedKey;)V + public final fun component1 ()Lorg/hisp/dhis/lib/expression/spi/FixedKey; + public final fun copy (Lorg/hisp/dhis/lib/expression/spi/FixedKey;)Lorg/hisp/dhis/lib/expression/spi/SupplementaryKey$Fixed; + public static synthetic fun copy$default (Lorg/hisp/dhis/lib/expression/spi/SupplementaryKey$Fixed;Lorg/hisp/dhis/lib/expression/spi/FixedKey;ILjava/lang/Object;)Lorg/hisp/dhis/lib/expression/spi/SupplementaryKey$Fixed; + public fun equals (Ljava/lang/Object;)Z + public final fun getType ()Lorg/hisp/dhis/lib/expression/spi/FixedKey; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + public final class org/hisp/dhis/lib/expression/spi/ValueType : java/lang/Enum { public static final field BOOLEAN Lorg/hisp/dhis/lib/expression/spi/ValueType; public static final field Companion Lorg/hisp/dhis/lib/expression/spi/ValueType$Companion; From cc8f494fb2917a65c7e60c902ed296bef092a847 Mon Sep 17 00:00:00 2001 From: zubaira Date: Fri, 19 Sep 2025 12:24:33 +0200 Subject: [PATCH 4/7] Revert "update api" This reverts commit 3da5fe88f35b55a584a2e614f6a84cd6b3b60098. --- api/expression-parser.api | 42 --------------------------------------- 1 file changed, 42 deletions(-) diff --git a/api/expression-parser.api b/api/expression-parser.api index 632c430..759b6b2 100644 --- a/api/expression-parser.api +++ b/api/expression-parser.api @@ -1347,13 +1347,6 @@ public final class org/hisp/dhis/lib/expression/spi/DataItemType$Companion { public final fun fromSymbol (Ljava/lang/String;)Lorg/hisp/dhis/lib/expression/spi/DataItemType; } -public final class org/hisp/dhis/lib/expression/spi/DynamicKey : java/lang/Enum { - public static final field ORG_UNIT_GROUP_SET Lorg/hisp/dhis/lib/expression/spi/DynamicKey; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public static fun valueOf (Ljava/lang/String;)Lorg/hisp/dhis/lib/expression/spi/DynamicKey; - public static fun values ()[Lorg/hisp/dhis/lib/expression/spi/DynamicKey; -} - public final class org/hisp/dhis/lib/expression/spi/ExpressionData { public fun ()V public fun (Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V @@ -1497,14 +1490,6 @@ public final class org/hisp/dhis/lib/expression/spi/ExpressionFunctions$DefaultI public static fun variance (Lorg/hisp/dhis/lib/expression/spi/ExpressionFunctions;[D)Ljava/lang/Double; } -public final class org/hisp/dhis/lib/expression/spi/FixedKey : java/lang/Enum { - public static final field USER_GROUPS Lorg/hisp/dhis/lib/expression/spi/FixedKey; - public static final field USER_ROLES Lorg/hisp/dhis/lib/expression/spi/FixedKey; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public static fun valueOf (Ljava/lang/String;)Lorg/hisp/dhis/lib/expression/spi/FixedKey; - public static fun values ()[Lorg/hisp/dhis/lib/expression/spi/FixedKey; -} - public final class org/hisp/dhis/lib/expression/spi/ID { public fun (Lorg/hisp/dhis/lib/expression/spi/IDType;Ljava/lang/String;)V public final fun component1 ()Lorg/hisp/dhis/lib/expression/spi/IDType; @@ -1648,33 +1633,6 @@ public final class org/hisp/dhis/lib/expression/spi/QueryModifiers { public fun toString ()Ljava/lang/String; } -public abstract class org/hisp/dhis/lib/expression/spi/SupplementaryKey { -} - -public final class org/hisp/dhis/lib/expression/spi/SupplementaryKey$Dynamic : org/hisp/dhis/lib/expression/spi/SupplementaryKey { - public fun (Lorg/hisp/dhis/lib/expression/spi/DynamicKey;Ljava/lang/String;)V - public final fun component1 ()Lorg/hisp/dhis/lib/expression/spi/DynamicKey; - public final fun component2 ()Ljava/lang/String; - public final fun copy (Lorg/hisp/dhis/lib/expression/spi/DynamicKey;Ljava/lang/String;)Lorg/hisp/dhis/lib/expression/spi/SupplementaryKey$Dynamic; - public static synthetic fun copy$default (Lorg/hisp/dhis/lib/expression/spi/SupplementaryKey$Dynamic;Lorg/hisp/dhis/lib/expression/spi/DynamicKey;Ljava/lang/String;ILjava/lang/Object;)Lorg/hisp/dhis/lib/expression/spi/SupplementaryKey$Dynamic; - public fun equals (Ljava/lang/Object;)Z - public final fun getType ()Lorg/hisp/dhis/lib/expression/spi/DynamicKey; - public final fun getUid ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class org/hisp/dhis/lib/expression/spi/SupplementaryKey$Fixed : org/hisp/dhis/lib/expression/spi/SupplementaryKey { - public fun (Lorg/hisp/dhis/lib/expression/spi/FixedKey;)V - public final fun component1 ()Lorg/hisp/dhis/lib/expression/spi/FixedKey; - public final fun copy (Lorg/hisp/dhis/lib/expression/spi/FixedKey;)Lorg/hisp/dhis/lib/expression/spi/SupplementaryKey$Fixed; - public static synthetic fun copy$default (Lorg/hisp/dhis/lib/expression/spi/SupplementaryKey$Fixed;Lorg/hisp/dhis/lib/expression/spi/FixedKey;ILjava/lang/Object;)Lorg/hisp/dhis/lib/expression/spi/SupplementaryKey$Fixed; - public fun equals (Ljava/lang/Object;)Z - public final fun getType ()Lorg/hisp/dhis/lib/expression/spi/FixedKey; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - public final class org/hisp/dhis/lib/expression/spi/ValueType : java/lang/Enum { public static final field BOOLEAN Lorg/hisp/dhis/lib/expression/spi/ValueType; public static final field Companion Lorg/hisp/dhis/lib/expression/spi/ValueType$Companion; From 60dad04c3f55f1cc9342da453d2e2b910b59227f Mon Sep 17 00:00:00 2001 From: zubaira Date: Fri, 19 Sep 2025 12:24:35 +0200 Subject: [PATCH 5/7] Revert "fix error" This reverts commit 094403961c124531595c69f061faa10502066424. --- .../ExpressionJs.kt | 21 +------------------ 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/src/jsMain/kotlin/org.hisp.dhis.lib.expression.js/ExpressionJs.kt b/src/jsMain/kotlin/org.hisp.dhis.lib.expression.js/ExpressionJs.kt index bfddd10..ca036fa 100644 --- a/src/jsMain/kotlin/org.hisp.dhis.lib.expression.js/ExpressionJs.kt +++ b/src/jsMain/kotlin/org.hisp.dhis.lib.expression.js/ExpressionJs.kt @@ -121,11 +121,7 @@ class ExpressionJs(expression: String, mode: ExpressionMode) { return org.hisp.dhis.lib.expression.spi.ExpressionData( programRuleVariableValues = toMap(data.programRuleVariableValues, {it}, ::toVariableValueJava), programVariableValues = toMap(data.programVariableValues, {it}, {it}), - supplementaryValues = toMap( - data.supplementaryValues, - { key -> toSupplementaryKey(key) }, - { v -> v.toList() } - ), + supplementaryValues = toMap(data.supplementaryValues, {it}, {v -> v.toList()}), dataItemValues = toMap(data.dataItemValues, ::toDataItemJava) { it }, namedValues = toMap(data.namedValues, {it}, {it})) } @@ -140,21 +136,6 @@ class ExpressionJs(expression: String, mode: ExpressionMode) { } } -private fun toSupplementaryKey(key: String): org.hisp.dhis.lib.expression.spi.SupplementaryKey { - return when (key) { - "USER_ROLES" -> org.hisp.dhis.lib.expression.spi.SupplementaryKey.Fixed( - org.hisp.dhis.lib.expression.spi.FixedKey.USER_ROLES - ) - "USER_GROUPS" -> org.hisp.dhis.lib.expression.spi.SupplementaryKey.Fixed( - org.hisp.dhis.lib.expression.spi.FixedKey.USER_GROUPS - ) - else -> org.hisp.dhis.lib.expression.spi.SupplementaryKey.Dynamic( - org.hisp.dhis.lib.expression.spi.DynamicKey.ORG_UNIT_GROUP_SET, - key - ) - } -} - private fun String.map(transform: (String) -> T): T { return transform(this) } From 8ac4d69162b5464ad0718b91a70e145f9f59f91e Mon Sep 17 00:00:00 2001 From: zubaira Date: Fri, 19 Sep 2025 12:24:38 +0200 Subject: [PATCH 6/7] Revert "refact: Use SupplementaryKey instead of raw Strings" This reverts commit af49a2671250e4cca04c4785197bb15882e6b097. --- build.gradle.kts | 2 +- .../dhis/lib/expression/eval/Calculator.kt | 19 +----- .../dhis/lib/expression/spi/DynamicKey.kt | 14 ---- .../dhis/lib/expression/spi/ExpressionData.kt | 2 +- .../hisp/dhis/lib/expression/spi/FixedKey.kt | 15 ---- .../lib/expression/spi/SupplementaryKey.kt | 22 ------ .../expression/function/HasUserRoleTest.kt | 28 ++------ .../expression/function/InOrgUnitGroupTest.kt | 68 +++++-------------- .../expression/function/InUserGroupTest.kt | 10 ++- 9 files changed, 32 insertions(+), 148 deletions(-) delete mode 100644 src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/DynamicKey.kt delete mode 100644 src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/FixedKey.kt delete mode 100644 src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/SupplementaryKey.kt diff --git a/build.gradle.kts b/build.gradle.kts index abaa1b4..7bf746e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ repositories { mavenCentral() } -version = "1.2.0-SNAPSHOT" +version = "1.1.12-SNAPSHOT" group = "org.hisp.dhis.lib.expression" if (project.hasProperty("removeSnapshotSuffix")) { diff --git a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/eval/Calculator.kt b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/eval/Calculator.kt index 808bcbb..d5494cd 100644 --- a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/eval/Calculator.kt +++ b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/eval/Calculator.kt @@ -92,10 +92,10 @@ internal class Calculator( NamedFunction.d2_floor -> functions.d2_floor(evalToNumber(fn.child(0))) NamedFunction.d2_hasUserRole -> functions.d2_hasUserRole( evalToString(fn.child(0)), - data.supplementaryValues[SupplementaryKey.Fixed(FixedKey.USER_ROLES)]) + data.supplementaryValues["USER_ROLES"]) NamedFunction.d2_inUserGroup -> functions.d2_inUserGroup( evalToString(fn.child(0)), - data.supplementaryValues[SupplementaryKey.Fixed(FixedKey.USER_GROUPS)]) + data.supplementaryValues["USER_GROUPS"]) NamedFunction.d2_hasValue -> try { functions.d2_hasValue(evalToVar(fn.child(0))) } catch (e: IllegalExpressionException) { @@ -104,7 +104,7 @@ internal class Calculator( NamedFunction.d2_inOrgUnitGroup -> functions.d2_inOrgUnitGroup( evalToString(fn.child(0)), data.programRuleVariableValues["org_unit"], - extractOrgUnitGroupSetData(data.supplementaryValues)) + data.supplementaryValues) NamedFunction.d2_lastEventDate -> functions.d2_lastEventDate( evalToVar(fn.child(0))) NamedFunction.d2_left -> functions.d2_left( @@ -180,19 +180,6 @@ internal class Calculator( } } - private fun extractOrgUnitGroupSetData( - data: Map> - ): Map> { - return data - .filterKeys { key -> - key is SupplementaryKey.Dynamic && - key.type == DynamicKey.ORG_UNIT_GROUP_SET - } - .mapKeys { (key, _) -> - (key as SupplementaryKey.Dynamic).uid - } - } - private fun evalAggFunction(fn: Node): Double? { val items: MutableList = mutableListOf() fn.child(0).visit(NodeType.DATA_ITEM) { node: Node<*> -> diff --git a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/DynamicKey.kt b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/DynamicKey.kt deleted file mode 100644 index ab10ed0..0000000 --- a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/DynamicKey.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.hisp.dhis.lib.expression.spi - -/** - * Enumeration of dynamic supplementary keys that depend on metadata objects. - * - * For example, [DynamicKey.ORG_UNIT_GROUP_SET] represents the UID of an - * organisation unit group set, which is used by expressions like - * d2:inOrgUnitGroup(). - * - * @author Zubair Asghar - */ -enum class DynamicKey { - ORG_UNIT_GROUP_SET -} \ No newline at end of file diff --git a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/ExpressionData.kt b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/ExpressionData.kt index 851fdf4..5e7e7c5 100644 --- a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/ExpressionData.kt +++ b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/ExpressionData.kt @@ -9,7 +9,7 @@ package org.hisp.dhis.lib.expression.spi data class ExpressionData( val programRuleVariableValues: Map, val programVariableValues: Map, - val supplementaryValues: Map>, + val supplementaryValues: Map>, val dataItemValues: Map, val namedValues: Map ) { diff --git a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/FixedKey.kt b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/FixedKey.kt deleted file mode 100644 index 5e4c07f..0000000 --- a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/FixedKey.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.hisp.dhis.lib.expression.spi - -/** - * Enumeration of fixed supplementary keys that are always available - * in the system and do not depend on external metadata. - * - * Used to store data like user roles or user groups in expressions - * (e.g., d2:hasUserRole()). - * - * @author Zubair Asghar - */ -enum class FixedKey { - USER_ROLES, - USER_GROUPS -} \ No newline at end of file diff --git a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/SupplementaryKey.kt b/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/SupplementaryKey.kt deleted file mode 100644 index 6095eb6..0000000 --- a/src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/SupplementaryKey.kt +++ /dev/null @@ -1,22 +0,0 @@ -package org.hisp.dhis.lib.expression.spi - -/** - * Supplementary keys provide extra contextual data (like user roles, user groups, - * or membership in organisation unit groups) that cannot be derived from - * the tracked entity or event data alone. - * - * This key can be either [Fixed], for well-defined values for example user roles, - * or [Dynamic], for metadata-driven keys (e.g., organisation unit group sets). - * - * @author Zubair Asghar - */ -sealed class SupplementaryKey { - data class Fixed( - val type: FixedKey - ) : SupplementaryKey() - - data class Dynamic( - val type: DynamicKey, - val uid: String - ) : SupplementaryKey() -} diff --git a/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/HasUserRoleTest.kt b/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/HasUserRoleTest.kt index af238e5..c9ae64b 100644 --- a/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/HasUserRoleTest.kt +++ b/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/HasUserRoleTest.kt @@ -3,9 +3,7 @@ package org.hisp.dhis.lib.expression.function import org.hisp.dhis.lib.expression.Expression import org.hisp.dhis.lib.expression.ExpressionMode import org.hisp.dhis.lib.expression.spi.ExpressionData -import org.hisp.dhis.lib.expression.spi.FixedKey import org.hisp.dhis.lib.expression.spi.IllegalExpressionException -import org.hisp.dhis.lib.expression.spi.SupplementaryKey import kotlin.test.* /** @@ -17,8 +15,7 @@ internal class HasUserRoleTest { @Test fun testHasUserRole_Null() { - assertFalse(evaluate("d2:hasUserRole(null)",mapOf(SupplementaryKey.Fixed(FixedKey.USER_ROLES) to listOf("admin")) - )) + assertFalse(evaluate("d2:hasUserRole(null)", mapOf("USER_ROLES" to listOf("admin")))) } @Test @@ -29,27 +26,12 @@ internal class HasUserRoleTest { @Test fun testHasUserRole() { - assertTrue( - evaluate( - "d2:hasUserRole(\"admin\")", - mapOf(SupplementaryKey.Fixed(FixedKey.USER_ROLES) to listOf("admin")) - ) - ) - assertFalse( - evaluate( - "d2:hasUserRole(\"admin\")", - mapOf(SupplementaryKey.Fixed(FixedKey.USER_ROLES) to listOf("guest")) - ) - ) - assertTrue( - evaluate( - "d2:hasUserRole(\"admin\")", - mapOf(SupplementaryKey.Fixed(FixedKey.USER_ROLES) to listOf("foo", "admin")) - ) - ) + assertTrue(evaluate("d2:hasUserRole(\"admin\")", mapOf("USER_ROLES" to listOf("admin")))) + assertFalse(evaluate("d2:hasUserRole(\"admin\")", mapOf("USER_ROLES" to listOf("guest")))) + assertTrue(evaluate("d2:hasUserRole(\"admin\")", mapOf("USER_ROLES" to listOf("foo","admin")))) } - private fun evaluate(expression: String, supplementaryValues: Map>): Boolean { + private fun evaluate(expression: String, supplementaryValues: Map>): Boolean { val data: ExpressionData = ExpressionData().copy(supplementaryValues = supplementaryValues) return Expression(expression, ExpressionMode.RULE_ENGINE_ACTION).evaluate( { _: String -> null }, data) as Boolean } diff --git a/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InOrgUnitGroupTest.kt b/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InOrgUnitGroupTest.kt index 8fb8dd6..ef9d168 100644 --- a/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InOrgUnitGroupTest.kt +++ b/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InOrgUnitGroupTest.kt @@ -2,7 +2,9 @@ package org.hisp.dhis.lib.expression.function import org.hisp.dhis.lib.expression.Expression import org.hisp.dhis.lib.expression.ExpressionMode -import org.hisp.dhis.lib.expression.spi.* +import org.hisp.dhis.lib.expression.spi.ExpressionData +import org.hisp.dhis.lib.expression.spi.ValueType +import org.hisp.dhis.lib.expression.spi.VariableValue import kotlin.test.Test import kotlin.test.assertFalse import kotlin.test.assertTrue @@ -16,73 +18,39 @@ internal class InOrgUnitGroupTest { @Test fun testInOrgUnitGroup_Null() { - val programRuleVariableValues = - mapOf("org_unit" to VariableValue(ValueType.STRING)) - assertFalse( - evaluate( - "d2:inOrgUnitGroup(null)", - mapOf( - SupplementaryKey.Dynamic(DynamicKey.ORG_UNIT_GROUP_SET, "uidougroup0") to - listOf("uiduser0001", "uiduser0001") - ), - programRuleVariableValues - ) - ) + val supplementaryValues = mapOf("uidougroup0" to listOf("uiduser0001", "uiduser0001")) + val programRuleVariableValues = mapOf("org_unit" to VariableValue(ValueType.STRING)) + assertFalse(evaluate("d2:inOrgUnitGroup(null)", supplementaryValues, programRuleVariableValues)) } @Test fun testInOrgUnitGroup() { - val programRuleVariableValues = - mapOf("org_unit" to VariableValue(ValueType.STRING).copy(value = "uiduser0001")) - assertTrue( - evaluate( - "d2:inOrgUnitGroup(\"uidougroup0\")", - mapOf( - SupplementaryKey.Dynamic(DynamicKey.ORG_UNIT_GROUP_SET, "uidougroup0") to - listOf("uiduser0001", "uiduser0002") - ), - programRuleVariableValues - ) - ) + val supplementaryValues = mapOf("uidougroup0" to listOf("uiduser0001", "uiduser0002")) + val programRuleVariableValues = mapOf("org_unit" to VariableValue(ValueType.STRING).copy(value = "uiduser0001")) + assertTrue(evaluate("d2:inOrgUnitGroup(\"uidougroup0\")", supplementaryValues, programRuleVariableValues)) + } @Test fun testInOrgUnitGroup_GroupNotDefined() { - val programRuleVariableValues = - mapOf("org_unit" to VariableValue(ValueType.STRING).copy(value = "uiduser0001")) - assertFalse( - evaluate( - "d2:inOrgUnitGroup(\"uidougroup5\")", - emptyMap(), - programRuleVariableValues - ) - ) + val programRuleVariableValues = mapOf("org_unit" to VariableValue(ValueType.STRING).copy(value = "uiduser0001")) + assertFalse(evaluate("d2:inOrgUnitGroup(\"uidougroup5\")", mapOf(), programRuleVariableValues)) } @Test fun testInOrgUnitGroup_OrgUnitNotDefined() { - assertFalse( - evaluate( - "d2:inOrgUnitGroup(\"uidougroup0\")", - mapOf( - SupplementaryKey.Dynamic(DynamicKey.ORG_UNIT_GROUP_SET, "uidougroup0") to - listOf("uiduser0001", "uiduser0002") - ), - emptyMap() - ) - ) + val supplementaryValues = mapOf("uidougroup0" to listOf("uiduser0001", "uiduser0002")) + assertFalse(evaluate("d2:inOrgUnitGroup(\"uidougroup0\")", supplementaryValues, mapOf())) } private fun evaluate( expression: String, - supplementaryValues: Map>, + supplementaryValues: Map>, programRuleVariableValues: Map ): Boolean { val data: ExpressionData = ExpressionData().copy( supplementaryValues = supplementaryValues, - programRuleVariableValues = programRuleVariableValues - ) - return Expression(expression, ExpressionMode.RULE_ENGINE_ACTION) - .evaluate({ _: String -> null }, data) as Boolean + programRuleVariableValues = programRuleVariableValues) + return Expression(expression, ExpressionMode.RULE_ENGINE_ACTION).evaluate( { _: String -> null }, data) as Boolean } -} +} \ No newline at end of file diff --git a/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InUserGroupTest.kt b/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InUserGroupTest.kt index 7b6e275..87275aa 100644 --- a/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InUserGroupTest.kt +++ b/src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/InUserGroupTest.kt @@ -3,9 +3,7 @@ package org.hisp.dhis.lib.expression.function import org.hisp.dhis.lib.expression.Expression import org.hisp.dhis.lib.expression.ExpressionMode import org.hisp.dhis.lib.expression.spi.ExpressionData -import org.hisp.dhis.lib.expression.spi.FixedKey import org.hisp.dhis.lib.expression.spi.IllegalExpressionException -import org.hisp.dhis.lib.expression.spi.SupplementaryKey import kotlin.test.* /** @@ -17,7 +15,7 @@ internal class InUserGroupTest { @Test fun testInUserGroup_Null() { - assertFalse(evaluate("d2:inUserGroup(null)", mapOf(SupplementaryKey.Fixed(FixedKey.USER_GROUPS) to listOf("uidusgroup0")))) + assertFalse(evaluate("d2:inUserGroup(null)", mapOf("USER_GROUPS" to listOf("uidusgroup0")))) } @Test @@ -28,11 +26,11 @@ internal class InUserGroupTest { @Test fun testInUserGroup() { - assertTrue(evaluate("d2:inUserGroup(\"uidusgroup0\")", mapOf(SupplementaryKey.Fixed(FixedKey.USER_GROUPS) to listOf("uidusgroup0")))) - assertFalse(evaluate("d2:inUserGroup(\"uidusgroup0\")", mapOf(SupplementaryKey.Fixed(FixedKey.USER_GROUPS) to listOf("uidusgroup1")))) + assertTrue(evaluate("d2:inUserGroup(\"uidusgroup0\")", mapOf("USER_GROUPS" to listOf("uidusgroup0")))) + assertFalse(evaluate("d2:inUserGroup(\"uidusgroup0\")", mapOf("USER_GROUPS" to listOf("uidusgroup1")))) } - private fun evaluate(expression: String, supplementaryValues: Map>): Boolean { + private fun evaluate(expression: String, supplementaryValues: Map>): Boolean { val data: ExpressionData = ExpressionData().copy(supplementaryValues = supplementaryValues) return Expression(expression, ExpressionMode.RULE_ENGINE_ACTION).evaluate( { _: String -> null }, data) as Boolean } From b39e8bb892ac65bf6c2bc886883eff2caeb735e5 Mon Sep 17 00:00:00 2001 From: zubaira Date: Fri, 19 Sep 2025 12:25:44 +0200 Subject: [PATCH 7/7] change the minor version from 1.1.12-SNAPSHOT to 1.2.0-SNAPSHOT --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 7bf746e..abaa1b4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ repositories { mavenCentral() } -version = "1.1.12-SNAPSHOT" +version = "1.2.0-SNAPSHOT" group = "org.hisp.dhis.lib.expression" if (project.hasProperty("removeSnapshotSuffix")) {