A compartment definition that defines how resources are accessed on a server.
5.7.1 Scope and Usage
Each resource may belong to one or more logical compartments. A compartment is a logical
grouping of resources which share a common property. Compartments have two principal roles:
Function as an access mechanism for finding a set of related resources quickly
Provide a definitional basis for applying access control to resources quickly
Notes:
At present, compartment definitions can only be defined by HL7 International. This is because
their existence creates significant impact on the behavior of servers.
Although compartment definitions can be a useful foundation for access control, they may
not be sufficient for this purpose. Resources outside the compartment might
still be appropriate to be made available or subject to compartment restrictions even
though they are not formally part of the compartment (see below about access rules).
5.7.2 Boundaries and Relationships
Compartment definitions describe how particular compartment instances are named and identified,
and how systems know which resources are in the compartment. The following compartments are
defined by this specification:
The set of resources associated with a particular patient
There is an instance of the patient compartment for each patient resource, and the identity of the compartment is the same as the patient. When a patient is linked to another patient resource, the records associated with the linked patient resource will not be returned as part of the compartment search. Those records will be returned only with another compartment search using the "id" for the linked patient resource.
In cases where two patients have been merged rather than linked, associated resources should be moved to the target patient as part of the merge process, so the patient compartment for the target patient would include all relevant data, and the patient compartment for the source patient would include only the linked Patient and possibly remnant resources like AuditEvent.
The patient compartment includes any resources where the subject of the resource is the patient, and some other resources that are directly linked to resources in the patient compartment
The set of resources associated with a particular encounter
There is an instance of the encounter compartment for each encounter resource, and the identity of the compartment is the same as the encounter
The encounter compartment includes any resources where the resource has an explicitly nominated encounter, and some other resources that themselves link to resources in the encounter compartment. Note that for many resources, the exact nature of the link to encounter can be ambiguous (e.g. for a DiagnosticReport, is it the encounter when it was initiated, or when it was reported?)
The set of resources associated with a particular 'related person'
There is an instance of the relatedPerson compartment for each relatedPerson resource, and the identity of the compartment is the same as the relatedPerson
The relatedPerson compartment includes any resources where the resource is explicitly linked to relatedPerson (usually as author)
The set of resources associated with a particular practitioner
There is an instance of the practitioner compartment for each Practitioner resource, and the identity of the compartment is the same as the Practitioner
The practitioner compartment includes any resources where the resource is explicitly linked to a Practitioner (usually as author, but other kinds of linkage exist)
The set of resources associated with a particular group
There is an instance of the group compartment for each Group resource, and the identity of the compartment is the same as the Group
The device compartment includes any resources where the resource is explicitly linked to a Device (mostly subject or performer)
The full definitions of these compartments are published as CompartmentDefinition
resources. Servers typically do not support the full definition of a compartment, and are not
required to. Systems may publish CompartmentDefinition resources so that
other systems may make use of compartments properly.
CompartmentDefinitions are used by CapabilityStatement instances for specifying how resources are accessed
GraphDefinition also provides a mechanism for grouping resources, though it does not provide an additional search mechanism.
Inclusion of resources in a GraphDefinition supports more complex criteria for inclusion than that allowed by CompartmentDefinition.
Compartment Definition for a resource + Warning: Name should be usable as an identifier for the module by machine processing applications such as code generation
Canonical identifier for this compartment definition, represented as a URI (globally unique) + Warning: URL should not contain | or # - these characters make processing canonical references problematic
@prefix fhir: <http://hl7.org/fhir/> .
[ a fhir:CompartmentDefinition;
fhir:nodeRole fhir:treeRoot; # if this is the parser root
# from Resource: .id, .meta, .implicitRules, and .language
# from DomainResource: .text, .contained, .extension, and .modifierExtension
fhir:url[ uri ] ; # 1..1 Canonical identifier for this compartment definition, represented as a URI (globally unique)
fhir:version[ string ] ; # 0..1 Business version of the compartment definition
# versionAlgorithm[x]: 0..1 How to compare versions. One of these 2
fhir:versionAlgorithm[ a fhir:string ; string ]
fhir:versionAlgorithm[ a fhir:Coding ; Coding ]
fhir:name[ string ] ; # 1..1 IName for this compartment definition (computer friendly)
fhir:title[ string ] ; # 0..1 Name for this compartment definition (human friendly)
fhir:status[ code ] ; # 1..1 draft | active | retired | unknown
fhir:experimental[ boolean ] ; # 0..1 For testing only - never for real usage
fhir:date[ dateTime ] ; # 0..1 Date last changed
fhir:publisher[ string ] ; # 0..1 Name of the publisher/steward (organization or individual)
fhir:contact ( [ ContactDetail ] ... ) ; # 0..* Contact details for the publisher
fhir:description[ markdown ] ; # 0..1 Natural language description of the compartment definition
fhir:useContext ( [ UsageContext ] ... ) ; # 0..* The context that the content is intended to support
fhir:purpose[ markdown ] ; # 0..1 Why this compartment definition is defined
fhir:code[ code ] ; # 1..1 Patient | Encounter | RelatedPerson | Practitioner | Device | EpisodeOfCare
fhir:search[ boolean ] ; # 1..1 Whether the search syntax is supported
fhir:resource( [ # 0..* How a resource is related to the compartment
fhir:code[ code ] ; # 1..1 Name of resource type
fhir:param ( [ string ] ... ) ; # 0..* Search Parameter Name, or chained parameters
fhir:documentation[ string ] ; # 0..1 Additional documentation about the resource and compartment
fhir:startParam[ uri ] ; # 0..1 Search Param for interpreting $everything.start
fhir:endParam[ uri ] ; # 0..1 Search Param for interpreting $everything.end
] ... ) ;
]
Compartment Definition for a resource + Warning: Name should be usable as an identifier for the module by machine processing applications such as code generation
Canonical identifier for this compartment definition, represented as a URI (globally unique) + Warning: URL should not contain | or # - these characters make processing canonical references problematic
@prefix fhir: <http://hl7.org/fhir/> .
[ a fhir:CompartmentDefinition;
fhir:nodeRole fhir:treeRoot; # if this is the parser root
# from Resource: .id, .meta, .implicitRules, and .language
# from DomainResource: .text, .contained, .extension, and .modifierExtension
fhir:url[ uri ] ; # 1..1 Canonical identifier for this compartment definition, represented as a URI (globally unique)
fhir:version[ string ] ; # 0..1 Business version of the compartment definition
# versionAlgorithm[x]: 0..1 How to compare versions. One of these 2
fhir:versionAlgorithm[ a fhir:string ; string ]
fhir:versionAlgorithm[ a fhir:Coding ; Coding ]
fhir:name[ string ] ; # 1..1 IName for this compartment definition (computer friendly)
fhir:title[ string ] ; # 0..1 Name for this compartment definition (human friendly)
fhir:status[ code ] ; # 1..1 draft | active | retired | unknown
fhir:experimental[ boolean ] ; # 0..1 For testing only - never for real usage
fhir:date[ dateTime ] ; # 0..1 Date last changed
fhir:publisher[ string ] ; # 0..1 Name of the publisher/steward (organization or individual)
fhir:contact ( [ ContactDetail ] ... ) ; # 0..* Contact details for the publisher
fhir:description[ markdown ] ; # 0..1 Natural language description of the compartment definition
fhir:useContext ( [ UsageContext ] ... ) ; # 0..* The context that the content is intended to support
fhir:purpose[ markdown ] ; # 0..1 Why this compartment definition is defined
fhir:code[ code ] ; # 1..1 Patient | Encounter | RelatedPerson | Practitioner | Device | EpisodeOfCare
fhir:search[ boolean ] ; # 1..1 Whether the search syntax is supported
fhir:resource( [ # 0..* How a resource is related to the compartment
fhir:code[ code ] ; # 1..1 Name of resource type
fhir:param ( [ string ] ... ) ; # 0..* Search Parameter Name, or chained parameters
fhir:documentation[ string ] ; # 0..1 Additional documentation about the resource and compartment
fhir:startParam[ uri ] ; # 0..1 Search Param for interpreting $everything.start
fhir:endParam[ uri ] ; # 0..1 Search Param for interpreting $everything.end
] ... ) ;
]
URL should not contain | or # - these characters make processing canonical references problematic
exists() implies matches('^[^|# ]+$')
5.7.4.3 Base Resource
A compartment implicitly always includes the resource that is a 'root' of the compartment
e.g. the resource Patient/123 is the root resource of the Patient Compartment
for Patient/123.
Thus an operation that retrieves everything within the compartment will include the base
resource; a scope that grants access to everything within the compartment will grant access
to the resource; etc.
5.7.4.4 Using Compartments
As an example of compartment usage, to retrieve a list of a patient's conditions, use the URL:
GET [base]/Patient/[id]/Condition
Additional search parameters can be defined, such as this hypothetical search for
acute conditions:
GET [base]/Patient/[id]/Condition?code:in=http://hspc.org/ValueSet/acute-concerns
Note that as searches, these are syntactic variations on these two search
URLs respectively:
GET [base]/Condition?patient=[id]
GET [base]/Condition?patient=[id]&code:in=http://hspc.org/ValueSet/acute-concerns
The outcome of a compartment search is the same as the equivalent normal search.
For example, both these searches return the same outcome if there is no patient 333:
GET [base]/Patient/333/Condition
GET [base]/Condition?patient=333
Whether the patient doesn't exist, or the user has no access to the patient,
both these searches return an empty bundle with no matches. Some systems
will include an operation outcome warning that there is no matching patient.
However, there is a key difference in functionality between compartment based searches
and direct searches with parameters. Consider this search:
GET [base]/Patient/[id]/Communication
Because the definition of the patient compartment for
Communication says that a Communication resource is in the
patient compartment if the subject, sender, or recipient is the patient, the compartment
search is actually the same as the union of these 3 searches:
GET [base]/Communication?subject=[id]
GET [base]/Communication?sender=[id]
GET [base]/Communication?recipient=[id]
There is no way to do this as a single search, except by using the _filter:
GET [base]/Communication?_filter=subject re [id] or sender re [id] or recipient re [id]
Further details of searching by compartment are described under the search operation.
As a search related operation, the assignment of resources to compartments is only based on
the current version of any of the resources involved. Note that contained
patient resources cannot create a patient compartment of their own.
Note that while this specification describes how to use the compartment syntax to find resources
that are logically associated with the compartment, the compartment is not part of the
identity of the resource. E.g. the response to the following is not defined by this specification:
GET [base]/Patient/[patient-id]/Condition/[resource-id]
The response for write operations (PUT/DELETE/PATCH) are also not defined by this
specification. Nor is the response to a POST defined:
POST [base]/Patient/[patient-id]/Condition
There is no expectation for servers to support either read or write
to such URLs.
5.7.4.5 Logical Meaning of Compartments
Compartments may be used explicitly, like this, but can also be used implicitly. For instance,
if a FHIR server is providing a patient view of a record, the authorized user associated
with use of the FHIR RESTful API may be limited to accessing records from the
compartment instance(s) logically associated with their identity. Irrespective of whether
compartments are being used explicitly or implicitly, servers will need to make arrangements
to make some resources with no direct link to a patient available to the client (medications,
substances, binaries, etc.).
Note that resources may cross between compartments, or interlink them. Examples of
this would be where a Diagnostic Report identifies
a subject, but an Observation it references identifies
a different subject, or where a List resource references
items that identify different subjects. Such cross-linking may arise for
many valid reasons, including:
Cases where subject records are inter-linked - Transplants, Perinatal care, family therapy etc.
Workflow management where action lists link multiple patients and/or practitioners
Given the wide variety of use cases and contexts in which FHIR is used, compartments
do not define how cross-linking is handled. Systems may reject resources, remove them
from both compartments, or place them in both, or act in some other fashion.
The graph definition resource provides a method
by which rules about cross-linking may be made and enforced.
It is at the discretion of the server whether to include resources in a compartment when
the reference to the resource that establishes the compartment is in an extension.
Some resources are not in any compartment, e.g. Medication,
Substance, Location. These resources are not linked directly to a patient
or authored record, and are sometimes called 'master files'. Servers will need to make
arrangements to make these resources available to the clients that are limited to
particular compartments. For example, a Medication resource describes a medication itself
and does not link to a patient; however, a resource such as MedicationAdministration
connects the Medication (details of what was administered) to the patient (for whom was
it administered), and so is required to interpret the administration.
5.7.5 Defining New Compartments
Compartments are defined and added to the list above when implementer
communities identify them as common access points for data. As described
below, compartments have both syntactical and logical consequences, and
both these aspects of their functionality are evaluated when deciding
whether to define compartments.