[
https://issues.apache.org/jira/browse/UNOMI-883?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jonathan Sinovassin-Naïk updated UNOMI-883:
-------------------------------------------
Fix Version/s: unomi-3.1.0
(was: unomi-3.0.0)
> Implement Unified Condition Validation Service for Enhanced Developer
> Experience and Error Prevention
> -----------------------------------------------------------------------------------------------------
>
> Key: UNOMI-883
> URL: https://issues.apache.org/jira/browse/UNOMI-883
> Project: Apache Unomi
> Issue Type: Sub-task
> Components: unomi(-core)
> Affects Versions: unomi-3.0.0
> Reporter: Serge Huber
> Assignee: Serge Huber
> Priority: Major
> Fix For: unomi-3.1.0
>
>
> h2. Description
> This ticket is about implementing a unified approach to validate conditions
> across different services to prevent invalid conditions from being stored and
> ensure developer experience. We have always provided type for the values, so
> these can also be used to validate the condition parameter values, but the
> idea is to go further to add an optional validation sub-object to specify
> additional validation requirements. The aim is to, for example, make sure
> developers don't forget parameters such as "operator" for the
> "booleanCondition", which could lead to difficult to understand errors.
> h3. Implementation Details
> h4. Core Features
> The new ConditionValidation class provides the following validation
> capabilities:
> *Parameter Types Support:*
> * STRING
> * INTEGER
> * LONG
> * FLOAT
> * DOUBLE
> * BOOLEAN
> * DATE
> * CONDITION
> * OBJECT
> *Validation Features:*
> # Required Parameters
> ** Ability to mark parameters as mandatory
> # Allowed Values
> ** Define a set of valid values for a parameter
> # Condition Tags
> ** Specify allowed condition tags
> ** Filter conditions based on tags
> # Condition Type Restrictions
> ** Define disallowed condition types
> # Exclusive Parameters
> ** Support for mutually exclusive parameters
> ** Group exclusive parameters together
> # Recommended Parameters
> ** Mark parameters as recommended but not required
> # Custom Type Support
> ** Specify custom Java types for OBJECT parameters
> h3. Example Condition Type Definition
> {code:json}
> {
> "metadata": {
> "id": "propertyCondition",
> "name": "Property Condition",
> "description": "Compares a property value"
> },
> "parameters": [
> {
> "name": "propertyName",
> "type": "string",
> "validation": {
> "required": true
> }
> },
> {
> "name": "comparisonOperator",
> "type": "string",
> "validation": {
> "required": true,
> "allowedValues": ["equals", "notEquals", "greaterThan", "lessThan",
> "exists", "missing"]
> }
> },
> {
> "name": "propertyValue",
> "type": "string",
> "validation": {
> "recommended": true,
> "exclusive": true,
> "exclusiveGroup": "valueGroup"
> }
> }
> ]
> }
> {code}
> h3. Service Integration
> The validation service has been integrated with:
> * SegmentService
> * RulesService
> * GoalsService
> h3. Benefits
> * Centralized validation logic
> * Consistent validation across services
> * Clear distinction between required and recommended parameters
> * Support for complex parameter relationships
> * Type safety through custom type validation
> h2. Related Documentation
> * API Documentation: ConditionValidation class
> * Integration Examples: See SegmentServiceImpl, RulesServiceImpl, and
> GoalsServiceImpl
> * Test Cases: Validation scenarios in respective service tests
> h2. Detailed Condition Type Examples
> h3. Boolean Condition Type
> {code:json}
> {
> "metadata": {
> "id": "booleanCondition",
> "name": "Boolean Condition",
> "description": "Combines multiple conditions with a logical operator"
> },
> "parameters": [
> {
> "id": "operator",
> "type": "string",
> "validation": {
> "required": true,
> "allowedValues": ["and", "or"]
> }
> },
> {
> "id": "subConditions",
> "type": "condition",
> "multivalued": true,
> "validation": {
> "required": true
> }
> }
> ]
> }
> {code}
> h3. Profile Property Condition Type
> {code:json}
> {
> "metadata": {
> "id": "profilePropertyCondition",
> "name": "Profile Property Condition",
> "description": "Evaluates a profile property against various comparison
> criteria"
> },
> "parameters": [
> {
> "id": "propertyName",
> "type": "string",
> "validation": {
> "required": true
> }
> },
> {
> "id": "comparisonOperator",
> "type": "string",
> "validation": {
> "required": true,
> "allowedValues": [
> "equals",
> "notEquals",
> "lessThan",
> "greaterThan",
> "lessThanOrEqualTo",
> "greaterThanOrEqualTo",
> "between",
> "exists",
> "missing",
> "contains",
> "notContains",
> "startsWith",
> "endsWith",
> "matchesRegex"
> ]
> }
> },
> {
> "id": "propertyValue",
> "type": "string",
> "validation": {
> "recommended": true,
> "exclusive": true,
> "exclusiveGroup": "valueGroup"
> }
> },
> {
> "id": "propertyValueInteger",
> "type": "integer",
> "validation": {
> "recommended": true,
> "exclusive": true,
> "exclusiveGroup": "valueGroup"
> }
> },
> {
> "id": "propertyValueDate",
> "type": "date",
> "validation": {
> "recommended": true,
> "exclusive": true,
> "exclusiveGroup": "valueGroup"
> }
> }
> ]
> }
> {code}
> The actual implemented validation features include:
> 1. Basic Parameter Validation:
> * Required parameters
> * Recommended parameters
> * Parameter type validation (STRING, INTEGER, LONG, FLOAT, DOUBLE, BOOLEAN,
> DATE, CONDITION, OBJECT)
> 2. Value Constraints:
> * Allowed values (enumeration)
> * Custom type validation for OBJECT type
> 3. Condition-Specific Validation:
> * Allowed condition tags
> * Disallowed condition types
> * Nested condition validation
> 4. Parameter Relationships:
> * Exclusive parameters
> * Exclusive parameter groups
> 5. Collection Support:
> * Multivalued parameter validation
> * Collection type validation
> * Empty collection validation for required parameters
> The implementation does not include some of the features I incorrectly
> included in my previous examples:
> * Pattern matching for strings
> * Numeric range validation
> * Complex date format validation
> * Inter-parameter dependencies beyond exclusive groups
> * Conditional validation based on other parameter values
> Would you like me to provide more specific examples of how to use any of
> these actually implemented features?
--
This message was sent by Atlassian Jira
(v8.20.10#820010)