Predicates
Thus far, we have discussed two different types of filters. Each of them allows us to
select one or more elements out from a field that allows for many values. Often times,
though, we need to apply a filter that allows us to restrict which Record fields are
selected. For example, what if we want to select the zip
field but only
for an address
field where the state is not New York? The above
examples do not give us any way to do this.
RecordPath provides the user the ability to specify a Predicate. A Predicate is simply
a filter that can be applied to a field in order to determine whether or not the field
should be included in the results. Like other filters, a Predicate is specified within
square brackets. The syntax of the Predicate is <Relative RecordPath>
<Operator> <Expression>
. The Relative
RecordPath
works just like any other RecordPath but must start with a
.
(to reference the current field) or a ..
(to
reference the current field's parent) instead of a slash and references fields
relative to the field that the Predicate applies to. The Operator
must
be one of:
Equals (
=
)Not Equal (
!=
)Greater Than (
>
)Greater Than or Equal To (
>=
)Less Than (
<
)Less Than or Equal To (
⇐
)
The Expression
can be a literal value such as 50
or Hello
or can be another RecordPath.
To illustrate this, let's take the following Record as an example:
{ "name": "John Doe", "workAddress": { "number": "123", "street": "5th Avenue", "city": "New York", "state": "NY", "zip": "10020" }, "homeAddress": { "number": "456", "street": "Grand St", "city": "Jersey City", "state": "NJ", "zip": "07304" }, "details": { "position": "Dataflow Engineer", "preferredState": "NY" } }
Now we can use a Predicate to choose only the fields where the state is not New York.
For example, we can use /[./state != 'NY']
. This will select any Record field that has a state field if the state does
not have a value of "NY". Note that the details Record will not be returned
because it does not have a field named state. So in this example, the RecordPath will
select only the homeAddress field. Once we have selected that field, we can continue on
with our RecordPath. As we stated above, we can select the zip field:
/[./state != 'NY']/zip
. This RecordPath will
result in selecting the zip
field only from the
homeAddress
field.
We can also compare the value in one field with the value in another field. For
example, we can select the address that is in the person's preferred state by using
the RecordPath /*[./state = /details/preferredState]
. In this example,
this RecordPath will retrieve the workAddress
field because its
state
field matches the value of the
preferredState
field.
Additionally, we can write a RecordPath that references the "city" field of
any record whose state is "NJ" by using the parent operator
(..
): /*/city[../state = 'NJ']
.