Class DatabaseSearchCacheSvcImpl

All Implemented Interfaces:

public class DatabaseSearchCacheSvcImpl extends Object implements ISearchCacheSvc
  • Field Details

  • Constructor Details

  • Method Details

    • setCutoffSlackForUnitTest

      public void setCutoffSlackForUnitTest(long theCutoffSlack)
    • save

      public Search save(Search theSearch)
      Description copied from interface: ISearchCacheSvc
      Places a new search of some sort in the cache, or updates an existing search. The search passed in is guaranteed to have a UUID so that is a good candidate for consistent identification.
      Specified by:
      save in interface ISearchCacheSvc
      theSearch - The search to store
      Returns a copy of the search as it was saved. Callers should use the returned Search object for any further processing.
    • fetchByUuid

      public Optional<Search> fetchByUuid(String theUuid)
      Description copied from interface: ISearchCacheSvc
      Fetch a search using its UUID. The search should be fully loaded when it is returned (i.e. includes are fetched, so that access to its fields will not cause database errors if the current tranaction scope ends.
      Specified by:
      fetchByUuid in interface ISearchCacheSvc
      theUuid - The search UUID
      The search if it exists
    • tryToMarkSearchAsInProgress

      Description copied from interface: ISearchCacheSvc
      TODO: this is perhaps an inappropriate responsibility for this service

      This method marks a search as in progress, but should only allow exactly one call to do so across the cluster. This is done so that if two client threads request the next page at the exact same time (which is unlikely but not impossible) only one will actually proceed to load the next results and the other will just wait for them to arrive.

      Specified by:
      tryToMarkSearchAsInProgress in interface ISearchCacheSvc
      theSearch - The search to mark
      This method should return an empty optional if the search was not marked (meaning that another thread succeeded in marking it). If the search doesn't exist or some other error occurred, an exception will be thrown instead of Optional.empty()
    • findCandidatesForReuse

      public Optional<Search> findCandidatesForReuse(String theResourceType, String theQueryString, Instant theCreatedAfter, ca.uhn.fhir.interceptor.model.RequestPartitionId theRequestPartitionId)
      Description copied from interface: ISearchCacheSvc
      Look for any existing searches matching the given resource type and query string.

      This method is allowed to perform a "best effort" return, so it can return searches that don't match the query string exactly, or which have a created timestamp before theCreatedAfter date. The caller is responsible for removing any inappropriate Searches and picking the most relevant one.

      Specified by:
      findCandidatesForReuse in interface ISearchCacheSvc
      theResourceType - The resource type of the search. Results MUST match this type
      theQueryString - The query string. Results SHOULD match this type
      theCreatedAfter - Results SHOULD not include any searches created before this cutoff timestamp
      theRequestPartitionId - Search should examine only the requested partitions. Cache MUST not return results matching the given partition IDs
      A collection of candidate searches
    • pollForStaleSearchesAndDeleteThem

      Description copied from interface: ISearchCacheSvc
      This method will be called periodically to delete stale searches. Implementations are not required to do anything if they have some other mechanism for expiring stale results other than manually looking for them and deleting them.
      Specified by:
      pollForStaleSearchesAndDeleteThem in interface ISearchCacheSvc
    • setMaximumSearchesToCheckForDeletionCandidacyForUnitTest

      public static void setMaximumSearchesToCheckForDeletionCandidacyForUnitTest(int theMaximumSearchesToCheckForDeletionCandidacy)
    • setMaximumResultsToDeleteInOnePassForUnitTest

      public static void setMaximumResultsToDeleteInOnePassForUnitTest(int theMaximumResultsToDeleteInOnePass)
    • setMaximumResultsToDeleteForUnitTest

      public static void setMaximumResultsToDeleteForUnitTest(int theMaximumResultsToDelete)
    • setNowForUnitTests

      public static void setNowForUnitTests(Long theNowForUnitTests)
      This is for unit tests only, do not call otherwise