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
- Swagger
- Azure App Configuration
- Kafka Configuration
- Kafka Consumer Retry Configuration
- Service Registry Configuration
- CORS Configuration
- Token Service Configuration
- Service Authentication
- SQL Server Database Configuration
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
ResourcesAcquiredevent 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:
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.
Use Case: Ensuring location data adheres to external standards.
Details:
Facilitates normalization of local codes into standardized codes via the Location.type field.
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
| Name | Type | Required? | Length |
|---|---|---|---|
| MigrationId | string | Yes | 150 |
| ProductVersion | string | Yes | 32 |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | string | Yes | |
| FacilityId | string | No | 255 |
| OperationJson | string | Yes | |
| OperationType | string | Yes | 255 |
| Description | string | No | |
| IsDisabled | boolean | Yes | |
| CreateDate | string (date-time) | Yes | |
| ModifyDate | string (date-time) | No | |
| Name | string | No |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | string | Yes | |
| OperationId | string | Yes | |
| ResourceTypeId | string | Yes |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | string | Yes | |
| OperationResourceTypeId | string | Yes | |
| FacilityId | string | No | 255 |
| Sequence | integer | No | |
| CreateDate | string (date-time) | Yes | |
| ModifyDate | string (date-time) | No |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | string | Yes | |
| Name | string | No | 255 |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | string | Yes | |
| Name | string | Yes | 255 |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | string | Yes | |
| VendorId | string | Yes | |
| Version | string | No | 255 |
| Name | Type | Required? | Length |
|---|---|---|---|
| Id | string | Yes | |
| CreateDate | string (date-time) | Yes | |
| ModifyDate | string (date-time) | No | |
| VendorVersionId | string | Yes | |
| OperationResourceTypeId | string | Yes |
OpenAPI Operations
Route Parameters
None
Query Parameters
None
Route Parameters
None
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| facilityId | No | ||
| operationType | No | ||
| resourceType | No | ||
| operationId | No | ||
| includeDisabled | No | ||
| vendorId | No | ||
| sortBy | No | ||
| sortOrder | No | ||
| pageSize | No | ||
| pageNumber | No |
Route Parameters
None
Query Parameters
None
Route Parameters
None
Query Parameters
None
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| facilityId | Yes |
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| operationType | No | ||
| resourceType | No | ||
| operationId | No | ||
| includeDisabled | No | ||
| vendorId | No | ||
| sortBy | No | ||
| sortOrder | No | ||
| pageSize | No | ||
| pageNumber | No |
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| facilityId | Yes |
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| operationId | No | ||
| resourceType | No |
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| vendor | Yes |
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| operationType | No | ||
| resourceType | No | ||
| operationId | No | ||
| includeDisabled | No | ||
| sortBy | No | ||
| sortOrder | No | ||
| pageSize | No | ||
| pageNumber | No |
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| vendor | Yes |
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| operationId | No | ||
| resourceType | No |
Route Parameters
None
Query Parameters
None
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| id | Yes |
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| facilityId | No |
Route Parameters
None
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| facilityId | No | ||
| resourceType | No | ||
| resourceTypeId | No |
Route Parameters
None
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| facilityId | No | ||
| resourceType | No |
Route Parameters
None
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| facilityId | No | ||
| resourceType | No |
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| resource | Yes |
Query Parameters
None
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| resource | Yes |
Query Parameters
None
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| resource | Yes |
Query Parameters
None
Route Parameters
None
Query Parameters
None
Route Parameters
None
Query Parameters
None
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| resource | Yes |
Query Parameters
None
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| vendor | Yes |
Query Parameters
None
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| vendor | Yes |
Query Parameters
None
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| vendor | Yes |
Query Parameters
None
Route Parameters
None
Query Parameters
None
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| vendor | Yes |
Query Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| resource | No |
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| vendor | Yes | ||
| presetId | Yes |
Query Parameters
None
Route Parameters
| Name | Type | Required? | Description |
|---|---|---|---|
| vendor | Yes | ||
| presetId | Yes |
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