Class FhirSchemaGenerator
- java.lang.Object
-
- org.linuxforhealth.fhir.schema.control.FhirSchemaGenerator
-
public class FhirSchemaGenerator extends java.lang.Object
Encapsulates the generation of the FHIR schema artifacts
-
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String
ADMIN_GROUP
static java.lang.String
FHIRDATA_GROUP
static java.lang.String
SCHEMA_GROUP_TAG
-
Constructor Summary
Constructors Constructor Description FhirSchemaGenerator(java.lang.String adminSchemaName, java.lang.String schemaName, SchemaType schemaType)
Generate the IBM FHIR Server Schema for all resourceTypesFhirSchemaGenerator(java.lang.String adminSchemaName, java.lang.String schemaName, SchemaType schemaType, java.util.Set<java.lang.String> resourceTypes)
Generate the LinuxForHealth FHIR Server Schema with just the given resourceTypes
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected void
addCodeSystems(PhysicalDataModel model)
Add the code_systems table to the database schema CREATE TABLE code_systems ( code_system_id INT NOT NULL CONSTRAINT pk_code_system PRIMARY KEY, code_system_name VARCHAR(255 OCTETS) NOT NULL ); CREATE UNIQUE INDEX unq_code_system_cinm ON code_systems(code_system_name);void
addCommonCanonicalValues(PhysicalDataModel pdm)
Create the COMMON_CANONICAL_VALUES table.void
addCommonTokenValues(PhysicalDataModel pdm)
Adds the appropriate common_token_values table depending on the schema typevoid
addCommonTokenValuesDistributed(PhysicalDataModel pdm)
The common_token_values definition used for the distributed (Citus) variant of the schema.void
addCommonTokenValuesStandard(PhysicalDataModel pdm)
Table used to store normalized values for tokens, shared by all the_TOKEN_VALUES tables. void
addErasedResources(PhysicalDataModel pdm)
The erased_resources table is used to track which logical resources and corresponding resource versions have been erased using the $erase operation.protected void
addFhirChangeSequence(PhysicalDataModel pdm)
Adds a new sequence required for distributed databases like Citusprotected void
addFhirRefSequence(PhysicalDataModel pdm)
protected void
addFhirSequence(PhysicalDataModel pdm)
CREATE SEQUENCE fhir_sequence AS BIGINT START WITH 1 CACHE 20000 NO CYCLE;Table
addLogicalResourceCompartments(PhysicalDataModel pdm)
Adds the system level logical_resource_compartments table which identifies to which compartments a give resource belongs.Table
addLogicalResourceProfiles(PhysicalDataModel pdm)
A single-parameter table supporting _profile search parameter values Add the LOGICAL_RESOURCE_PROFILES table to the givenPhysicalDataModel
.void
addLogicalResources(PhysicalDataModel pdm)
Add the system-wide logical_resources table.Table
addLogicalResourceSecurity(PhysicalDataModel pdm)
Add the dedicated common_token_values mapping table for security search parametersTable
addLogicalResourceTags(PhysicalDataModel pdm)
A single-parameter table supporting _tag search parameter values.protected void
addParameterNames(PhysicalDataModel model)
CREATE TABLE parameter_names ( parameter_name_id INT NOT NULL CONSTRAINT pk_parameter_name PRIMARY KEY, parameter_name VARCHAR(255 OCTETS) NOT NULL ); CREATE UNIQUE INDEX unq_parameter_name_rtnm ON parameter_names(parameter_name) INCLUDE (parameter_name_id);protected void
addReferencesSequence(PhysicalDataModel pdm)
Add the sequence used by the new local/external references data modelvoid
addResourceChangeLog(PhysicalDataModel pdm)
Add the resource_change_log table.Table
addResourceDateValues(PhysicalDataModel model)
Add the table for data search parameters at the (system-wide) resource levelTable
addResourceStrValues(PhysicalDataModel pdm)
Add system-wide RESOURCE_STR_VALUES table to support _profile properties (which are of type REFERENCE).protected void
addResourceTables(PhysicalDataModel model, IDatabaseObject... dependency)
Add the collection of tables for each of the listed FHIR resource typesTable
addResourceTokenRefs(PhysicalDataModel pdm)
Add the system-wide RESOURCE_TOKEN_REFS table which is used for _tag and _security search properties in R4 (new table for issue #1366 V0006 schema change).protected void
addResourceTypes(PhysicalDataModel model)
CREATE TABLE resource_types ( resource_type_id INT NOT NULL CONSTRAINT pk_resource_type PRIMARY KEY, resource_type VARCHAR(64) NOT NULL ); -- make sure resource_type values are unique CREATE UNIQUE INDEX unq_resource_types_rt ON resource_types(resource_type);protected void
addTenantKeysTable(PhysicalDataModel model)
Each tenant can have multiple access keys which are used to authenticate and authorize clients for access to the data for a given tenant.protected void
addTenantSequence(PhysicalDataModel pdm)
CREATE SEQUENCE fhir_sequence AS BIGINT START WITH 1 CACHE 1000 NO CYCLE;protected void
addTenantTable(PhysicalDataModel model)
Create a table to manage the list of tenants.protected java.util.List<With>
addWiths()
The defaults with addWiths.void
buildAdminSchema(PhysicalDataModel model)
Build the admin part of the schema.void
buildDatabaseSpecificArtifactsCitus(PhysicalDataModel model)
Add stored procedures/functions for Citus (largely based on PostgreSQL, but some functions are distributed based on a parameter to make them more efficient.void
buildDatabaseSpecificArtifactsPostgres(PhysicalDataModel model)
void
buildSchema(PhysicalDataModel model)
Create the schema using the given target
-
-
-
Field Detail
-
SCHEMA_GROUP_TAG
public static final java.lang.String SCHEMA_GROUP_TAG
- See Also:
- Constant Field Values
-
FHIRDATA_GROUP
public static final java.lang.String FHIRDATA_GROUP
- See Also:
- Constant Field Values
-
ADMIN_GROUP
public static final java.lang.String ADMIN_GROUP
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
FhirSchemaGenerator
public FhirSchemaGenerator(java.lang.String adminSchemaName, java.lang.String schemaName, SchemaType schemaType)
Generate the IBM FHIR Server Schema for all resourceTypes- Parameters:
adminSchemaName
-schemaName
-
-
FhirSchemaGenerator
public FhirSchemaGenerator(java.lang.String adminSchemaName, java.lang.String schemaName, SchemaType schemaType, java.util.Set<java.lang.String> resourceTypes)
Generate the LinuxForHealth FHIR Server Schema with just the given resourceTypes- Parameters:
adminSchemaName
-schemaName
-resourceTypes
-- Throws:
java.lang.IllegalArgumentException
- if one or more of the resource types are not valid FHIR resource types
-
-
Method Detail
-
buildAdminSchema
public void buildAdminSchema(PhysicalDataModel model)
Build the admin part of the schema. One admin schema can support multiple FHIRDATA schemas. It is also possible to have multiple admin schemas (on a dev system, for example, although in production there would probably be just one admin schema in a given database- Parameters:
model
-
-
addTenantTable
protected void addTenantTable(PhysicalDataModel model)
Create a table to manage the list of tenants. The tenant id is used as a partition value for all the other tables- Parameters:
model
-
-
addTenantKeysTable
protected void addTenantKeysTable(PhysicalDataModel model)
Each tenant can have multiple access keys which are used to authenticate and authorize clients for access to the data for a given tenant. We support multiple keys per tenant as a way to allow key rotation in the configuration without impacting service continuity- Parameters:
model
-
-
addTenantSequence
protected void addTenantSequence(PhysicalDataModel pdm)
CREATE SEQUENCE fhir_sequence AS BIGINT START WITH 1 CACHE 1000 NO CYCLE;
- Parameters:
pdm
-
-
buildSchema
public void buildSchema(PhysicalDataModel model)
Create the schema using the given target- Parameters:
model
-
-
buildDatabaseSpecificArtifactsPostgres
public void buildDatabaseSpecificArtifactsPostgres(PhysicalDataModel model)
-
buildDatabaseSpecificArtifactsCitus
public void buildDatabaseSpecificArtifactsCitus(PhysicalDataModel model)
Add stored procedures/functions for Citus (largely based on PostgreSQL, but some functions are distributed based on a parameter to make them more efficient.- Parameters:
model
-
-
addLogicalResources
public void addLogicalResources(PhysicalDataModel pdm)
Add the system-wide logical_resources table. Note that LOGICAL_ID is denormalized, stored in both LOGICAL_RESOURCES and_LOGICAL_RESOURCES. This avoids an additional join, and simplifies the migration to this new schema model. - Parameters:
pdm
-
-
addCommonCanonicalValues
public void addCommonCanonicalValues(PhysicalDataModel pdm)
Create the COMMON_CANONICAL_VALUES table. Used from schema V0014 to normalize meta.profile search parameters (similar to common_token_values). Only the url is included by design. The (optional) version and fragment values are stored in the parameter mapping table (logical_resource_profiles) in order to support inequalities on version while still using a literal CANONICAL_ID = x predicate. These canonical ids are cached in the server, so search queries won't need to join to this table. The URL is typically a long string, so by normalizing and storing/indexing it once, we reduce space consumption.- Parameters:
pdm
-
-
addLogicalResourceProfiles
public Table addLogicalResourceProfiles(PhysicalDataModel pdm)
A single-parameter table supporting _profile search parameter values Add the LOGICAL_RESOURCE_PROFILES table to the givenPhysicalDataModel
. This table maps logical resources to meta.profile values stored as canonical URIs in COMMON_CANONICAL_VALUES. Canonical values can include optional version and fragment values as described here: https://www.hl7.org/fhir/datatypes.html#canonical- Parameters:
pdm
-- Returns:
-
addLogicalResourceTags
public Table addLogicalResourceTags(PhysicalDataModel pdm)
A single-parameter table supporting _tag search parameter values. Tags are tokens, but because they may not be very selective we use a separate table in order to avoid messing up cardinality estimates in the query optimizer.- Parameters:
pdm
-- Returns:
-
addLogicalResourceSecurity
public Table addLogicalResourceSecurity(PhysicalDataModel pdm)
Add the dedicated common_token_values mapping table for security search parameters- Parameters:
pdm
-- Returns:
-
addResourceChangeLog
public void addResourceChangeLog(PhysicalDataModel pdm)
Add the resource_change_log table. This table supports tracking of every change made to a resource at the global level, making it much easier to stream a list of changes from a known point.- Parameters:
pdm
-
-
addLogicalResourceCompartments
public Table addLogicalResourceCompartments(PhysicalDataModel pdm)
Adds the system level logical_resource_compartments table which identifies to which compartments a give resource belongs. A resource may belong to many compartments.- Parameters:
pdm
-- Returns:
- Table the table that was added to the PhysicalDataModel
-
addResourceStrValues
public Table addResourceStrValues(PhysicalDataModel pdm)
Add system-wide RESOURCE_STR_VALUES table to support _profile properties (which are of type REFERENCE).- Parameters:
pdm
-- Returns:
- Table the table that was added to the PhysicalDataModel
-
addResourceDateValues
public Table addResourceDateValues(PhysicalDataModel model)
Add the table for data search parameters at the (system-wide) resource level- Parameters:
model
-- Returns:
- Table the table that was added to the PhysicalDataModel
-
addResourceTypes
protected void addResourceTypes(PhysicalDataModel model)
CREATE TABLE resource_types ( resource_type_id INT NOT NULL CONSTRAINT pk_resource_type PRIMARY KEY, resource_type VARCHAR(64) NOT NULL ); -- make sure resource_type values are unique CREATE UNIQUE INDEX unq_resource_types_rt ON resource_types(resource_type);
- Parameters:
model
-
-
addResourceTables
protected void addResourceTables(PhysicalDataModel model, IDatabaseObject... dependency)
Add the collection of tables for each of the listed FHIR resource types- Parameters:
model
-
-
addParameterNames
protected void addParameterNames(PhysicalDataModel model)
CREATE TABLE parameter_names ( parameter_name_id INT NOT NULL CONSTRAINT pk_parameter_name PRIMARY KEY, parameter_name VARCHAR(255 OCTETS) NOT NULL ); CREATE UNIQUE INDEX unq_parameter_name_rtnm ON parameter_names(parameter_name) INCLUDE (parameter_name_id);- Parameters:
model
-
-
addCodeSystems
protected void addCodeSystems(PhysicalDataModel model)
Add the code_systems table to the database schema CREATE TABLE code_systems ( code_system_id INT NOT NULL CONSTRAINT pk_code_system PRIMARY KEY, code_system_name VARCHAR(255 OCTETS) NOT NULL ); CREATE UNIQUE INDEX unq_code_system_cinm ON code_systems(code_system_name);- Parameters:
model
-
-
addCommonTokenValues
public void addCommonTokenValues(PhysicalDataModel pdm)
Adds the appropriate common_token_values table depending on the schema type- Parameters:
pdm
-
-
addCommonTokenValuesStandard
public void addCommonTokenValuesStandard(PhysicalDataModel pdm)
Table used to store normalized values for tokens, shared by all the_TOKEN_VALUES tables. Although this requires an additional join, it cuts down on space by avoiding repeating long strings (e.g. urls). This also helps to reduce the total sizes of the indexes, helping to improve cache hit rates for a given buffer cache size. Token values may or may not have an associated code system, in which case, it assigned a default system. This is why CODE_SYSTEM_ID is not nullable and has a FK constraint. We never need to find all token values for a given code-system, so there's no need for a second index (CODE_SYSTEM_ID, TOKEN_VALUE). Do not add it. Because different parameter names may reference the same token value (e.g. 'Observation.subject' and 'Claim.patient' are both patient references), the common token value is not distinguished by a parameter_name_id. From V0027, token values are no longer used to represent relationships between resources. When using a distributed database (Citus), this table is distributed as a REFERENCE table, meaning that all records will exist on all nodes. - Parameters:
pdm
-
-
addCommonTokenValuesDistributed
public void addCommonTokenValuesDistributed(PhysicalDataModel pdm)
The common_token_values definition used for the distributed (Citus) variant of the schema. Because this table may contain one or more values per resource (e.g. identifier), we need to distribute it somehow.- Parameters:
pdm
-- See Also:
addCommonTokenValuesStandard(PhysicalDataModel)
-
addResourceTokenRefs
public Table addResourceTokenRefs(PhysicalDataModel pdm)
Add the system-wide RESOURCE_TOKEN_REFS table which is used for _tag and _security search properties in R4 (new table for issue #1366 V0006 schema change). Replaces the previous TOKEN_VALUES table. All token values are now normalized in the COMMON_TOKEN_VALUES table. Because this is for system-level params, there's no need to support composite params- Parameters:
pdm
-- Returns:
- Table the table that was added to the PhysicalDataModel
-
addErasedResources
public void addErasedResources(PhysicalDataModel pdm)
The erased_resources table is used to track which logical resources and corresponding resource versions have been erased using the $erase operation. This table should typically be empty and only used temporarily by the erase DAO/procedures to indicate which rows have been erased. The entries in this table are then used to delete any offloaded payload entries.- Parameters:
pdm
-
-
addFhirSequence
protected void addFhirSequence(PhysicalDataModel pdm)
CREATE SEQUENCE fhir_sequence AS BIGINT START WITH 1 CACHE 20000 NO CYCLE;
- Parameters:
pdm
-
-
addFhirChangeSequence
protected void addFhirChangeSequence(PhysicalDataModel pdm)
Adds a new sequence required for distributed databases like Citus- Parameters:
pdm
-
-
addFhirRefSequence
protected void addFhirRefSequence(PhysicalDataModel pdm)
-
addReferencesSequence
protected void addReferencesSequence(PhysicalDataModel pdm)
Add the sequence used by the new local/external references data model- Parameters:
pdm
-
-
addWiths
protected java.util.List<With> addWiths()
The defaults with addWiths. Added to every table in a PostgreSQL schema- Returns:
-
-