Class ResourceReferenceDAO

  • All Implemented Interfaces:
    IResourceReferenceDAO, java.lang.AutoCloseable
    Direct Known Subclasses:
    Db2ResourceReferenceDAO, DerbyResourceReferenceDAO, PostgresResourceReferenceDAO

    public abstract class ResourceReferenceDAO
    extends java.lang.Object
    implements IResourceReferenceDAO, java.lang.AutoCloseable
    DAO to handle maintenance of the local and external reference tables which contain the relationships described by "reference" elements in each resource (e.g. Observation.subject). The DAO uses a cache for looking up the ids for various entities. The DAO can create new entries, but these can only be used locally until the transaction commits, at which point they can be consolidated into the shared cache. This has the benefit that we reduce the number of times we need to lock the global cache, because we only update it once per transaction. For improved performance, we also make use of batch statements which are managed as member variables. This is why it's important to close this DAO before the transaction commits, ensuring that any outstanding DML batched but not yet executed is processed. Calling close does not close the provided Connection. That is up to the caller to manage. Close does close any statements which are opened inside the class.
    • Method Detail

      • getConnection

        protected java.sql.Connection getConnection()
        Getter for the Connection held by this DAO
        Returns:
      • getSchemaName

        protected java.lang.String getSchemaName()
        Getter for subclass access to the schemaName
        Returns:
      • insertResourceTokenRefs

        protected void insertResourceTokenRefs​(java.lang.String resourceType,
                                               java.util.Collection<ResourceTokenValueRec> xrefs)
        Insert the values in the resource-type-specific _resource_token_refs table. This is a simple batch insert because all the FKs have already been resolved and updated in the ResourceTokenValueRec records
        Parameters:
        resourceType -
        xrefs -
      • insertSystemResourceTokenRefs

        protected void insertSystemResourceTokenRefs​(java.lang.String resourceType,
                                                     java.util.Collection<ResourceTokenValueRec> xrefs)
        Insert any whole-system parameters to the token_refs table
        Parameters:
        resourceType -
        xrefs -
      • upsertCodeSystems

        public void upsertCodeSystems​(java.util.List<ResourceTokenValueRec> systems)
        Add all the systems we currently don't have in the database. If all target databases handled MERGE properly this would be easy, but they don't so we go old-school with a negative outer join instead (which is pretty much what MERGE does behind the scenes anyway).
        Parameters:
        systems -
      • doCodeSystemsFetch

        protected void doCodeSystemsFetch​(java.util.Map<java.lang.String,​java.lang.Integer> idMap,
                                          java.lang.String inList,
                                          java.util.List<java.lang.String> sortedSystemNames)
        Fetch the code_system_id values for each of the code_system_name values in the sortedSystemNames list.
        Parameters:
        idMap - the code_system_name -> code_system_id map to populate
        inList - a list of bind markers for the values in the sortedSystemNames list
        sortedSystemNames - the list of code_system_name values to fetch
      • upsertCanonicalValues

        public void upsertCanonicalValues​(java.util.List<ResourceProfileRec> profileValues)
        Add the missing values to the database (and get ids allocated)
        Parameters:
        profileValues -
      • insertResourceProfiles

        protected void insertResourceProfiles​(java.lang.String resourceType,
                                              java.util.Collection<ResourceProfileRec> profiles)
      • insertSystemResourceProfiles

        protected void insertSystemResourceProfiles​(java.lang.String resourceType,
                                                    java.util.Collection<ResourceProfileRec> profiles)
        Insert PROFILE parameters
        Parameters:
        resourceType -
        profiles -
      • insertResourceTags

        protected void insertResourceTags​(java.lang.String resourceType,
                                          java.util.Collection<ResourceTokenValueRec> xrefs)
        Insert the tags referenced by the given collection of token value records
        Parameters:
        resourceType -
        xrefs -
      • insertSystemResourceTags

        protected void insertSystemResourceTags​(java.lang.String resourceType,
                                                java.util.Collection<ResourceTokenValueRec> xrefs)
        Insert _tag parameters to the whole-system LOGICAL_RESOURCE_TAGS table
        Parameters:
        resourceType -
        xrefs -
      • insertResourceSecurity

        protected void insertResourceSecurity​(java.lang.String resourceType,
                                              java.util.Collection<ResourceTokenValueRec> xrefs)
        Insert _security parameters to the resource-specific xx_SECURITY table
        Parameters:
        resourceType -
        xrefs -
      • insertSystemResourceSecurity

        protected void insertSystemResourceSecurity​(java.lang.String resourceType,
                                                    java.util.Collection<ResourceTokenValueRec> xrefs)
        Insert _security parametes to the whole-system LOGICAL_REOURCE_SECURITY table
        Parameters:
        resourceType -
        xrefs -
      • doCodeSystemsUpsert

        public abstract void doCodeSystemsUpsert​(java.lang.String paramList,
                                                 java.util.Collection<java.lang.String> sortedSystemNames)
        Insert any missing values into the code_systems table
        Parameters:
        paramList -
        systemNames - a sorted collection of system names
      • doCanonicalValuesUpsert

        public abstract void doCanonicalValuesUpsert​(java.lang.String paramList,
                                                     java.util.Collection<java.lang.String> sortedURLS)
        Insert any missing values into the common_canonical_values table
        Parameters:
        paramList -
        urls -
      • upsertCommonTokenValues

        public void upsertCommonTokenValues​(java.util.List<ResourceTokenValueRec> values)
        Add reference value records for each unique reference name in the given list
        Parameters:
        values -
      • doCommonTokenValuesUpsert

        protected abstract void doCommonTokenValuesUpsert​(java.lang.String paramList,
                                                          java.util.Collection<CommonTokenValue> sortedTokenValues)
        Execute the insert (upsert) into the common_token_values table for the given collection of values. Note, this insert from negative outer join requires the database concurrency implementation to be correct. This does not work for Postgres, hence Postgres gets its own implementation of this method
        Parameters:
        paramList -
        tokenValues -
      • readCommonTokenValueIdList

        public java.util.List<java.lang.Long> readCommonTokenValueIdList​(java.lang.String tokenValue)
        Description copied from interface: IResourceReferenceDAO
        Fetch the list of matching common_token_value_id records for the given tokenValue.
        Specified by:
        readCommonTokenValueIdList in interface IResourceReferenceDAO
        Returns: