Fhirpath.pg
Why fhirpath?
To search though jsonb resources in database sometimes you need to access deeply nested attributes by specific criteria. For example to search patient by official name you have to do something like this:
Here is the version with fhirpath:
Implement FHIR search with fhirpath
Having fhirpath in your database also is very handy to implement FHIR Search API. In FHIR SearchParameters are described by fhirpath expressions. For example for Patient we have following search parameters:
Name | Type | Expression |
active | token | Patient.active |
address | string | Patient.address |
address-city | string | Patient.address.city |
address-country | string | Patient.address.country |
address-postalcode | string | Patient.address.postalCode |
address-state | string | Patient.address.state |
address-use | token | Patient.address.use |
animal-breed | token | Patient.animal.breed |
animal-species | token | Patient.animal.species |
birthdate | date | Patient.birthDate |
death-date | date | Patient.deceased.as(DateTime) |
deceased | token | Patient.deceased.exists() |
token | Patient.telecom.where(system='email') | |
family | string | Patient.name.family |
gender | token | Patient.gender |
general-practitioner | Patient.generalPractitioner (Practitioner, Organization) | |
given | string | Patient.name.given |
identifier | token | Patient.identifier |
language | token | Patient.communication.language |
link | Patient.link.other (Patient, RelatedPerson) | |
name | string | Patient.name |
organization | Patient.managingOrganization (Organization) | |
phone | token | Patient.telecom.where(system='phone') |
phonetic | string | Patient.name |
telecom | token | Patient.telecom |
With FHIR search there is one tricky moment - most of expressions return complex types like HumanName or Identifier, which is not easy to search by SQL. So fhirpath provides specialised function to output search friendly results:
Invariants with fhirpath.pg
With fhirpath we can create invariants as PostgreSQL Constraints. Let's add a check that all patients have SSN number:
Now when you will try to add patient without SSN - you will see an ERROR:
Last updated