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_4A3628B6["Service: Normalization Service"]
  nNormalizationService_4A3628B6 -->|produces| nresources_normalized_28215193["Event: resources-normalized"]
  nresources_acquired_566EB692["Event: resources-acquired"] -->|consumed by| nNormalizationService_4A3628B6
  subgraph nCompliance_DBAE25D_domain["Domain: Compliance"]
    nresources_normalized_28215193
  end
  subgraph nDataAccess_2A523756_domain["Domain: Data Access"]
    nresources_acquired_566EB692
  end
  subgraph nReport_4D4FBBDA_domain["Domain: Report"]
    nNormalizationService_4A3628B6
  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
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
NamestringNo255
NameTypeRequired?Length
IdstringYes
NamestringYes255
NameTypeRequired?Length
IdstringYes
VendorIdstringYes
VersionstringNo255
NameTypeRequired?Length
IdstringYes
CreateDatestring (date-time)Yes
ModifyDatestring (date-time)No
VendorVersionIdstringYes
OperationResourceTypeIdstringYes

OpenAPI Operations

Route Parameters

None

Query Parameters

None

Route Parameters

None

Query Parameters
NameTypeRequired?Description
facilityIdNo
operationTypeNo
resourceTypeNo
operationIdNo
includeDisabledNo
vendorIdNo
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
vendorIdNo
sortByNo
sortOrderNo
pageSizeNo
pageNumberNo
Route Parameters
NameTypeRequired?Description
facilityIdYes
Query Parameters
NameTypeRequired?Description
operationIdNo
resourceTypeNo
Route Parameters
NameTypeRequired?Description
vendorYes
Query Parameters
NameTypeRequired?Description
operationTypeNo
resourceTypeNo
operationIdNo
includeDisabledNo
sortByNo
sortOrderNo
pageSizeNo
pageNumberNo
Route Parameters
NameTypeRequired?Description
vendorYes
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
NameTypeRequired?Description
vendorYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
vendorYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
vendorYes
Query Parameters

None

Route Parameters

None

Query Parameters

None

Route Parameters
NameTypeRequired?Description
vendorYes
Query Parameters
NameTypeRequired?Description
resourceNo
Route Parameters
NameTypeRequired?Description
vendorYes
presetIdYes
Query Parameters

None

Route Parameters
NameTypeRequired?Description
vendorYes
presetIdYes
Query Parameters

None

Route Parameters

None

Query Parameters

None

Health check endpoint

Route Parameters

None

Query Parameters

None

Relationships

flowchart LR
nNormalizationService_4A3628B6["Service: Normalization Service"]
  nNormalizationService_4A3628B6 -->|produces| nresources_normalized_28215193["Event: resources-normalized"]
  nresources_acquired_566EB692["Event: resources-acquired"] -->|consumed by| nNormalizationService_4A3628B6
  subgraph nCompliance_DBAE25D_domain["Domain: Compliance"]
    nresources_normalized_28215193
  end
  subgraph nDataAccess_2A523756_domain["Domain: Data Access"]
    nresources_acquired_566EB692
  end
  subgraph nReport_4D4FBBDA_domain["Domain: Report"]
    nNormalizationService_4A3628B6
  end