Class PlainParamValueProcessor
- java.lang.Object
-
- org.linuxforhealth.fhir.persistence.params.database.PlainParamValueProcessor
-
- All Implemented Interfaces:
IParamValueProcessor
- Direct Known Subclasses:
PlainDerbyParamValueProcessor
,PlainPostgresParamValueProcessor
public abstract class PlainParamValueProcessor extends java.lang.Object implements IParamValueProcessor
Loads search parameter values into the target PostgreSQL database using the plain (non-sharded) schema variant.
-
-
Field Summary
Fields Modifier and Type Field Description protected java.sql.Connection
connection
protected static short
FIXED_SHARD
protected IParameterIdentityCache
identityCache
protected int
maxCodeSystemsPerStatement
protected int
maxCommonCanonicalValuesPerStatement
protected int
maxCommonTokenValuesPerStatement
protected int
maxLogicalResourcesPerStatement
protected java.lang.String
schemaName
protected IDatabaseTranslator
translator
-
Constructor Summary
Constructors Constructor Description PlainParamValueProcessor(IDatabaseTranslator translator, java.sql.Connection connection, java.lang.String schemaName, IParameterIdentityCache cache)
Public constructor
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected void
addMissingCodeSystems(java.util.List<CodeSystemValue> missing)
These code systems weren't found in the database, so we need to try and add them.protected void
addMissingCommonCanonicalValues(java.util.List<CommonCanonicalValue> missing)
Add the values we think are missing from the database.protected void
addMissingCommonTokenValues(java.util.List<CommonTokenValue> missing)
Add the values we think are missing from the database.protected void
addMissingLogicalResourceIdents(java.util.List<LogicalResourceIdentValue> missing)
These logical_resource_ident values weren't found in the database, so we need to try and add them.protected PreparedStatementWrapper
buildCommonTokenValueSelectStatement(java.util.List<CommonTokenValue> values)
Build and prepare a statement to fetch the common_token_value records for all the given (unresolved) code system valuesprotected java.sql.PreparedStatement
buildLogicalResourceIdentSelectStatement(java.util.List<LogicalResourceIdentValue> values)
Build and prepare a statement to fetch the code_system_id and code_system_name from the code_systems table for all the given (unresolved) code system valuesvoid
close()
Close out the current batch, completing the processing for any parameter values collected so farprotected java.lang.Integer
createParameterName(java.lang.String parameterName)
Create the parameter name using the stored procedure which handles any concurrency issue we may haveprotected java.util.List<CommonCanonicalValue>
fetchCanonicalIds(java.util.List<CommonCanonicalValue> unresolved, java.util.Map<CommonCanonicalValueKey,CommonCanonicalValue> commonCanonicalValueMap)
Fetch the common_canonical_id values for the given list of CommonCanonicalValue objects.protected java.util.List<CodeSystemValue>
fetchCodeSystemIds(java.util.List<CodeSystemValue> unresolved, java.util.Map<java.lang.String,CodeSystemValue> codeSystemValueMap)
Fetch all the code_system_id values for the given list of CodeSystemValue objects.protected java.util.List<CommonTokenValue>
fetchCommonTokenValueIds(java.util.List<CommonTokenValue> unresolved, java.util.Map<CommonTokenValueKey,CommonTokenValue> commonTokenValueMap)
Fetch the common_token_value_id values for the given list of CommonTokenValue objects.protected java.util.List<LogicalResourceIdentValue>
fetchLogicalResourceIdentIds(java.util.List<LogicalResourceIdentValue> unresolved, java.util.Map<LogicalResourceIdentKey,LogicalResourceIdentValue> logicalResourceIdentMap)
Fetch logical_resource_id values for the given list of LogicalResourceIdent objects.protected abstract java.lang.String
onConflict()
void
publish(BatchParameterValue bpv)
Publish the given parameter value (which by now should have any FK references it needs)void
pushBatch()
Push any data we've accumulated so far.void
resetBatch()
Call when a transaction has been rolled back because of a deadlock or other retryable error and we want to try and process the batch againvoid
resolveCanonicalValues(java.util.List<CommonCanonicalValue> unresolvedCanonicalValues, java.util.Map<CommonCanonicalValueKey,CommonCanonicalValue> commonCanonicalValueMap)
void
resolveCommonTokenValues(java.util.List<CommonTokenValue> unresolvedTokenValues, java.util.Map<CommonTokenValueKey,CommonTokenValue> commonTokenValueMap)
Make sure we have values for all the common_token_value records we have collected in the current batchvoid
resolveLogicalResourceIdents(java.util.List<LogicalResourceIdentValue> unresolvedLogicalResourceIdents, java.util.Map<LogicalResourceIdentKey,LogicalResourceIdentValue> logicalResourceIdentMap)
Make sure we have values for all the logical_resource_ident values we have collected in the current batch.void
resolveParameterNames(java.util.List<ParameterNameValue> unresolvedParameterNames, java.util.Map<java.lang.String,ParameterNameValue> parameterNameMap)
void
resolveSystemValues(java.util.List<CodeSystemValue> unresolvedSystemValues, java.util.Map<java.lang.String,CodeSystemValue> codeSystemValueMap)
Make sure we have values for all the code_systems we have collected in the current batchvoid
startBatch()
Initialize the processor ready to start a new batch
-
-
-
Field Detail
-
FIXED_SHARD
protected static final short FIXED_SHARD
- See Also:
- Constant Field Values
-
connection
protected final java.sql.Connection connection
-
translator
protected final IDatabaseTranslator translator
-
schemaName
protected final java.lang.String schemaName
-
identityCache
protected final IParameterIdentityCache identityCache
-
maxLogicalResourcesPerStatement
protected final int maxLogicalResourcesPerStatement
- See Also:
- Constant Field Values
-
maxCodeSystemsPerStatement
protected final int maxCodeSystemsPerStatement
- See Also:
- Constant Field Values
-
maxCommonTokenValuesPerStatement
protected final int maxCommonTokenValuesPerStatement
- See Also:
- Constant Field Values
-
maxCommonCanonicalValuesPerStatement
protected final int maxCommonCanonicalValuesPerStatement
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
PlainParamValueProcessor
public PlainParamValueProcessor(IDatabaseTranslator translator, java.sql.Connection connection, java.lang.String schemaName, IParameterIdentityCache cache)
Public constructor- Parameters:
translator
-connection
-schemaName
-cache
-
-
-
Method Detail
-
startBatch
public void startBatch()
Description copied from interface:IParamValueProcessor
Initialize the processor ready to start a new batch- Specified by:
startBatch
in interfaceIParamValueProcessor
-
close
public void close()
Description copied from interface:IParamValueProcessor
Close out the current batch, completing the processing for any parameter values collected so far- Specified by:
close
in interfaceIParamValueProcessor
-
publish
public void publish(BatchParameterValue bpv) throws FHIRPersistenceException
Description copied from interface:IParamValueProcessor
Publish the given parameter value (which by now should have any FK references it needs)- Specified by:
publish
in interfaceIParamValueProcessor
- Throws:
FHIRPersistenceException
-
pushBatch
public void pushBatch() throws FHIRPersistenceException
Description copied from interface:IParamValueProcessor
Push any data we've accumulated so far. This may occur if we cross a volume or functional threshold, and will always occur as the last step before the current transaction is committed.- Specified by:
pushBatch
in interfaceIParamValueProcessor
- Throws:
FHIRPersistenceException
-
resolveSystemValues
public void resolveSystemValues(java.util.List<CodeSystemValue> unresolvedSystemValues, java.util.Map<java.lang.String,CodeSystemValue> codeSystemValueMap) throws FHIRPersistenceException
Make sure we have values for all the code_systems we have collected in the current batch- Specified by:
resolveSystemValues
in interfaceIParamValueProcessor
- Throws:
FHIRPersistenceException
-
onConflict
protected abstract java.lang.String onConflict()
-
addMissingCodeSystems
protected void addMissingCodeSystems(java.util.List<CodeSystemValue> missing) throws FHIRPersistenceException
These code systems weren't found in the database, so we need to try and add them. We have to deal with concurrency here - there's a chance another thread could also be trying to add them. To avoid deadlocks, it's important to do any inserts in a consistent order. At the end, we should be able to read back values for each entry- Parameters:
missing
-- Throws:
FHIRPersistenceException
-
fetchCodeSystemIds
protected java.util.List<CodeSystemValue> fetchCodeSystemIds(java.util.List<CodeSystemValue> unresolved, java.util.Map<java.lang.String,CodeSystemValue> codeSystemValueMap) throws FHIRPersistenceException
Fetch all the code_system_id values for the given list of CodeSystemValue objects.- Parameters:
unresolved
-- Returns:
- Throws:
FHIRPersistenceException
-
resolveCommonTokenValues
public void resolveCommonTokenValues(java.util.List<CommonTokenValue> unresolvedTokenValues, java.util.Map<CommonTokenValueKey,CommonTokenValue> commonTokenValueMap) throws FHIRPersistenceException
Make sure we have values for all the common_token_value records we have collected in the current batch- Specified by:
resolveCommonTokenValues
in interfaceIParamValueProcessor
- Throws:
FHIRPersistenceException
-
buildCommonTokenValueSelectStatement
protected PreparedStatementWrapper buildCommonTokenValueSelectStatement(java.util.List<CommonTokenValue> values) throws java.sql.SQLException
Build and prepare a statement to fetch the common_token_value records for all the given (unresolved) code system values- Parameters:
values
-- Returns:
- SELECT code_system, token_value, common_token_value_id
- Throws:
java.sql.SQLException
-
fetchCommonTokenValueIds
protected java.util.List<CommonTokenValue> fetchCommonTokenValueIds(java.util.List<CommonTokenValue> unresolved, java.util.Map<CommonTokenValueKey,CommonTokenValue> commonTokenValueMap) throws FHIRPersistenceException
Fetch the common_token_value_id values for the given list of CommonTokenValue objects.- Parameters:
unresolved
-commonTokenValueMap
-- Returns:
- Throws:
FHIRPersistenceException
-
addMissingCommonTokenValues
protected void addMissingCommonTokenValues(java.util.List<CommonTokenValue> missing) throws FHIRPersistenceException
Add the values we think are missing from the database. The given list should be sorted to reduce deadlocks- Parameters:
missing
-- Throws:
FHIRPersistenceException
-
resolveCanonicalValues
public void resolveCanonicalValues(java.util.List<CommonCanonicalValue> unresolvedCanonicalValues, java.util.Map<CommonCanonicalValueKey,CommonCanonicalValue> commonCanonicalValueMap) throws FHIRPersistenceException
- Specified by:
resolveCanonicalValues
in interfaceIParamValueProcessor
- Throws:
FHIRPersistenceException
-
fetchCanonicalIds
protected java.util.List<CommonCanonicalValue> fetchCanonicalIds(java.util.List<CommonCanonicalValue> unresolved, java.util.Map<CommonCanonicalValueKey,CommonCanonicalValue> commonCanonicalValueMap) throws FHIRPersistenceException
Fetch the common_canonical_id values for the given list of CommonCanonicalValue objects.- Parameters:
unresolved
-- Returns:
- Throws:
FHIRPersistenceException
-
addMissingCommonCanonicalValues
protected void addMissingCommonCanonicalValues(java.util.List<CommonCanonicalValue> missing) throws FHIRPersistenceException
Add the values we think are missing from the database. The given list should be sorted to reduce deadlocks- Parameters:
missing
-- Throws:
FHIRPersistenceException
-
resolveParameterNames
public void resolveParameterNames(java.util.List<ParameterNameValue> unresolvedParameterNames, java.util.Map<java.lang.String,ParameterNameValue> parameterNameMap) throws FHIRPersistenceException
- Specified by:
resolveParameterNames
in interfaceIParamValueProcessor
- Throws:
FHIRPersistenceException
-
createParameterName
protected java.lang.Integer createParameterName(java.lang.String parameterName) throws FHIRPersistenceException
Create the parameter name using the stored procedure which handles any concurrency issue we may have- Parameters:
parameterName
-- Returns:
- Throws:
FHIRPersistenceException
-
resetBatch
public void resetBatch()
Description copied from interface:IParamValueProcessor
Call when a transaction has been rolled back because of a deadlock or other retryable error and we want to try and process the batch again- Specified by:
resetBatch
in interfaceIParamValueProcessor
-
resolveLogicalResourceIdents
public void resolveLogicalResourceIdents(java.util.List<LogicalResourceIdentValue> unresolvedLogicalResourceIdents, java.util.Map<LogicalResourceIdentKey,LogicalResourceIdentValue> logicalResourceIdentMap) throws FHIRPersistenceException
Description copied from interface:IParamValueProcessor
Make sure we have values for all the logical_resource_ident values we have collected in the current batch. Need to make sure these are added in order to minimize deadlocks. Note that because we may create new logical_resource_ident records, we could be blocked by the main add_any_resource procedure run within the server CREATE/UPDATE- Specified by:
resolveLogicalResourceIdents
in interfaceIParamValueProcessor
- Throws:
FHIRPersistenceException
-
buildLogicalResourceIdentSelectStatement
protected java.sql.PreparedStatement buildLogicalResourceIdentSelectStatement(java.util.List<LogicalResourceIdentValue> values) throws java.sql.SQLException
Build and prepare a statement to fetch the code_system_id and code_system_name from the code_systems table for all the given (unresolved) code system values- Parameters:
values
-- Returns:
- Throws:
java.sql.SQLException
-
addMissingLogicalResourceIdents
protected void addMissingLogicalResourceIdents(java.util.List<LogicalResourceIdentValue> missing) throws FHIRPersistenceException
These logical_resource_ident values weren't found in the database, so we need to try and add them. We have to deal with concurrency here - there's a chance another thread could also be trying to add them. To avoid deadlocks, it's important to do any inserts in a consistent order. At the end, we should be able to read back values for each entry- Parameters:
missing
-- Throws:
FHIRPersistenceException
-
fetchLogicalResourceIdentIds
protected java.util.List<LogicalResourceIdentValue> fetchLogicalResourceIdentIds(java.util.List<LogicalResourceIdentValue> unresolved, java.util.Map<LogicalResourceIdentKey,LogicalResourceIdentValue> logicalResourceIdentMap) throws FHIRPersistenceException
Fetch logical_resource_id values for the given list of LogicalResourceIdent objects.- Parameters:
unresolved
-- Returns:
- Throws:
FHIRPersistenceException
-
-