HL7 FHIR® Implementation Guide: Electronic Case Reporting (eCR) - US Realm
1.1.0 - STU 2 Ballot

This page is part of the electronic Case Reporting (eCR) (v1.1.0: STU 2 on FHIR R4 Ballot 1) based on FHIR R4. The current version which supercedes this version is 2.1.0. For a full list of available versions, see the Directory of published versions

Example Library: Rule Filters

Id: library-RuleFilters-1.0.0
Type: logic-library
Version: 1.0.0
Status: active
Related:

type: depends-on

Resource:
http://aphl.org/fhir/ecr/Library/library-FHIRHelpers|4.0.0

Data Requirements:

type: ValueSet

type: Observation

type: Encounter

type: Location

type: CodeSystem

type: Organization

type: Organization

Content: type: text/cql
                            library RuleFilters version '1.0.0'

using FHIR version '4.0.0'

include FHIRHelpers version '4.0.0'

codesystem "UsageContext": 'http://terminology.hl7.org/CodeSystem/usage-context-type'
codesystem "JurisdictionsList": 'http://hl7.org/fhir/us/ecr/CodeSystem/ersd-jurisdictions'
valueset "Indeterminate or Equivocal Lab Result Value": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1146.1035'
valueset "Negative or Undetected Lab Result Value": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1146.1034'

code "focus": 'focus' from UsageContext
//code "Chlamydia": 'Chlamydia'

/* parameter "Triggering Encounter" Encounter */

context Patient

define "Chlamydia ValueSets":
  [ValueSet] ValueSet
    where exists (
      ValueSet.useContext UseContext
        where UseContext.code ~ "focus"
          and not  IsNull(
            UseContext.value Value
              where Value.text = 'Chlamydia'
          )
    )

define function ExpandValueSetCodes(value List<ValueSet>):
  value Value
    return Value.expansion.contains.code

define function ExpandValueSetSystems(value List<ValueSet>):
  value Value
    return Value.expansion.contains.system

define "Flattened ValueSet Expansion Codes":
  flatten( ExpandValueSetCodes("Chlamydia ValueSets") )

define "Flattened ValueSet Expansion Systems":
  flatten( ExpandValueSetSystems("Chlamydia ValueSets") )

define function ObservationWithSystemAndCodeInChlamydiaValueSets(observation Observation):
    not IsNull(
      observation.code  OConcept
        where exists (
          OConcept.coding OCoding
            where ( OCoding.code in "Flattened ValueSet Expansion Codes" )
               and OCoding.system in "Flattened ValueSet Expansion Systems"
        )
    )

define function ObservationWithCodeInChlamydiaValueSets(observation Observation):
  not IsNull(
    observation.code  OConcept
      where exists (
        OConcept.coding OCoding where OCoding.code in flatten( ExpandValueSetCodes("Chlamydia ValueSets") )
      )
  )

define function ChlamydiaObservations(observation Observation):
  if exists (observation.code.coding.system)
  then ObservationWithSystemAndCodeInChlamydiaValueSets(observation)
  else ObservationWithCodeInChlamydiaValueSets(observation)

define "Chlamydia Test Results":
  [Observation] O
    where ChlamydiaObservations(O)
      and O.status in { 'preliminary', 'final', 'amended', 'corrected' }

define "Triggering Encounter":
[Encounter] E

define "Encounter Location References":
  flatten("Triggering Encounter" TriggeringEncounter
    return TriggeringEncounter.location.location)

define "Locations Matching Encounter Location References":
  [Location] Location
    where exists (
        "Encounter Location References" LocationReference
          where ('Location/' + Location.id) ~ LocationReference.reference
      )

/* define "Encounter Location Addresses And Patient Addresses":
  "Locations Matching Encounter Location References".address
    union Patient.address */

define "Encounter Location Address":
  "Locations Matching Encounter Location References" Address
    return Tuple { state: Address.address.state,  postalCode: Address.address.postalCode }

define "Patient Address":
  Patient.address PA
  return Tuple { state: PA.state, postalCode: PA.postalCode }

/* define "Address Elements Relevant to Jurisdiction Qualification":
  "Encounter Location Addresses And Patient Addresses" Address
    return Tuple { state: Address.state,  postalCode: Address.postalCode } */

define "Jurisdictions":
  flatten([CodeSystem] C
    return C.concept Cpt
      return Tuple { jurisdictionCode: Cpt.code,
        definition: Cpt.definition,
        jurisdictionType: Cpt.property P where P.code='type' return P.value as FHIR.string,
        stateCode: Cpt.property P where P.code = 'state' return P.value as FHIR.code,
        postalCode: Cpt.property P where P.code = 'postalcode' return P.value as FHIR.code
        })

define "Encounter Address Postal Code is in Jurisdiction Codes":
  "Jurisdictions" J
    with "Encounter Location Address" LocationAddress
      such that LocationAddress.postalCode in J.postalCode

define "Encounter Address State is in Jurisdiction Codes":
    "Jurisdictions" J
      with "Encounter Location Address" LocationAddress
        such that LocationAddress.state in J.stateCode
          and 'STATE' in J.jurisdictionType

define "Patient Address Postal Code is in Jurisdiction Codes":
  "Jurisdictions" J
    with "Patient Address" PA
      such that PA.postalCode in J.postalCode

define "Patient Address State is in Jurisdiction Codes":
  "Jurisdictions" J
    with "Patient Address" PA
      such that PA.state in J.stateCode
        and 'STATE' in J.jurisdictionType

define "Address Exists in Jurisdiction Codes":
  exists (
    "Encounter Address State is in Jurisdiction Codes"
      union "Encounter Address Postal Code is in Jurisdiction Codes"
        union "Patient Address State is in Jurisdiction Codes"
          union "Patient Address Postal Code is in Jurisdiction Codes"
    )

define function EncounterAddressJurisdictions():
  if exists ("Encounter Address Postal Code is in Jurisdiction Codes")
    then "Encounter Address Postal Code is in Jurisdiction Codes"
      else "Encounter Address State is in Jurisdiction Codes"

define function PatientAddressJurisdictions():
  if exists ("Patient Address Postal Code is in Jurisdiction Codes")
    then "Patient Address Postal Code is in Jurisdiction Codes"
      else "Patient Address State is in Jurisdiction Codes"

define "Jurisdiction Codes Relevant to Encounter Addresses":
  EncounterAddressJurisdictions()

define "Jurisdiction Codes Relevant to Patient Addresses":
  PatientAddressJurisdictions()

define "Indeterminate Chlamydia Test Results":
  "Chlamydia Test Results" O
    let organization: [Organization]
    where (
      (
        exists (
            O.interpretation interpretationConcept
              where interpretationConcept as CodeableConcept in "Indeterminate or Equivocal Lab Result Value"
        )
          or O.value as CodeableConcept in "Indeterminate or Equivocal Lab Result Value"
      )
        or "Address Exists in Jurisdiction Codes"
    )

define "Negative Chlamydia Test Results":
  "Chlamydia Test Results" O
    let organization: [Organization]
    where (
      (
        exists (
            O.interpretation interpretationConcept
              where interpretationConcept as CodeableConcept in "Negative or Undetected Lab Result Value"
        )
          or O.value as CodeableConcept in "Negative or Undetected Lab Result Value"
      )
        and "Address Exists in Jurisdiction Codes"
    )

define "Is Reportable":
  exists "Indeterminate Chlamydia Test Results"
    or exists "Negative Chlamydia Test Results"