Conversational Actions will be deprecated on June 13, 2023. For more information, see Conversational Actions sunset.

# Conditions

You can carry out conditional logic in scenes using values from the Data model objects. The following sections describe the valid syntax for conditions.

## Logical operators

Operator Description
`&&` Logical AND. Inner expressions are evaluated iteratively, and the evaluation is short-circuited if any expression evaluates to false.
`||` Logical OR. Inner expressions are evaluated iteratively, and the evaluation is short-circuited if any expression evaluates to true
`!` Logical NOT. The evaluation of the inner expression is negated

### Numerical and string operators

The following numerical and string operators are supported:

Operator Description
`+` Add numbers or string concatenation
`-` Subtract numbers
`*` Multiply numbers
`/` Divide numbers

### Booleans

The following constant booleans are supported:

Constant Description
`true` Must be lowercase
`false` Must be lowercase
`!false` Evaluates to `true`. Must be lowercase.

### Comparison operators

The following comparison operators are provided:

Operator Description
`==` Equals
`!=` Not equals
`<` Less than
`<=` Less than equals
`>` Greater than
`>=` Greater than equals

### Lists and maps

Given a list named `session.params.myList`:

Syntax Description
`x in session.params.myList` Returns true if the value `x` is in `session.params.myList`
`myList[x]` Returns the value at index `x` of `myList`
`size(session.params.myList)` Returns the size of a list

Given a map named `session.params.myMap`:

Syntax Description
`session.params.myMap == {"one": 1, "two":2}` Returns `true` if maps are equal
`session['params']['myMap']['one']` Returns the value with specified key
`size(session.params.myMap)` Returns the map size

## Data model

The following objects can be used within scene conditions:

Syntax Description
`intent` Matched intent parameter data
`scene` Slot-filling data
`session` Session storage data
`user` User storage data
`home` Home storage data
`device` Device capability and location data
`canvas` Canvas state data
`resources` Localized project resources (audio, images, strings, etc.) data

The following is an example snippet of the full data model in JSON:

``````{
"intent": {
"params": {
"<param_name>": {
"original": "five people",
"resolved": 5
}
}
},
"session": {
"params": {
"<session_params_key>": "<session_params_value>"
}
},
"scene": {
"slots": {
"status": "FINAL",
"params": {
"<slot_name>": "<slot_value>"
}
}
},
"user": {
"params": {
"<user_params_key>": "<user_params_value>"
},
"permissions": [
"DEVICE_PRECISE_LOCATION"
],
"verificationStatus": "VERIFIED",
"lastSeenTime": {
"seconds": 123,
"nanos": 456
},
"engagement": {
"intent1",
"intent2"
]
}
},
"home": {
"params": {
"<home_params_key>": "<home_params_value>"
}
},
"canvas": {
"state": {
"<canvas_state_key>": "<canvas_state_value>"
}
},
"device": {
"capabilities": [
"SPEECH",
"RICH_RESPONSE",
"LONG_FORM_AUDIO",
"INTERACTIVE_CANVAS"
],
"currentLocation": {
"coordinates": {
"latitude": 37.422,
"longitude": -122.084
},
"revision": 0,
"regionCode": "US",
"languageCode": "en",
"postalCode": "94043",
"sortingCode": "",
"locality": "Mountain View",
"sublocality": "",
"recipients": [],
"organization": ""
}
}
},
"resources": {
"strings": {
"<resource_string_key>": "<resource_string_value>"
},
"images": {
"<resource_image_key>": "<resource_image_value>"
}
}
}

``````

## Usage reference

The following syntax examples assumes you are working with `session.params` object:

``````session.params = {
"flag": true,
"count": 10,
"name": "john smith",
"myList": [1, 2, 3],
"myMap": {"one": 1, "two":2}
}
``````

You can carry out the following conditional operations:

``````// numbers and boolean logic
session.params.count > 0 && session.params.count < 100    // AND
session.params.count == 0 || session.params.count != 5    // OR
!(session.params.count <= 0)         // NOT

// booleans
!false                      // true constant
session.params.flag         // boolean variable
session.params.flag == true // explicitly compare with true constant

// strings
session.params.name == "john smith"  // double quotes supported
session.params.name == 'john smith'  // single quotes supported
session.params.name.contains("john") // substring
session.params.name + "!!!" == "john smith!!!" // string concatenation
session.params.name < "abc"          // compares lexicographically
size(session.params.name) == 10      // length of string

// lists
1 in session.params.myList        // "contains in list" operator
session.params.myList[0] == 1     // "index into list" operator
size(session.params.myList) == 3  // returns number of elements in the list

// maps
session.params.myMap == {"one": 1, "two":2} // compare map with json
session['params']['myMap']['one'] == 1      // index using square brackets
size(session.params.myMap) == 2             // number of entries in the map
``````
[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"Missing the information I need" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"Too complicated / too many steps" },{ "type": "thumb-down", "id": "outOfDate", "label":"Out of date" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"Samples / code issue" },{ "type": "thumb-down", "id": "otherDown", "label":"Other" }]
[{ "type": "thumb-up", "id": "easyToUnderstand", "label":"Easy to understand" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"Solved my problem" },{ "type": "thumb-up", "id": "otherUp", "label":"Other" }]