Romain Gauthier created UNOMI-188:
-------------------------------------

             Summary: Optimize rule engine by associating rules with event 
types directly
                 Key: UNOMI-188
                 URL: https://issues.apache.org/jira/browse/UNOMI-188
             Project: Apache Unomi
          Issue Type: New Feature
          Components: core
    Affects Versions: 1.3.0-incubating
            Reporter: Romain Gauthier


Hello,

Here is an improvement that we identified:

When analyzing the performance of Apache Unomi, we noticed that the executions 
of the condition evaluators to determine if a rule should be executed for a 
particular event were being called million of times.

A way to avoid all these condition calls, and since each rule is always related 
to an event processing, we could simply associated a rule with an eventTypeId 
or multiple types (if they correspond to multiple types).

We will also need to handle the migration of existing rules to use this, which 
will require analyzing the existing conditions to extract the conditions that 
match with a specific event type.

For example a rule such as :
{code:java}
{
  "metadata": {
    "id": "_ynqbd6g4t_incrementInterests",
    "name": "Increment profile interests",
    "description": "Evaluate segments when a profile is modified"
  },
  "raiseEventOnlyOnceForSession": true,
  "condition": {
    "parameterValues": {
      "subConditions": [
        {
          "type": "pageViewEventCondition",
          "parameterValues": {
          }
        },
        {
          "type": "eventPropertyCondition",
          "parameterValues": {
            "propertyName": "target.properties.interests",
            "comparisonOperator": "exists"
          }
        }
      ],
      "operator": "and"
    },
    "type": "booleanCondition"
  },
  "actions": [
    {
      "parameterValues": {
        "setPropertyName": "properties.interests",
        "setPropertyValue": "script::r = profile.properties['interests']; 
foreach(interest : event.target.properties['interests'].entrySet()) { if (r == 
null) { r = [interest.key: interest.value] } else if (r[interest.key] != null) 
{ r[interest.key] = r[interest.key] + interest.value } else { r[interest.key] = 
interest.value } } r",
        "storeInSession": false
      },
      "type": "setPropertyAction"
    }
  ]
}
{code}
Would become :
{code:java}
{
  "metadata": {
    "id": "_ynqbd6g4t_incrementInterests",
    "name": "Increment profile interests",
    "description": "Evaluate segments when a profile is modified"
  },
  "raiseEventOnlyOnceForSession": true,
  *"eventTypes" : [ "view" ]*
  "condition": {
    "parameterValues": {
      "subConditions": [
        {
          "type": "eventPropertyCondition",
          "parameterValues": {
            "propertyName": "target.properties.interests",
            "comparisonOperator": "exists"
          }
        }
      ],
      "operator": "and"
    },
    "type": "booleanCondition"
  },
  "actions": [
    {
      "parameterValues": {
        "setPropertyName": "properties.interests",
        "setPropertyValue": "script::r = profile.properties['interests']; 
foreach(interest : event.target.properties['interests'].entrySet()) { if (r == 
null) { r = [interest.key: interest.value] } else if (r[interest.key] != null) 
{ r[interest.key] = r[interest.key] + interest.value } else { r[interest.key] = 
interest.value } } r",
        "storeInSession": false
      },
      "type": "setPropertyAction"
    }
  ]
}
{code}
In the above example we have replaced the pageViewEventCondition with the 
restrictions on the "view" eventTypeId.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to