Skip to main content

Predicate Spec

A _predicate/spec is set of smart functions that are attached to a particular predicate. Any time that predicate appears in a transaction, regardless of who issues the transaction, the smart functions attached to the _predicate/spec will execute.

If all of the smart functions return true, the transaction will succeed. If any of the smart functions return false, it will fail.

When you add a function to a predicate, it cannot take any parameters.

Predicate Spec Using Universal Functions#

If you add a function using only universal functions, (unless using functions like random or now) that predicate will always return the same result. For example:

[  {    "_id": "_fn$alwaysTrue",    "name": "alwaysTrue",    "code": "(== 13 (add3 10))",    "doc": "I always return true"  },  {    "_id": ["_predicate/name", "person/handle"],    "spec": ["_fn$alwaysTrue"],    "specDoc": "I always return true"  }]

Adding the above function to the _predicate/spec for person/handle is relatively useless, because the function will always return true, therefore this smart function would never stop any type of transaction.

Predicate Spec Using Context-Dependent Functions#

When adding a function that includes context-dependent functions your smart function will be able to control who makes an update or the value in that update.

For example, this function make sure person/favNums is non-negative, but using ?o, which returns the object of our predicate.

[  {    "_id": "_fn$nonNegative?",    "name": "nonNegative?",    "doc": "Checks that a value is non-negative",    "code": "(<= 0 (?o))"  },  {    "_id": ["_predicate/name", "person/favNums"],    "spec": ["_fn$nonNegative?"]  }]