Skip to content

Instantly share code, notes, and snippets.

@DmitryevichD
Last active March 30, 2022 09:58
Show Gist options
  • Select an option

  • Save DmitryevichD/9f0d26d84f1a1da809e1c35f04e2bc8c to your computer and use it in GitHub Desktop.

Select an option

Save DmitryevichD/9f0d26d84f1a1da809e1c35f04e2bc8c to your computer and use it in GitHub Desktop.
Rule service. Add-ons for the rule expressions contract #rule-service

Rule service. Add-ons for the rule expressions contract:

New type:

map

  • Group: Complex type
  • Description: Type is used for define variables that store key-value of simple types
  • Restrictions: Key must be present as string. All values must be represented as a simple type (string, number, version, date) and have the same type

New expression value attribute:

filter

  • Description: Optional element that contains predicate in the form of an rule expression. This predicate will use for each value of map and if it return true key-value will be used in the expression else key--value will be ignored.
  • Restrictions: If filter is null or not present all map values will be used in expression

New operations:

exist

It is used for cases when it is necessary to check that map is not empty after using the filter

not_exist

It is used for cases when it is necessary to check that map is empty after using the filter

Example with in operation

Expression

{
  "operation": "in",
  "values": [
    {
      "type": "map",
      "element_type": "number",
      "value": {
        "experiment_key1": "1",
        "experiment_key2": "2",
        "experiment_key3": "3"
      }
    },
    {
      "type": "map",
      "element_type": "number",
      "filter": {
        "operation": "gt",
        "values": [
          {
            "type": "number",
            "value": "2"
          },
          {
            "type": "number",
            "user_param": "experement"
          }
        ]
      },
      "user_param": "experement"  
    }
  ]
}

User params

{
  "experiment_key1": {
    "value": "1",
    "startDate": "2022-01-12", 
    "endDate": "2022-02-12",
    "enabled": true
  },
  "experiment_key2": {
    "value": "3",
    "startDate": "2022-01-12",
    "endDate": "2022-04-12",
    "enabled": false
  },
    "experiment_key3": {
    "value": "1",
    "startDate": "2022-01-12",
    "endDate": "2022-09-12",
    "enabled": true
  },
  "experiment_key4": {
    "value": "4",
    "startDate": "2022-01-12",
    "endDate": "2022-04-12",
    "enabled": true
  }
}

Execution steps (as of date 2022-03-22)

Step 1. - Getting user params from the database

From the database will get only two user params experiment_key3 and experiment_key4 because they have a valid date and they are enabled

 { 
 "experiment_key3": {
    "value": "1",
    "startDate": "2022-01-12",
    "endDate": "2022-09-12",
    "enabled": true
  },
  "experiment_key4": {
    "value": "4",
    "startDate": "2022-01-12",
    "endDate": "2022-04-12",
    "enabled": true
  }
}

Step 2. - Apply filter to map

Filter

"filter": {
        "operation": "gt",
        "values": [
          {
            "type": "number",
            "value": "2"
          },
          {
            "type": "number",
            "user_param": "experement"
          }
        ]
      }

will be apply for each value. ("user_param": "experement" will be replaced by values 1 and 4 and evaluated.)

After that the user param map should contains only one key-value

"experiment_key3": "1"

Step 3. - Evaluate expression

Add user param map to expression and evaluate it

{
  "operation": "in",
  "values": [
    {
      "type": "map",
      "element_type": "number",
      "value": {
        "experiment_key1": "1",
        "experiment_key2": "2",
        "experiment_key3": "3"
      }
    },
    {
      "type": "map",
      "element_type": "number",
      "value": {
        "experiment_key3": "1"
      }
    }
  ]
}

Result of expression must be false because map

"experiment_key1": "1",
"experiment_key2": "2",
"experiment_key3": "3"

doesn't contains

"experiment_key3": "1"

Example with exist operation

Expression

{
  "operation": "exist",
  "values": [
    {
      "type": "map",
      "element_type": "number",
      "filter": {
        "operation": "gt",
        "values": [
          {
            "type": "number",
            "value": "2"
          },
          {
            "type": "number",
            "user_param": "experement"
          }
        ]
      },
      "user_param": "experement"  
    }
  ]
}

User params

{
  "experiment_key1": {
    "value": "1",
    "startDate": "2022-01-12", 
    "endDate": "2022-02-12",
    "enabled": true
  },
  "experiment_key2": {
    "value": "3",
    "startDate": "2022-01-12",
    "endDate": "2022-04-12",
    "enabled": false
  },
    "experiment_key3": {
    "value": "1",
    "startDate": "2022-01-12",
    "endDate": "2022-09-12",
    "enabled": true
  },
  "experiment_key4": {
    "value": "4",
    "startDate": "2022-01-12",
    "endDate": "2022-04-12",
    "enabled": true
  }
}

Execution steps (as of date 2022-03-22)

Step 1. - Getting user params from the database

From the database will get only two user params experiment_key3 and experiment_key4 because they have a valid date and they are enabled

 { "experiment_key3": {
    "value": "1",
    "startDate": "2022-01-12",
    "endDate": "2022-09-12",
    "enabled": true
  },
  "experiment_key4": {
    "value": "4",
    "startDate": "2022-01-12",
    "endDate": "2022-04-12",
    "enabled": true
  }
}

Step 2. - Apply filter to map

Filter

"filter": {
        "operation": "gt",
        "values": [
          {
            "type": "number",
            "value": "2"
          },
          {
            "type": "number",
            "user_param": "experement"
          }
        ]
      }

will be apply for each value. ("user_param": "experement" will be replaced by values 1 and 4 and evaluated.)

After that the user param map should contains only one key-value

"experiment_key3": "1"

Step 3. - Evaluate expression

Returns true, since the map contains one element and is not empty

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment