Skip to main content

FHIRPath implementation in Python.

Project description

Introduction

https://img.shields.io/travis/nazrulworld/fhirpath.svg Documentation Status Test Coverage Python Versions Language grade: Python https://img.shields.io/pypi/v/fhirpath.svg License HL7® FHIR®

FHIRPath Normative Release (v2.0.0) implementation in Python, along side it provides support for FHIR Search API and Query (we called it fql(FHIR Query Language)) API to fetch FHIR resources from any data-source(database). This library is built in ORM like approach. Our goal is to make 100% (as much as possible) FHIRPath Normative Release (v2.0.0) specification compliance product.

Usages

This library is kind of abstract type, where all specifications from FHIRPath Normative Release (v2.0.0) are implemented rather than completed solution (ready to go). The main reason behind this design pattern, to support multiple database systems as well as well as any framework, there is no dependency.

fhirpath never taking care of creating indexes, mappings (elasticsearch) and storing data, if you want to use this library, you have to go through any of existing providers (see list bellow) or make your own provider (should not too hard work).

Simple example

Assumption:

  1. Elasticsearch server 7.x.x Installed.

  2. Mappings and indexes are handled manually.

  3. Data (document) also are stored manually.

Create Connection and Engine:

>>> from fhirpath.connectors import create_connection
>>> from fhirpath.engine.es import ElasticsearchEngine
>>> from fhirpath.engine import dialect_factory
>>> from fhirpath.enums import FHIR_VERSION

>>> host, port = "127.0.0.1", 9200
>>> conn_str = "es://@{0}:{1}/".format(host, port)
>>> connection = create_connection(conn_str, "elasticsearch.Elasticsearch")
>>> connection.raw_connection.ping()
True
>>> engine = ElasticsearchEngine(FHIR_VERSION.R4, lambda x: connection, dialect_factory)

Basic Search:

>>> from fhirpath.search import Search
>>> from fhirpath.search import SearchContext

>>> search_context = SearchContext(engine, "Organization")
>>> params = (
....    ("active", "true"),
....    ("_lastUpdated", "2010-05-28T05:35:56+00:00"),
....    ("_profile", "http://hl7.org/fhir/Organization"),
....    ("identifier", "urn:oid:2.16.528.1|91654"),
....    ("type", "http://hl7.org/fhir/organization-type|prov"),
....    ("address-postalcode", "9100 AA"),
....    ("address", "Den Burg"),
.... )
>>> fhir_search = Search(search_context, params=params)
>>> bundle = fhir_search()
>>> len(bundle.entry) == 0
True

Basic Query:

>>> from fhirpath.enums import SortOrderType
>>> from fhirpath.query import Q_
>>> from fhirpath.fql import T_
>>> from fhirpath.fql import V_
>>> from fhirpath.fql import exists_
>>> query_builder = Q_(resource="Organization", engine=engine)
>>>  query_builder = (
....    query_builder.where(T_("Organization.active") == V_("true"))
....    .where(T_("Organization.meta.lastUpdated", "2010-05-28T05:35:56+00:00"))
....    .sort(sort_("Organization.meta.lastUpdated", SortOrderType.DESC))
.... )
>>> query_result = query_builder(async_result=False)
>>> for resource in query_result:
....    assert resource.__class__.__name__ == "OrganizationModel"
>>> # test fetch all
>>> result = query_result.fetchall()
>>> result.__class__.__name__ == "EngineResult"
True

>>> query_builder = Q_(resource="ChargeItem", engine=engine)
>>> query_builder = query_builder.where(exists_("ChargeItem.enteredDate"))
>>> result = query_builder(async_result=False).single()
>>> result is not None
True
>>> isinstance(result, builder._from[0][1])
True

>>> query_builder = Q_(resource="ChargeItem", engine=engine)
>>> query_builder = query_builder.where(exists_("ChargeItem.enteredDate"))
>>> result = query_builder(async_result=False).first()
>>> result is not None
True
>>> isinstance(result, builder._from[0][1])
True

Available Provider (known)

Currently very few numbers of providers available, however more will coming soon.

fhirpath-guillotina

A guillotina framework powered provider, battery included, ready to go! Please follow associated documentation.

  1. Engine: Elasticsearch

  2. PyPi: https://pypi.org/project/fhirpath-guillotina/

  3. Source: https://github.com/nazrulworld/fhirpath_guillotina

collective.fhirpath

A Plone powered provider, like fhirpath-guillotina every thing is included. ready to go, although has a dependency on plone.app.fhirfield.

  1. Engine: Elasticsearch

  2. PyPi: https://pypi.org/project/collective.fhirpath/

  3. Source: https://github.com/nazrulworld/collective.fhirpath

unlisted

Why are you waiting for? You are welcome to list your provider here! Developing provider should not be so hard, as fhirpath is giving you convenient APIs.

ToDo

  1. fhirbase engine aka provider implementation.

  2. All methods/functions are defined in FHIRPath specification, would be completed.

Credits

This package skeleton was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

© Copyright HL7® logo, FHIR® logo and the flaming fire are registered trademarks owned by Health Level Seven International

“FHIR® is the registered trademark of HL7 and is used with the permission of HL7. Use of the FHIR trademark does not constitute endorsement of this product by HL7”

History

0.7.0 (2020-08-07)

Improvements

  • Issue#5: Now ElasticsearchEngine::get_index_name takes one optional parameter resource_type.

  • Add supports for python version 3.6.

Breaking

  • Make full capability with fhir.resources version 6.x.x, please have a look of revolutionary changes of fhir.resources.

0.6.2 (2020-06-30)

  • fhirspec and fhir.resources versions are pinned.

0.6.1 (2020-05-09)

A must update release (from 0.6.0)!

Bugfixes

  • fix: issues, those arieses due to fix bellow issue.

  • fix: fhirpath.storage.FHIR_RESOURCE_CLASS_STORAGE, fhirpath.storage.PATH_INFO_STORAGE, fhirpath.storage.SEARCH_PARAMETERS_STORAGE and fhirpath.storage.FHIR_RESOURCE_SPEC_STORAGE took wrong FHIR release as keys.

0.6.0 (2020-05-08)

Breaking

0.5.1 (2020-03-18)

New features

  • __main__ module has been created, now possible to see version and/or initiated required FHIR versions. For example python -m "fhirpath" --version, python -m "fhirpath" --init-setup [nazrulworld]

Improvements

  • Updated fix version of elasticsearch mappings.

0.5.0 (2020-03-11)

New Features

  • FHIRPath (Normative Release) support available. A dedicated class is now available `fhirpath.FHIRPath, although it is working in progress (meaning that many methods/functions are yet to do complete.)

Improvements

Bugfixes

  • Upgrade to this version is recommended as it includes couples of major bug fixes.

Breaking

  • The fhirpath.navigator module has been removed and introduced new module fhirpath.model. fhirpath.utils.Model has been moved to fhirpath.model`.

0.4.1 (2019-11-05)

Bugfixes

  • fhirpath.search.Search.parse_query_string now returning MuliDict``(what is expected) instead of ``MultiDictProxy.

0.4.0 (2019-10-24)

Improvements

  • Now full select features are accepted, meaning that you can provide multiple path in select section. for example select(Patient.name, Patient.gender).

  • FHIRPath count() and empty() functions are supported.

  • Supports path navigation with index and functions inside select. Example [index], last(), first(), Skip(), Take(), count().

Breakings

  • QueryResult.first and QueryResult.single are no longer return FHIR Model instance instead returning fhirpath.engine.EngineResultRow.

  • QueryResult.fetchall returning list of fhirpath.engine.EngineResultRow instead of FHIR JSON.

  • QueryResult iteration returning list of FHIR Model instance on condition (if select is *), other than returning list of fhirpath.engine.EngineResultRow.

0.3.1 (2019-10-08)

Improvements

  • Add support for search parameter expression that contains with space+as (MedicationRequest.medication as CodeableConcept)

Bugfixes

0.3.0 (2019-09-30)

Improvements

  • Supports multiple AND values for same search parameter!.

  • Add support FHIR version STU3 compability for Money type search.[nazrulworld]

  • IN Query support added.[nazrulworld]

  • Support PathElement that contains string path with .as(), thus suports for Search also.

  • Supports Duration type in Search.

  • Add support composite type search param.

Bugfixes

  • Multiple search values (IN search)

  • Missing text for HumanName and Address search.

0.2.0 (2019-09-15)

Breakings:

  • Built-in providers ( guillotina_app and plone_app ) have been wiped as both becoming separate pypi project.

  • queries module has been moved from fql sub-package to fhirpath package and also renamed as query.

Improvements:

  • There are so many improvements made for almost all most modules.

  • FhirSearch coverages are increased.

  • Sort, Limit facilities added in Query as well in FhirSearch.

Bugfixes:

  • numbers of bugs fixed.

0.1.1 (2019-08-15)

  • First working version has been released. Of-course not full featured.

0.1.0 (2018-12-15)

  • First release on PyPI.(Just register purpose, not usable at all, next release coming soon)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fhirpath-0.7.0.tar.gz (79.5 kB view hashes)

Uploaded Source

Built Distribution

fhirpath-0.7.0-py2.py3-none-any.whl (87.2 kB view hashes)

Uploaded Python 2 Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page