fhirstore
Python library to manipulate fhir resources leveraging mongoDB as storage layer.
Installation
pip install fhirstore
Usage
from pymongo import MongoClient
from fhirstore import FHIRStore
client = MongoClient()
store = FHIRStore(client, "<my_database>")
store.reset()
store.bootstrap(depth=5)
store.resume(depth=5)
store.create({
"resourceType": "Patient",
"id": "pat1",
"gender": "male"
})
patient = store.read("Patient", "pat1")
updated_patient = store.update("Patient", "pat1", {"gender": "other"})
deleted_patients_count = store.delete("Patient", "pat1")
deleted_patients_count = store.delete("Patient", resource_id="pyrogResouceId")
Bootstrap the database
- Start the database
- Drop and re-create all collections based on the provided schema
docker-compose up -d
python main.py
Development setup
- Create a virtual environment and enter it
- Install python dependncies
virtualenv .
. ./bin/activate
pip install -r requirements.txt
pip install -r requirements-dev.txt
Test
Test can be run using :
python -m pytest
Make sure dev dependencies are installed.
Benchmark
A benchmark based on example FHIR resources publicly available at can be run using :
python benchmark/benchmark.py
Note that you will need to have a MongoDB up in order for the benchmark to run. You can use the docker-compose file of this repository by running docker-compose up
before launching the benchmark.
On a machine with 16GB RAM and an i7 (2.5GHz) processor, the results of the benchamrk were:
--- WRITES ---
insertions per second (on average): 267.17
average: 3.74 milliseconds
median: 1.66 milliseconds
min: 1.07 milliseconds
max: 724.65 milliseconds
spread: 0.00028004697751347234
--- READS ---
reads per second (on average): 378.93
average: 2.63 milliseconds
median: 1.50 milliseconds
min: 0.88 milliseconds
max: 481.18 milliseconds
spread: 0.0002154728657872756
On the same machine, here are the results for the same benchmark using a different library, fhirbase. The latter relies on postgreSQL rather than MongoDB as its storage layer. Also, it only supports FHIR resources 3.3.0 and below.
--- WRITES ---
insertions per second (on average): 152.38
average: 6.56 milliseconds
median: 4.43 milliseconds
min: 3.08 milliseconds
max: 158.88 milliseconds
spread: 7.568139030481407e-05
--- READS ---
reads per second (on average): 261.07
average: 3.83 milliseconds
median: 3.03 milliseconds
min: 2.17 milliseconds
max: 102.06 milliseconds
spread: 1.4565324857334904e-05
Publish
First, you need to have twine
installedd
pip install --user --upgrade twine
Make sure you have bumped the version number in setup.py
, then run the following:
python setup.py sdist bdist_wheel
python -m twine upload dist/*