Class ResourceDAOImpl
- java.lang.Object
-
- com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl
-
- com.ibm.fhir.persistence.jdbc.dao.impl.ResourceDAOImpl
-
- All Implemented Interfaces:
FHIRDbDAO
,ResourceDAO
- Direct Known Subclasses:
DerbyResourceDAO
,EraseResourceDAO
,PostgresResourceDAO
,PostgresResourceNoProcDAO
,ReindexResourceDAO
public class ResourceDAOImpl extends FHIRDbDAOImpl implements ResourceDAO
This Data Access Object implements the ResourceDAO interface for creating, updating, and retrieving rows in the IBM FHIR Server resource tables.
-
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String
DEFAULT_VALUE_REINDEX_TSTAMP
static int
IDX_DATA
static int
IDX_IS_DELETED
static int
IDX_LAST_UPDATED
static int
IDX_LOGICAL_ID
static int
IDX_LOGICAL_RESOURCE_ID
static int
IDX_RESOURCE_ID
static int
IDX_RESOURCE_PAYLOAD_KEY
static int
IDX_RESOURCE_TYPE_ID
static int
IDX_VERSION_ID
-
Constructor Summary
Constructors Constructor Description ResourceDAOImpl(java.sql.Connection c, java.lang.String schemaName, FHIRDbFlavor flavor, FHIRPersistenceJDBCCache cache, IResourceReferenceDAO rrd)
Constructs a DAO instance for use outside a managed transaction (JEE) environmentResourceDAOImpl(java.sql.Connection c, java.lang.String schemaName, FHIRDbFlavor flavor, javax.transaction.TransactionSynchronizationRegistry trxSynchRegistry, FHIRPersistenceJDBCCache cache, IResourceReferenceDAO rrd, ParameterTransactionDataImpl ptdi)
Constructs a DAO instance suitable for acquiring connections from a JDBC Datasource object.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected boolean
checkIfNoneMatch(java.lang.Integer ifNoneMatch, int currentVersionId)
Test for If-None-Match conditional create-on-update behavior.protected Resource
createDTO(java.sql.ResultSet resultSet, boolean hasResourceTypeId)
Creates and returns a Resource DTO based on the contents of the passed ResultSetprotected void
deleteFromParameterTable(java.sql.Connection conn, java.lang.String tableName, long logicalResourceId)
Delete all parameters for the given resourceId from the named parameter value tableprotected FHIRPersistenceJDBCCache
getCache()
Getter for access to theFHIRPersistenceJDBCCache
from subclassesprotected IResourceReferenceDAO
getResourceReferenceDAO()
Getter for the IResourceReferenceDAO used by this ResourceDAO implementationprotected java.lang.Integer
getResourceTypeId(java.lang.String resourceType)
Get the value of the database id for the given resourceType from the JDBCIdentityCache.protected java.lang.String
getSearchByIdsNoDataSql(java.lang.String resourceType)
protected java.lang.String
getSearchByIdsSql(java.lang.String resourceType)
protected ParameterTransactionDataImpl
getTransactionData()
Get the ParameterTransactionDataImpl held by this.java.util.List<Resource>
history(java.lang.String resourceType, java.lang.String logicalId, java.sql.Timestamp fromDateTime, int offset, int maxResults)
Reads and returns all versions of the Resource with the passed logicalId, ordered by descending version id.int
historyCount(java.lang.String resourceType, java.lang.String logicalId, java.sql.Timestamp fromDateTime)
Reads and returns the COUNT of all versions of the Resource with the passed logicalId.Resource
insert(Resource resource, java.util.List<ExtractedParameterValue> parameters, java.lang.String parameterHashB64, ParameterDAO parameterDao, java.lang.Integer ifNoneMatch)
Inserts the passed Resource DTO and its associated search parameters to the appropriate FHIR resource tables.Resource
read(java.lang.String logicalId, java.lang.String resourceType)
Reads and returns the latest version of the Resource with the passed logical id and resource type.java.util.Map<java.lang.String,java.lang.Integer>
readAllResourceTypeNames()
Reads all rows in the resource_types table and returns the data as a Mapjava.lang.Integer
readResourceTypeId(java.lang.String resourceType)
Reads the id associated with the name of the passed Resource type from the Resource_Types table.java.util.List<Resource>
search(Select select)
Executes the search contained in the passedSelect
, using its encapsulated search string and bind variables.java.util.List<Resource>
search(java.lang.String sqlSelect)
Executes the passed fully-formed SQL Select statement and returns the results If no matching resources are found, an empty collection is returned.java.util.List<Resource>
searchByIds(java.lang.String resourceType, java.util.List<java.lang.Long> resourceIds, boolean includeResourceData)
Searches for Resources that contain one of the passed ids.int
searchCount(Select countQuery)
Executes a count query based on the data contained in the passedSelect
statement, using its encapsulated search string and bind variables.int
searchCount(java.lang.String sqlSelectCount)
Executes the passed fully-formed SQL Select COUNT statement and returns the integer count.java.util.List<java.lang.Long>
searchForIds(Select dataQuery)
This method supports the execution of a specialized query designed to return Resource ids, based on the contents of the passed select statement.java.util.Map<java.lang.Integer,java.util.List<java.lang.Long>>
searchWholeSystem(Select wholeSystemQuery)
Executes the whole-system filter search contained in the passedSelect
, using its encapsulated search string and bind variables.protected void
setInt(java.sql.PreparedStatement ps, int index, java.lang.Integer value)
Set an int parameter in the statement, handling null as requiredvoid
setPersistenceContext(FHIRPersistenceContext context)
Sets the current persistence contextprotected void
setString(java.sql.PreparedStatement ps, int index, java.lang.String value)
Set a String parameter in the statement, handling null as requiredResource
versionRead(java.lang.String logicalId, java.lang.String resourceType, int versionId)
Reads and returns the version of the Resource with the passed logical id, resource type, and version id.-
Methods inherited from class com.ibm.fhir.persistence.jdbc.dao.impl.FHIRDbDAOImpl
buildExceptionWithIssue, buildFHIRPersistenceDBConnectException, cleanup, cleanup, createDTOs, getConnection, getFlavor, getSchemaName, getTranslator, isDb2Database, runCountQuery, runCountQuery, runQuery, runQuery, runQuery_STR_VALUES, severe, severe
-
Methods inherited from class java.lang.Object
clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface com.ibm.fhir.persistence.jdbc.dao.api.FHIRDbDAO
getConnection, getFlavor, isDb2Database
-
-
-
-
Field Detail
-
DEFAULT_VALUE_REINDEX_TSTAMP
public static final java.lang.String DEFAULT_VALUE_REINDEX_TSTAMP
- See Also:
- Constant Field Values
-
IDX_RESOURCE_ID
public static final int IDX_RESOURCE_ID
- See Also:
- Constant Field Values
-
IDX_LOGICAL_RESOURCE_ID
public static final int IDX_LOGICAL_RESOURCE_ID
- See Also:
- Constant Field Values
-
IDX_VERSION_ID
public static final int IDX_VERSION_ID
- See Also:
- Constant Field Values
-
IDX_LAST_UPDATED
public static final int IDX_LAST_UPDATED
- See Also:
- Constant Field Values
-
IDX_IS_DELETED
public static final int IDX_IS_DELETED
- See Also:
- Constant Field Values
-
IDX_DATA
public static final int IDX_DATA
- See Also:
- Constant Field Values
-
IDX_LOGICAL_ID
public static final int IDX_LOGICAL_ID
- See Also:
- Constant Field Values
-
IDX_RESOURCE_PAYLOAD_KEY
public static final int IDX_RESOURCE_PAYLOAD_KEY
- See Also:
- Constant Field Values
-
IDX_RESOURCE_TYPE_ID
public static final int IDX_RESOURCE_TYPE_ID
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
ResourceDAOImpl
public ResourceDAOImpl(java.sql.Connection c, java.lang.String schemaName, FHIRDbFlavor flavor, javax.transaction.TransactionSynchronizationRegistry trxSynchRegistry, FHIRPersistenceJDBCCache cache, IResourceReferenceDAO rrd, ParameterTransactionDataImpl ptdi)
Constructs a DAO instance suitable for acquiring connections from a JDBC Datasource object.- Parameters:
c
-schemaName
-flavor
-trxSyncRegistry
-
-
ResourceDAOImpl
public ResourceDAOImpl(java.sql.Connection c, java.lang.String schemaName, FHIRDbFlavor flavor, FHIRPersistenceJDBCCache cache, IResourceReferenceDAO rrd)
Constructs a DAO instance for use outside a managed transaction (JEE) environment- Parameters:
c
-schemaName
-flavor
-
-
-
Method Detail
-
getResourceReferenceDAO
protected IResourceReferenceDAO getResourceReferenceDAO()
Getter for the IResourceReferenceDAO used by this ResourceDAO implementation- Returns:
-
getTransactionData
protected ParameterTransactionDataImpl getTransactionData()
Get the ParameterTransactionDataImpl held by this.- Returns:
- the transactionData object. Can be null.
-
read
public Resource read(java.lang.String logicalId, java.lang.String resourceType) throws FHIRPersistenceDataAccessException, FHIRPersistenceDBConnectException
Description copied from interface:ResourceDAO
Reads and returns the latest version of the Resource with the passed logical id and resource type. If no matching resource is found, null is returned.- Specified by:
read
in interfaceResourceDAO
- Returns:
- Resource - The most recent version of the Resource with the passed logical id and resource type, or null if not found.
- Throws:
FHIRPersistenceDataAccessException
FHIRPersistenceDBConnectException
-
versionRead
public Resource versionRead(java.lang.String logicalId, java.lang.String resourceType, int versionId) throws FHIRPersistenceDataAccessException, FHIRPersistenceDBConnectException
Description copied from interface:ResourceDAO
Reads and returns the version of the Resource with the passed logical id, resource type, and version id. If no matching resource is found, null is returned.- Specified by:
versionRead
in interfaceResourceDAO
- Returns:
- Resource - The version of the Resource with the passed logical id, resource type, and version id or null if not found.
- Throws:
FHIRPersistenceDataAccessException
FHIRPersistenceDBConnectException
-
createDTO
protected Resource createDTO(java.sql.ResultSet resultSet, boolean hasResourceTypeId) throws FHIRPersistenceDataAccessException
Creates and returns a Resource DTO based on the contents of the passed ResultSet- Overrides:
createDTO
in classFHIRDbDAOImpl
- Parameters:
resultSet
- A ResultSet containing FHIR persistent object data.hasResourceTypeId
- True if the ResultSet includes the RESOURCE_TYPE_ID column- Returns:
- Resource - A Resource DTO
- Throws:
FHIRPersistenceDataAccessException
-
history
public java.util.List<Resource> history(java.lang.String resourceType, java.lang.String logicalId, java.sql.Timestamp fromDateTime, int offset, int maxResults) throws FHIRPersistenceDataAccessException, FHIRPersistenceDBConnectException
Description copied from interface:ResourceDAO
Reads and returns all versions of the Resource with the passed logicalId, ordered by descending version id. If non-null, the passed fromDateTime is used to limit the returned Resource versions to those that were updated after the fromDateTime.- Specified by:
history
in interfaceResourceDAO
- Parameters:
resourceType
- - The name of a FHIR Resource typelogicalId
- - The logical id of a FHIR ResourcefromDateTime
- - The starting date/time of the version history.- Returns:
- List
- An ordered list of Resource versions. - Throws:
FHIRPersistenceDataAccessException
FHIRPersistenceDBConnectException
-
historyCount
public int historyCount(java.lang.String resourceType, java.lang.String logicalId, java.sql.Timestamp fromDateTime) throws FHIRPersistenceDataAccessException, FHIRPersistenceDBConnectException
Description copied from interface:ResourceDAO
Reads and returns the COUNT of all versions of the Resource with the passed logicalId. If non-null, the passed fromDateTime is used to limit the count of Resource versions to those that were updated after the fromDateTime.- Specified by:
historyCount
in interfaceResourceDAO
- Parameters:
resourceType
- - The name of a FHIR Resource typelogicalId
- - The logical id of a FHIR ResourcefromDateTime
- - The starting date/time of the version history.- Returns:
- int - The count of Resource versions.
- Throws:
FHIRPersistenceDataAccessException
FHIRPersistenceDBConnectException
-
setPersistenceContext
public void setPersistenceContext(FHIRPersistenceContext context)
Description copied from interface:ResourceDAO
Sets the current persistence context- Specified by:
setPersistenceContext
in interfaceResourceDAO
-
readAllResourceTypeNames
public java.util.Map<java.lang.String,java.lang.Integer> readAllResourceTypeNames() throws FHIRPersistenceDBConnectException, FHIRPersistenceDataAccessException
Description copied from interface:ResourceDAO
Reads all rows in the resource_types table and returns the data as a Map- Specified by:
readAllResourceTypeNames
in interfaceResourceDAO
- Returns:
- Map
- A map containing key=parameter-name, value=parameter-name-id - Throws:
FHIRPersistenceDBConnectException
FHIRPersistenceDataAccessException
-
readResourceTypeId
public java.lang.Integer readResourceTypeId(java.lang.String resourceType) throws FHIRPersistenceDBConnectException, FHIRPersistenceDataAccessException
Description copied from interface:ResourceDAO
Reads the id associated with the name of the passed Resource type from the Resource_Types table. If the id for the passed name is not present in the database, an id is generated, persisted, and returned.- Specified by:
readResourceTypeId
in interfaceResourceDAO
- Returns:
- Integer - the id associated with the name of the passed Resource type.
- Throws:
FHIRPersistenceDBConnectException
FHIRPersistenceDataAccessException
-
getResourceTypeId
protected java.lang.Integer getResourceTypeId(java.lang.String resourceType) throws FHIRPersistenceException
Get the value of the database id for the given resourceType from the JDBCIdentityCache. If the id isn't found, then it is read from the database. Note that the resource type cache is prefilled and so we should never get a miss...but this is here as a just-in-case protection against reading the cache before the prefill is done.- Parameters:
resourceType
-- Returns:
- Throws:
FHIRPersistenceException
-
checkIfNoneMatch
protected boolean checkIfNoneMatch(java.lang.Integer ifNoneMatch, int currentVersionId)
Test for If-None-Match conditional create-on-update behavior. The If-None-Match header value is encoded by the REST layer (minimizes propagation of user input) using the following rulesIf-None-Match: null then ifNoneMatch = null If-None-Match: * then ifNoneMatch = 0
Other values such as W/"1" are intentionally unsupported because their behavior may be unintuitive, especially around deleted resources.- Parameters:
ifNoneMatch
- the encoded If-None-Match header valuecurrentVersionId
- the current version of the resource to compare with- Returns:
-
insert
public Resource insert(Resource resource, java.util.List<ExtractedParameterValue> parameters, java.lang.String parameterHashB64, ParameterDAO parameterDao, java.lang.Integer ifNoneMatch) throws FHIRPersistenceException
Description copied from interface:ResourceDAO
Inserts the passed Resource DTO and its associated search parameters to the appropriate FHIR resource tables. After insert, the generated primary key is acquired and set in the Resource object.- Specified by:
insert
in interfaceResourceDAO
- Parameters:
resource
- A Resource Data Transfer Objectparameters
- A collection of search parameters to be persisted along with the passed ResourceparameterHashB64
- Base64 encoded SHA-256 hash of parametersparameterDao
- The Parameter DAOifNoneMatch
- 0 for conditional create-on-update behavior; otherwise null- Returns:
- Resource The Resource DTO
- Throws:
FHIRPersistenceDataAccessException
FHIRPersistenceDBConnectException
FHIRPersistenceVersionIdMismatchException
FHIRPersistenceException
-
search
public java.util.List<Resource> search(java.lang.String sqlSelect) throws FHIRPersistenceDataAccessException, FHIRPersistenceDBConnectException
Description copied from interface:ResourceDAO
Executes the passed fully-formed SQL Select statement and returns the results If no matching resources are found, an empty collection is returned.- Specified by:
search
in interfaceResourceDAO
- Parameters:
sqlSelect
- - A fully formed SQL select statement.- Returns:
- List
- A List of Resources that satisfy the passed SQL query string. - Throws:
FHIRPersistenceDataAccessException
FHIRPersistenceDBConnectException
-
searchByIds
public java.util.List<Resource> searchByIds(java.lang.String resourceType, java.util.List<java.lang.Long> resourceIds, boolean includeResourceData) throws FHIRPersistenceDataAccessException, FHIRPersistenceDBConnectException
Description copied from interface:ResourceDAO
Searches for Resources that contain one of the passed ids.- Specified by:
searchByIds
in interfaceResourceDAO
- Parameters:
resourceType
- - The type of the FHIR ResourceresourceIds
- - A List of resource ids.includeResourceData
- - fetch the resource DATA column- Returns:
- List
- A List of resources matching the the passed list of ids. - Throws:
FHIRPersistenceDataAccessException
FHIRPersistenceDBConnectException
-
getSearchByIdsSql
protected java.lang.String getSearchByIdsSql(java.lang.String resourceType)
-
getSearchByIdsNoDataSql
protected java.lang.String getSearchByIdsNoDataSql(java.lang.String resourceType)
-
searchCount
public int searchCount(java.lang.String sqlSelectCount) throws FHIRPersistenceDataAccessException, FHIRPersistenceDBConnectException
Description copied from interface:ResourceDAO
Executes the passed fully-formed SQL Select COUNT statement and returns the integer count.- Specified by:
searchCount
in interfaceResourceDAO
- Returns:
- int - The count of resources that fulfill the passed SQL select statement.
- Throws:
FHIRPersistenceDataAccessException
FHIRPersistenceDBConnectException
-
getCache
protected FHIRPersistenceJDBCCache getCache()
Getter for access to theFHIRPersistenceJDBCCache
from subclasses- Returns:
-
searchCount
public int searchCount(Select countQuery) throws FHIRPersistenceDataAccessException, FHIRPersistenceDBConnectException
Description copied from interface:ResourceDAO
Executes a count query based on the data contained in the passedSelect
statement, using its encapsulated search string and bind variables.- Specified by:
searchCount
in interfaceResourceDAO
- Parameters:
countQuery
- - Contains a search string and (optionally) bind variables.- Returns:
- int A count of FHIR Resources satisfying the passed search.
- Throws:
FHIRPersistenceDataAccessException
FHIRPersistenceDBConnectException
-
search
public java.util.List<Resource> search(Select select) throws FHIRPersistenceDataAccessException, FHIRPersistenceDBConnectException
Description copied from interface:ResourceDAO
Executes the search contained in the passedSelect
, using its encapsulated search string and bind variables.- Specified by:
search
in interfaceResourceDAO
- Parameters:
select
- - Contains a search query and (optionally) bind variables.- Returns:
- List
A list of FHIR Resources satisfying the passed search. - Throws:
FHIRPersistenceDataAccessException
FHIRPersistenceDBConnectException
-
searchForIds
public java.util.List<java.lang.Long> searchForIds(Select dataQuery) throws FHIRPersistenceDataAccessException, FHIRPersistenceDBConnectException
Description copied from interface:ResourceDAO
This method supports the execution of a specialized query designed to return Resource ids, based on the contents of the passed select statement. Note that the first column to be selected MUST be the Resource.id column.- Specified by:
searchForIds
in interfaceResourceDAO
- Returns:
- Throws:
FHIRPersistenceDataAccessException
FHIRPersistenceDBConnectException
-
deleteFromParameterTable
protected void deleteFromParameterTable(java.sql.Connection conn, java.lang.String tableName, long logicalResourceId) throws java.sql.SQLException
Delete all parameters for the given resourceId from the named parameter value table- Parameters:
conn
-tableName
-logicalResourceId
-- Throws:
java.sql.SQLException
-
searchWholeSystem
public java.util.Map<java.lang.Integer,java.util.List<java.lang.Long>> searchWholeSystem(Select wholeSystemQuery) throws FHIRPersistenceDataAccessException, FHIRPersistenceDBConnectException
Description copied from interface:ResourceDAO
Executes the whole-system filter search contained in the passedSelect
, using its encapsulated search string and bind variables.- Specified by:
searchWholeSystem
in interfaceResourceDAO
- Parameters:
wholeSystemQuery
- - Contains a search query and (optionally) bind variables.- Returns:
- Map
> A map of FHIR resource type ID to list of logical resource IDs satisfying the passed search. - Throws:
FHIRPersistenceDataAccessException
FHIRPersistenceDBConnectException
-
setInt
protected void setInt(java.sql.PreparedStatement ps, int index, java.lang.Integer value) throws java.sql.SQLException
Set an int parameter in the statement, handling null as required- Parameters:
ps
-index
-value
-- Throws:
java.sql.SQLException
-
setString
protected void setString(java.sql.PreparedStatement ps, int index, java.lang.String value) throws java.sql.SQLException
Set a String parameter in the statement, handling null as required- Parameters:
ps
-index
-value
-- Throws:
java.sql.SQLException
-
-