Normalization Service

Overview

FHIR resources queried from EHR endpoints can vary from location to location. There will be occasions where data for specific resources may need to be adjusted to ensure that Link Cloud properly evaluates a patient against dQM’s. The Normalization service is a component in Link Cloud to help make those adjustments in an automated way. The service operates in between the resource acquisition and evaluation steps to ensure that the tenant data is in a readied state for measure evaluation.

Nodes

flowchart LR
nNormalizationService_78B0F5BC["Service: Normalization Service"]
  nNormalizationService_78B0F5BC -->|produces| nresources_normalized_6C1D52A7["Event: resources-normalized"]
  nresources_acquired_7C72478A["Event: resources-acquired"] -->|consumed by| nNormalizationService_78B0F5BC
  subgraph nCompliance_11EAF98F_domain["Domain: Compliance"]
    nresources_normalized_6C1D52A7
  end
  subgraph nDataAccess_43BF0C8B_domain["Domain: Data Access"]
    nresources_acquired_7C72478A
  end
  subgraph nReport_523BC237_domain["Domain: Report"]
    nNormalizationService_78B0F5BC
  end

Common Configurations

Service Configurations

  • ResourceCache__Redis__ConnectionString: Connection string to access the deployed Redis environment.
  • ResourceCache__Redis__Password: Password for the deployed Redis environment.
  • ResourceCache__BlobStorage__ConnectionString: Connection string to access the deployed Azure Blob Storage environment.
  • ResourceCache__BlobStorage__BlobContainerName: The Azure Blob Storage container name where cached resources will be stored.
  • ResourceCache__BlobStorage__BlobRoot: Root Azure Blob Storage directory the cached resources will be located.

Features and Functionality

The Normalization functionality is a critical step in preparing FHIR resources for further processing, such as measure evaluation or submission. It ensures that data adheres to expected formats, codes, and structures, enabling consistent and accurate downstream workflows.

Key Features

  • Normalizations are applied to each FHIR resource acquired from the EHR. When a ResourcesAcquired event is consumed, the Normalization service will retrieve the patient FHIR resources from a cache destination and process the resource types that have tenant normalization configurations.
  • The process is executed immediately after data acquisition.
  • Tenant-specific configuration ensures normalization aligns with each tenant's requirements.

Resource Caching

The CacheType value on consumed ResourcesAcquired events will inform the Normalization service whether patient FHIR resources are stored on Redis or Azure Blob Storage. The event contains a CacheKeys array that details which FHIR resource types were collected for the patient. This was done to optimize the normalization workflow to only process resource types that are applicable to a tenant's configurations.

For Redis caching, after normalization is complete, all FHIR resources for the patient are added to a new hash key to optimize the evaluation phase. When a ResourcesNormalized event is generated, a singular CacheKey will be on each event that will represent all of the related resources for the patient.

Supported Operations

Normalization is supported by the following configurable operations:

Converts codes from one system to another using a configurable list of mappings. **Use Case**: Standardizing codes between local EHR systems and external reporting requirements. **Details**: Matches a "source code/system" pair. Converts it to the specified "target code/system." Corrects resource IDs that are improperly formatted, such as IDs exceeding 64 characters. **Use Case**: Complying with FHIR standards and maintaining reference consistency. **Details**: Replaces the invalid ID with a **hash** of the original ID. Updates any **references** to the corrected ID to ensure integrity. Copies values between properties in a FHIR resource using FHIRPath expressions.

Use Case: Populating properties required for measure evaluation or reporting.

Details: Identifies source and destination properties using FHIRPath. Copies the value from the source to the destination. Description: TODO: Document Copies the identifiers from a Location resource to its type property.

Use Case: Ensuring location data adheres to external standards.

Details: Facilitates normalization of local codes into standardized codes via the Location.type field. Ensures that the precision of Period.start matches the precision of Period.end.

Use Case: Avoiding processing errors during measure evaluation.

Details: Modifies Period.start to match the precision of Period.end. Prevents errors in the CQL (measure evaluation) engine caused by inconsistent precision in Period types.

Configuration

Normalization settings are tenant-specific and configured to meet the unique requirements of each tenant. This ensures flexibility and adaptability across different EHR implementations.

The order of operations in the normalization configuration is defined by the index of each operation in the dictionary/configuration.

Example:

{
  "OperationSequence": {
    "1": {
      "$type": "CopyLocationIdentifierToTypeOperation"
    },
    "0": {
      "$type": "ConceptMapOperation"
    },
    "2": {
      "$type": "ConditionalTransformationOperation"
    }
  }
}

In this case, "ConceptMapOperation" is executed first, followed by "CopyLocationIdentifier...", followed by "ConditionalTransform...".

Database Schema

NameTypeRequired?Length
MigrationIdstringYes150
ProductVersionstringYes32
NameTypeRequired?Length
IdstringYes450
FacilityLocationIdstringYes450
LocalCodeSystemstringYes450
LocalCodestringYes450
HSLOCIdstringNo
CreateDatestring (date-time)Yes
ModifyDatestring (date-time)No
NameTypeRequired?Length
IdstringYes450
FacilityIdstringYes450
LocationIdstringYes450
PartOfIdstringNo
ParentFacilityLocationIdstringNo450
LocationNamestringNo
LocationAliasstringNo
CreateDatestring (date-time)Yes
ModifyDatestring (date-time)No
NameTypeRequired?Length
IdstringYes
HSLOCCodestringYes450
CDCCodestringYes
ShortDescriptionstringYes
LongDescriptionstringYes
VersionstringYes450
IsActivebooleanYes
NameTypeRequired?Length
IdstringYes
FacilityIdstringNo255
OperationJsonstringYes
OperationTypestringYes255
DescriptionstringNo
IsDisabledbooleanYes
CreateDatestring (date-time)Yes
ModifyDatestring (date-time)No
NamestringNo
NameTypeRequired?Length
IdstringYes
OperationIdstringYes
ResourceTypeIdstringYes
NameTypeRequired?Length
IdstringYes
OperationResourceTypeIdstringYes
FacilityIdstringNo255
SequenceintegerNo
CreateDatestring (date-time)Yes
ModifyDatestring (date-time)No
NameTypeRequired?Length
IdstringYes
NamestringYes255
NameTypeRequired?Length
IdstringYes
CreateDatestring (date-time)Yes
ModifyDatestring (date-time)No
VendorVersionIdstringYes
OperationResourceTypeIdstringYes
NameTypeRequired?Length
SCHED_NAMEstringYes120
TRIGGER_NAMEstringYes150
TRIGGER_GROUPstringYes150
BLOB_DATAstringNo
NameTypeRequired?Length
SCHED_NAMEstringYes120
CALENDAR_NAMEstringYes200
CALENDARstringYes
NameTypeRequired?Length
SCHED_NAMEstringYes120
TRIGGER_NAMEstringYes150
TRIGGER_GROUPstringYes150
CRON_EXPRESSIONstringYes120
TIME_ZONE_IDstringNo120
NameTypeRequired?Length
SCHED_NAMEstringYes120
ENTRY_IDstringYes140
TRIGGER_NAMEstringYes150
TRIGGER_GROUPstringYes150
INSTANCE_NAMEstringYes150
FIRED_TIMEintegerYes
SCHED_TIMEintegerYes
PRIORITYintegerYes
STATEstringYes16
JOB_NAMEstringNo150
JOB_GROUPstringNo150
IS_NONCONCURRENTbooleanYes
REQUESTS_RECOVERYbooleanNo
NameTypeRequired?Length
SCHED_NAMEstringYes120
JOB_NAMEstringYes150
JOB_GROUPstringYes150
DESCRIPTIONstringNo250
JOB_CLASS_NAMEstringYes250
IS_DURABLEbooleanYes
IS_NONCONCURRENTbooleanYes
IS_UPDATE_DATAbooleanYes
REQUESTS_RECOVERYbooleanYes
JOB_DATAstringNo
NameTypeRequired?Length
SCHED_NAMEstringYes120
LOCK_NAMEstringYes40
NameTypeRequired?Length
SCHED_NAMEstringYes120
TRIGGER_GROUPstringYes150
NameTypeRequired?Length
SCHED_NAMEstringYes120
INSTANCE_NAMEstringYes200
LAST_CHECKIN_TIMEintegerYes
CHECKIN_INTERVALintegerYes
NameTypeRequired?Length
SCHED_NAMEstringYes120
TRIGGER_NAMEstringYes150
TRIGGER_GROUPstringYes150
REPEAT_COUNTintegerYes
REPEAT_INTERVALintegerYes
TIMES_TRIGGEREDintegerYes
NameTypeRequired?Length
SCHED_NAMEstringYes120
TRIGGER_NAMEstringYes150
TRIGGER_GROUPstringYes150
STR_PROP_1stringYes512
STR_PROP_2stringYes512
STR_PROP_3stringYes512
INT_PROP_1integerNo
INT_PROP_2integerNo
LONG_PROP_1integerNo
LONG_PROP_2integerNo
DEC_PROP_1numberNo
DEC_PROP_2numberNo
BOOL_PROP_1booleanNo
BOOL_PROP_2booleanNo
TIME_ZONE_IDstringNo80
NameTypeRequired?Length
SCHED_NAMEstringYes120
TRIGGER_NAMEstringYes150
TRIGGER_GROUPstringYes150
JOB_NAMEstringYes150
JOB_GROUPstringYes150
DESCRIPTIONstringNo250
NEXT_FIRE_TIMEintegerNo
PREV_FIRE_TIMEintegerNo
PRIORITYintegerNo
TRIGGER_STATEstringYes16
TRIGGER_TYPEstringYes8
START_TIMEintegerYes
END_TIMEintegerNo
CALENDAR_NAMEstringNo200
MISFIRE_INSTRintegerNo
JOB_DATAstringNo

OpenAPI Operations

Route Parameters

None

Query Parameters
NameTypeRequired?Description
includeInactiveNo
Route Parameters

None

Query Parameters

None

Route Parameters

None

Query Parameters

None

Route Parameters
NameTypeRequired?Description
versionYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
idYes
Query Parameters

None

Route Parameters

None

Query Parameters

None

Route Parameters

None

Query Parameters
NameTypeRequired?Description
facilityIdNo
operationTypeNo
resourceTypeNo
operationIdNo
includeDisabledNo
vendorVersionIdNo
sortByNo
sortOrderNo
pageSizeNo
pageNumberNo
Route Parameters

None

Query Parameters

None

Route Parameters

None

Query Parameters

None

Route Parameters
NameTypeRequired?Description
facilityIdYes
Query Parameters
NameTypeRequired?Description
operationTypeNo
resourceTypeNo
operationIdNo
includeDisabledNo
vendorVersionIdNo
sortByNo
sortOrderNo
pageSizeNo
pageNumberNo
Route Parameters
NameTypeRequired?Description
facilityIdYes
Query Parameters
NameTypeRequired?Description
operationIdNo
resourceTypeNo
Route Parameters
NameTypeRequired?Description
vendorVersionIdYes
Query Parameters
NameTypeRequired?Description
operationTypeNo
resourceTypeNo
operationIdNo
includeDisabledNo
sortByNo
sortOrderNo
pageSizeNo
pageNumberNo
Route Parameters
NameTypeRequired?Description
vendorVersionIdYes
Query Parameters
NameTypeRequired?Description
operationIdNo
resourceTypeNo
Route Parameters

None

Query Parameters

None

Route Parameters
NameTypeRequired?Description
idYes
Query Parameters
NameTypeRequired?Description
facilityIdNo
Route Parameters

None

Query Parameters
NameTypeRequired?Description
facilityIdNo
resourceTypeNo
resourceTypeIdNo
Route Parameters

None

Query Parameters
NameTypeRequired?Description
facilityIdNo
resourceTypeNo
Route Parameters

None

Query Parameters
NameTypeRequired?Description
facilityIdNo
resourceTypeNo
Route Parameters
NameTypeRequired?Description
resourceYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
resourceYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
resourceYes
Query Parameters

None

Route Parameters

None

Query Parameters

None

Route Parameters

None

Query Parameters

None

Route Parameters
NameTypeRequired?Description
resourceYes
Query Parameters

None

Route Parameters

None

Query Parameters
NameTypeRequired?Description
vendorVersionIdNo
resourceNo
Route Parameters

None

Query Parameters

None

Route Parameters
NameTypeRequired?Description
presetIdYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
vendorVersionIdYes
presetIdYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
facilityIdYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
facilityIdYes
locationIdYes
Query Parameters

None

Route Parameters

None

Query Parameters
NameTypeRequired?Description
unmappedNo
pageSizeNo
pageNumberNo
Route Parameters
NameTypeRequired?Description
mappingIdYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
mappingIdYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
mappingIdYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
facilityIdYes
Query Parameters
NameTypeRequired?Description
unmappedNo
pageSizeNo
pageNumberNo
Route Parameters
NameTypeRequired?Description
facilityIdYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
facilityIdYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
facilityIdYes
locationIdYes
Query Parameters
NameTypeRequired?Description
unmappedNo
pageSizeNo
pageNumberNo
Route Parameters
NameTypeRequired?Description
facilityIdYes
localCodeYes
Query Parameters
NameTypeRequired?Description
unmappedNo
pageSizeNo
pageNumberNo

Health check endpoint

Route Parameters

None

Query Parameters

None

Relationships

flowchart LR
nNormalizationService_78B0F5BC["Service: Normalization Service"]
  nNormalizationService_78B0F5BC -->|produces| nresources_normalized_6C1D52A7["Event: resources-normalized"]
  nresources_acquired_7C72478A["Event: resources-acquired"] -->|consumed by| nNormalizationService_78B0F5BC
  subgraph nCompliance_11EAF98F_domain["Domain: Compliance"]
    nresources_normalized_6C1D52A7
  end
  subgraph nDataAccess_43BF0C8B_domain["Domain: Data Access"]
    nresources_acquired_7C72478A
  end
  subgraph nReport_523BC237_domain["Domain: Report"]
    nNormalizationService_78B0F5BC
  end