Source code for fhirpack.extraction.patient
from typing import Union
from fhirpy.lib import SyncFHIRResource
from fhirpy.lib import SyncFHIRReference
import fhirpack.utils as utils
import fhirpack.base as base
import fhirpack.extraction.base as extractionBase
[docs]class ExtractorPatientMixin(extractionBase.BaseExtractorMixin):
# TODO test len(references) = 0
# TODO test len(references) = 1
# TODO test len(references) > 1
# TODO raise len(references) = 0?
[docs] def getPatients(
self,
input: Union[
list[str],
list[SyncFHIRReference],
# list[SyncFHIRResource],
] = None,
searchParams: dict = None,
includeLinkedPatients=False,
params: dict = None,
ignoreFrame: bool = False,
):
if includeLinkedPatients:
return self.getLinkedPatients(input, searchParams)
searchActive = False if searchParams is None else True
searchParams = {} if searchParams is None else searchParams
params = {} if params is None else params
input = [] if input is None else input
result = []
if len(input):
input = self.castOperand(input, SyncFHIRReference, "Patient")
result = self.getResources(input, resourceType="Patient", raw=True)
elif self.isFrame and not ignoreFrame:
utils.validateFrame(self)
input = self.data
if self.resourceTypeIs("Condition"):
result = input.apply(
lambda x: self.searchResources(
searchParams=dict(searchParams, **{"_id": x.subject.id}),
resourceType="Patient",
raw=True,
)
)
elif self.resourceTypeIs("Patient"):
result = input.apply(
lambda x: self.searchResources(
searchParams=dict(searchParams, **{"_id": x.id}),
resourceType="Patient",
raw=True,
)
)
elif self.resourceTypeIs("DiagnosticReport"):
result = input.apply(
lambda x: self.searchResources(
searchParams=dict(searchParams, **{"_id": x.subject.id}),
resourceType="Patient",
raw=True,
)
)
elif self.resourceTypeIs("ImagingStudy"):
result = input.apply(
lambda x: self.searchResources(
searchParams=dict(searchParams, **{"_id": x.subject.id}),
resourceType="Patient",
raw=True,
)
)
else:
raise NotImplementedError
result = result.values
elif searchActive:
result = self.searchResources(
searchParams=searchParams, resourceType="Patient", raw=True
)
else:
raise NotImplementedError
result = self.prepareOutput(result)
return result
# TODO test len(result) = 0
# TODO test len(result) = 1
# TODO test len(result) > 1
# TODO raise len(result) > 1
[docs] def getRootPatients(
self,
input: Union[
list[str],
list[SyncFHIRReference],
list[SyncFHIRResource],
] = None,
searchParams: dict = None,
params: dict = None,
ignoreFrame: bool = False,
):
searchActive = False if searchParams is None else searchParams
searchParams = {} if searchParams is None else searchParams
params = {} if params is None else params
input = [] if input is None else input
result = []
if len(input):
pass
elif self.isFrame and not ignoreFrame:
input = self
elif searchActive:
raise NotImplementedError
else:
raise NotImplementedError
input = self.castOperand(input, SyncFHIRResource, "Patient")
input = self.castOperand(input, base.Frame, "Patient")
if input.resourceTypeIs("Patient"):
input = input.data
result = input.apply(
lambda x: self.searchResources(
searchParams=dict(searchParams, **{"link": x.id}),
resourceType="Patient",
raw=True,
)
)
result = result.combine(input, lambda x, y: x if len(x) > 0 else [y])
else:
raise NotImplementedError
result = self.prepareOutput(result, "Patient")
return result
[docs] def getLinkedPatients(
self,
input: Union[
list[str],
list[SyncFHIRReference],
list[SyncFHIRResource],
] = None,
searchParams: dict = None,
params: dict = None,
ignoreFrame: bool = False,
):
searchActive = False if searchParams is None else searchParams
searchParams = {} if searchParams is None else searchParams
params = {} if params is None else params
input = [] if input is None else input
result = []
if len(input):
pass
elif self.isFrame and not ignoreFrame:
input = self
elif searchActive:
raise NotImplementedError
else:
raise NotImplementedError
input = self.castOperand(input, SyncFHIRReference, "Patient")
input = self.castOperand(input, base.Frame, "Patient")
if input.resourceTypeIs("Patient"):
rootPatients = input.getRootPatients().explode("data", ignore_index=True)
input = rootPatients.gatherSimplePaths(["link.other.reference"]).rename(
columns={"link.other.reference": "data"}
)
# .fillna("").apply(list)
patients = input.data.apply(
lambda x: self.getResources(
x, ignoreFrame=True, resourceType="Patient"
).data.values,
)
result = patients
else:
raise NotImplementedError
result = self.prepareOutput(result, "Patient")
if not result.size:
result = input
return result