Query relationships bidirectionally
Relationships between two managed objects come in two forms: forward and reverse. Forward relationships mean one side points to the other in a uni-directional flow. Reverse relationships means both sides point to the other in a bidirectional flow.
Most cases use reverse or bidirectional relationships for efficient querying of objects.
For example, a relationship between a user and his manager might indicate a reverse relationship between the manager and her direct report.
You may want to query jdoe
's user entry to discover who his manager is, or query bjensen
's user entry to discover all the users who report to bjensen
.
You define a reverse relationship within a relationship definition. Consider the following sample excerpt of the default managed object configuration:
"reports" : {
"description" : "Direct Reports",
"title" : "Direct Reports",
...
"type" : "array",
"returnByDefault" : false,
"items" : {
"type" : "relationship",
"reverseRelationship" : true,
"reversePropertyName" : "manager",
"validate" : true,
...
}
...
The reports
property is a relationship
type between users and managers, so you can refer to a managed user’s reports by referencing the reports
object.
However, the reports
property is also a reverse relationship ("reverseRelationship":true
), which means you can list all users that reference that report.
You can list all users whose manager
property is set to the currently queried user.
The reverse relationship includes an optional resourceCollection
that lets you query a set of objects, based on specific fields:
"resourceCollection" : [
{
"path" : "managed/realm-name_user",
"label" : "User",
"query" : {
"queryFilter" : "true",
"fields" : [
"userName",
"givenName",
"sn"
]
}
}
]
The path
property of the resourceCollection
points to the set of objects to be queried. If this path is not in the local repository,
the link expansion can incur a significant performance cost. Although the resourceCollection
is optional,
the same performance cost is incurred if the property is absent.
The query
property indicates how you will query this resource collection to configure the relationship. In this case, "queryFilter":true
indicates that you can search on any of the properties listed in the fields
array when you are assigning a manager to a user
or a new report to a manager.