1.1.1Changelog: 2023

 

1.1.2Changelog

 

1.1.3HAPI FHIR 7.8.0 (TBD)

 

1.1.3.1Release Information

Released: 2025-02-17

Codename: (TBD)

1.1.3.2Upgrade Instructions

Upgrade Notes

The JPA server stores values for the field Resource.meta.source in dedicated columns in its database so that they can be indexes and searched for as needed, using the _source Search Parameter.

Prior to HAPI FHIR 6.8.0 (and Smile CDR 2023.08.R01), these values were stored in a dedicated table called HFJ_RES_VER_PROV. Beginning in HAPI FHIR 6.8.0 (Smile CDR 2023.08.R01), two new columns were added to the HFJ_RES_VER table which store the same data and make it available for searches.

As of HAPI FHIR 8.0.0, the legacy table is no longer searched by default. If you do not have Resource.meta.source data stored in HAPI FHIR that was last created/updated prior to version 6.8.0, this change will not affect you and no action needs to be taken.

If you do have such data, you should follow the following steps:

  • Enable the JpaStorageSettings setting setAccessMetaSourceInformationFromProvenanceTable(true) to configure the server to continue using the legacy table.

  • Perform a server resource reindex by invoking the $reindex Operation (server) with the optimizeStorage parameter set to ALL_VERSIONS.

  • When this reindex operation has successfully completed, the setting above can be disabled. Disabling this setting avoids an extra database round-trip when loading data, so this change will have a positive performance impact on your server.

Fulltext Search with _lastUpdated Filter

Fulltext searches have been updated to support _lastUpdated search parameter. If you are using Advanced Hibernate Search indexing and wish to use the _lastUpdated search parameetr with this feature, a full reindex of your repository is required.

1.1.3.3Changes

The version of a few dependencies have been bumped to more recent versions (dependent HAPI modules listed in brackets):

  • org.hl7.fhir.core (Base): 6.3.25 -> 6.4.0

#6107

A new extension has been created for use on SearchParameter resources in the JPA server. This extension causes a SearchParameter to be indexed, but to not be available for use in searches. This can be set when a new SP is created in order to prevent it from being used before an index has been completed. See Introducing Search Parameters on Existing Data for more information.

#6398

The NPM package search module has been enhanced to support searching by the package author and the package version attributes.

#6464

A new experimental interceptor called the MdmReadVirtualizationInterceptor has been added. This interceptor rewrites results when querying an MDM-enabled JPA server in order to always include linked resources and rerwrites query results to link to the MDM golden resource. This interceptor is still being developed and should be used with caution.

#6511

Interceptors can be defined against the registry on the RestfulServer, or on the registry in the JPA repository. Because these are separate registries, the order() attribute on the Hook annotation isn't correctly processed today across the two registries. The CompositeInterceptorRegistry has been reworked so ordering will be respected across both registries.

#6224

The JPA server will no longer use a separate thread and database connection to resolve tag definitions. This should improve performance in some cases, and resolves compatibility issues for some environments. Thanks to Ibrahim (Trifork A/S) for the pull request!

#6395

A new configuration option has been added to SubsciptionSubmitterConfig which causes Subscription resources to be submitted to the processing queue synchronously instead of asynchronously as all other resources are. This is useful for cases where subscriptions need to be activated quickly. Thanks to Michal Sevcik for the contribution!

#6409

The JPA server will no longer use the HFJ_RES_VER_PROV table to store and index values from the Resource.meta.source element. Beginning in HAPI FHIR 6.8.0 (and Smile CDR 2023.08.R01), a new pair of columns have been used to store data for this element, so this change only affects data which was stored in HAPI FHIR prior to version 6.8.0 (released August 2023). If you have FHIR resources which were stored in a JPA server prior to this version, and you use the Resource.meta.source element and/or the _source search parameter, you should perform a complete reindex of your server to ensure that data is not lost. See the upgrade notes for more information.

#6409

When searching in versioned tag mode, the JPA server now avoids a redundant lookup of the un-versioned tags, avoiding an extra unnecessary database query in some cases.

#6460

The JPA server FHIR transaction processor will now pre-fetch the target resource state for references to resources that don't also appear in the transaction bundle. This means that if you process a large FHIR transaction containing many references to other resources in the repository that are not also being updated in the same transaction, you should see a very significant improvement in performance.

#6460

The JPA server FHIR transaction processor will now more aggressively cache resource IDs for previously seen resources, reducing the number of database reads required when processing transactions. This should provide a noticeable improvement in performance when processing transactions which update pre-existing resources.

#6478

Transactions with multiple saved search urls will have the saved search urls deleted in a batch, instead of 1 at a time. This is a minor performance update.

#6508

The ValidationSupportChain module has been rewritten to improve validator performance. This change: * Adds new caching capabilities to ValidationSupportChain. This is an improvement over the previous separate caching module because the chain can now remember which entries in the cache responded affirmative to isValueSetSupported() and will therefore be more efficient about trying entries in the chain. It also makes debugging much less confusing as there is less recursion and the caches don't use loadingCache. * Importantly, the caching in ValidationSupportChain caches negative lookups (i.e. items that could not be found by URL) as well as positive lookups. This is a change from the historical caching behaviour. * Changes ValidationSupportChain to never expire StructureDefinition entries in the cache, which is needed because the validator makes assumptions about structuredefinitions never changing. Fixes #6424. * Modifies VersionSpecificWorkerContextWrapper so that it doesn't use a separate cache and instead relies on the caching provided by ValidationSupportChain. This class previously used a cache because it converts arbitrary versions of FHIR StructureDefinitions into the canonical version required by the validator (R5), but these converted versions are now stored in the userdata map of objects returned by and cached by ValidationSupportChain. This makes the caching more predictable since there is only one cache to track. * Adds OpenTelemetry support to ValidationSupportChain, with metrics for tracking the cache size. * Deprecates CachingValidationSupport since caching is now provided by ValidationSupportChain. CachingValidationSupport is now just a passthrough and should be removed from applications. It will be removed from the library in a future release. * Removes ConceptMap caching from TermReachSvcImpl, as this caching is both redundant and inefficient as it operates within a database transaction. These changes result in very significant performance improvements when performing validation in the JPA server. Throughput improvements of 1000% have been recorded in benchmarking use cases involving large profiles and remote terminology services enabled. Many other validation use cases should see significant improvements as well.

#6522

Several memory caches in various parts of the JPA server have been removed in an effort to consolidate caching in this system to two places: The MemoryCacheService, and ValidationSupportChain. This should make management of the system easier.

#6460

If deletes are disabled in the JPA server, it is no longer possible to un-delete a resource (i.e. update a previously deleted resource to make it non-deleted).

#6460

When performing a FHIR Transaction which deletes and then updates (or otherwise un-deletes) the same resource within a single transaction, the delete was previously not stored as a distinct version (meaning that the resource version was only incremented once, and no delete was actually stored in the resource history. This has been changed so that deletes will always appear as a distinct entry in the resource history.

#6460

The HFJ_RES_LINK table with no longer store the PARTITION_DATE value for the indexed link target resource, as this was an unused feature which has been removed as a part of a larger performance optimization.

#6258

The AuthorizationInterceptor handling for operations has been improved so that operation rules now directly test the contents of response Bundle or Parameters objects returned by the operation when configure to require explicit response authorization. This fixes a regression in 7.4.0 where operation responses could sometimes be denied even if appropriate permissions were granted to view resources in a response bundle. Thanks to Gijsbert van den Brink for reporting the issue with a sample test!

#6404

Searches using fulltext search that combined _lastUpdated query parameter with any other (supported) fulltext query parameter would find no matches, even if matches existed. This has been corrected.

#6407

Corrected IHE BALP AuditEvent generation, so that it records one Audit Event per resource owner. Thanks to Jens Villadsen (@jkiddo) for the contribution!

#6409

When performing a _history query using the _at parameter, the time value is now converted to a zoned-date before being passed to the database. This should avoid conflicts around date changes on some databases.

#6475

Previously, submitting a transaction bundle containing a conditional delete, a conditional create, and a resource which relied on this conditional create as a reference would lead to excessive Hibernate warnings in the logs. This has been fixed.

#6502

Support ReferenceParam in addition to UriParam for _profile in queries using the SearchParameterMap to match the change in the specification from DSTU3 to R4.

#6512

The methods on FhirVersionEnum which produces a FhirContext (newContext() ,and newContextCached()) have been deprecated, and will be removed.

1.1.4HAPI FHIR 7.6.1 (Prerelease)

 

1.1.4.1Release Information

Note: This version of HAPI FHIR is a SNAPSHOT (prerelease), meaning that it has not yet been released, but all changes and fixes listed here are available to try out as Snapshot Builds.

1.1.4.2Changes

#6502

Support ReferenceParam in addition to UriParam for _profile in queries using the SearchParameterMap to match the change in the specification from DSTU3 to R4.

1.1.5HAPI FHIR 7.6.0 (TBD)

 

1.1.5.1Release Information

Released: 2024-11-15

Codename: (TBD)

1.1.5.2Upgrade Instructions

Measures and Care Gaps

TimeZone Header

DQM $care-gaps and $evaluate-measure will convert parameters periodStart and periodEnd according to a timezone supplied by the client, not the server timezone as it was previously. Clients can leverage this functionality by passing in a new Timezone header (ex: America/Denver). If nothing is supplied, it will default to UTC.

CareGaps Operation Parameters

Parameters removed

Certain $care-gaps operation parameters have been dropped, because they are not used or likely to be implemented

  • topic
  • practitioner is now callable via subject parameter
  • organization
  • program

Parameters added:

  • measureIdentifier now is available to resolve measure resources for evaluation
  • nonDocument is a new optional parameter that defaults to false which returns standard document bundle for $care-gaps. If true, this will return summarized subject bundle with only detectedIssue.

SDC $populate operation

The subject parameter of the Questionnaire/$populate operation has been changed to expect a Reference as specified in the SDC IG.

1.1.5.3Changes

The version of a few dependencies have been bumped to more recent versions (dependent HAPI modules listed in brackets):

  • org.hl7.fhir.core (Base): 6.3.18 -> 6.4.0
  • Bower/Moment.js (hapi-fhir-testpage-overlay): 2.27.0 -> 2.29.4
  • htmlunit (Base): 3.9.0 -> 3.11.0
  • Elasticsearch (Base): 8.11.1 -> 8.14.3

#6182

A new Pointcut called MDM_SUBMIT_PRE_MESSAGE_DELIVERY has been added. If you wish to customize the ResourceModifiedJsonMessage sent to the broker, you can do so by implementing this Pointcut, and returning ResourceModifiedJsonMessage.

#6184

Added a configuration setting for the TTL of HTTP connections to IRestfulClientFactory. The following implementations have been updated to respect this new setting: 1. ApacheRestfulClientFactory 2. OkHttpRestfulClientFactory 3. HapiFhirCliRestfulClientFactory Thanks to Alex Kopp and Alex Cote for the contribution!

#6210

Batch instance ID and chunk ID have been added to the logging context so that they can be automatically added to batch-related messages in the log.

#6263

The method FhirTerser.cloneInto() has been enhanced to copy the resource field of a Reference, in addition to the fields that are accessible via the structure definition.

#6313

The STORAGE_PARTITION_DELETED pointcut has been added and will be called upon deleting a partition using the $partition-management-delete-partition operation.

#6325

A new configuration option, PartitionSettings#setPartitionIdsInPrimaryKeys(boolean) configures the query engine to include the partitioning column in search query joins.

#6357

Upgrade the Clinical Reasoning module to the latest release of 3.13.0. This update comes with several changes and feature enhancements to CPG and dQM clinical-reasoning operations. Please review associated ticket and upgrade.md for detailed list of changes.

#6359

Remote Terminology validation has been enhanced to support output parameter issues for the $validate-code operation.

#6366

Add plumbing for combining IConsentServices with different vote tally strategies

#6370

When using the FHIR TerserUtil to merge two resource, if one resource has real data in a particular field, and the other resource has a data-absent-reason extension in the same field, the real data will be given precedence in the merged resource, and the extension will be ignored.

#6375

A new experimental JPA setting has been added to JpaStorageSettings which causes searches for token SearchParameters to include a predicate on the HASH_IDENTITY column even if it is not needed because other hashes are in use.

#6445

Add Multimap versions of the search() methods to Repository to support queries like Patient?_tag=a&_tag=b

#6253

A cache has been added to the validation services layer which results in improved validation performance. Thanks to Max Bureck for the contribution!

#6323

A synchronization choke point was removed from the model object initialization code, reducing the risk of multi-thread contention.

#6345

Date searches using equality would perform badly as the query planner does not know that our LOW_VALUE columns are always < HIGH_VALUE columns, and HIGH_VALUE is always > LOW_VALUE columns. These queries have been fixed to account for this.

#6489

Change the migrator to avoid table locks when adding an index. This allows systems to continue running during upgrade.

#6261

Upgrading to Jakarta had caused a problem with the version of java-simple-mail that was in use. This has been updated to be conformant with the Jakarta Mail APIs. Thanks to Thomas Papke(@thopap) for the contribution!

#6341

The CachingValidationSupport cache for concept translations will now keep up to 500000 translations instead of the previous 5000. This will be made configurable in a future release.

Contained resources which arrive without assigned IDs are now assigned GUIDs, as opposed to monotonically increasing numeric IDs. This avoids a whole class of issues related to processing order and collisions.

#6206

A resource leak during database migration on Oracle could cause a failure ORA-01000 maximum open cursors for session. This has been corrected. Thanks to Jonas Beyer for the contribution!

#6216

Previously, searches combining the _text query parameter (using Lucene/Elasticsearch) with query parameters using the database (e.g. identifier or date) could miss matches when more than 500 results match the _text query parameter. This has been fixed, but may be slow if many results match the _text query and must be checked against the database parameters.

#6218

Previously, when disabling the 'Enforce Referential Integrity on Write' setting, referential integrity was still partially enforced when posting a resource with an invalid reference. This has now been fixed.

#6231

The PatientIdPartitionInterceptor could on rare occasion select the incorrect partition for a resource. This has been corrected. In order for the wrong partition to be selected, the following three things need to be true: 1) there are multiple values of a patient compartment for a resource (see https://hl7.org/fhir/R4/compartmentdefinition-patient.html) 2) a patient compartment value is a non-Patient reference 3) the search parameter of the incorrect value needs to come alphabetically before the search parameter of the correct value. For example, if a QuestionnaireResponse has subject Patient/123 and author Organization/456, then since 'author' appears ahead of 'subject' alphabetically it would incorrectly determine the partition. The fix changed the partition selection so that it now only matches on Patient references.

#6262

Previously, when a extension was passed in as a part of the CDS hooks request, it would result in a 400 service not found. This behaviour has now been fixed.

#6285

Updated the Reindex Batch2 job to allow for an additional step that will check to ensure that no pending 'reindex' work is needed. This was done to prevent a bug in which value set expansion would not return all the existing CodeSystem Concepts after a reindex call, due to some of the concepts being deferred to future job runs. As such, $reindex operations on CodeSystems will no longer result in incorrect value set expansion when such an expansion is called 'too soon' after a $reindex operation.

#6290

Previously, a specific migration task was using the TRIM() function, which does not exist in MSSQL 2012. This was causing migrations targeting MSSQL 2012 to fail. This has been corrected and replaced with usage of a combination of LTRIM() and RTRIM(). Thanks to Primož Delopst at Better for the contribution!

#6305

Previously, when having StorageSettings#getIndexMissingFields() == IndexEnabledEnum.DISABLED (default value) and attempting to search with the missing qualifier against a resource type with multiple search parameters of type reference, the returned results would be incorrect. This has been fixed.

#6317

Previously, defining a unique combo Search Parameter with the DateTime component and submitting multiple resources with the same dateTime element (e.g. Observation.effectiveDateTime) resulted in duplicate resource creation. This has been fixed.

#6339

Fixed a bug in migrations when using Postgres when using the non-default schema. If a migration attempted to drop a primary key, the generated SQL would only ever target the public schema. This has been corrected, and the current schema is now used, with public as a fallback. Thanks to Adrienne Sox for the contribution!

#6359

After upgrading org.hl7.fhir.core from 6.1.2.2 to 6.3.11, the $validate-code operation stopped returning an error for invalid codes using remote terminology. This has been fixed.

#6365

A crash while executing a search with named _include parameters on MSSQL has been fixed. Thanks to Craig McClendon for the pull request!

#6372

Searches that combined full-text searching (i.e. _text or _content) with other search parameters could fail to return all results if we encountered 1600 matches against the full-text index where none of them match the rest of the query. This has now been fixed.

Fixed a rare bug in the JSON Parser, wherein client-assigned contained resource IDs could collide with server-assigned contained IDs. For example if a resource had a client-assigned contained ID of #2, and a contained resource with no ID, then depending on the processing order, the parser could occasionally provide duplicate contained resource IDs, leading to non-deterministic behaviour.

#6419

Previously, on Postgres, the $reindex operation with optimizeStorage set to ALL_VERSIONS would process only a subset of versions if there were more than 100 versions to be processed for a resource. This has been fixed so that all versions of the resource are now processed.

#6420

Previously, when the $reindex operation is run for a single FHIR resource with optimizeStorage set to ALL_VERSIONS, none of the versions of the resource were processed in hfj_res_ver table. This has been fixed.

#6422

Previously, since 7.4.4 the validation issue detail codes were not translated correctly for Remote Terminology validateCode calls. The detail code used was invalid-code for all use-cases which resulted in profile binding strength not being applied to the issue severity as expected when validating resources against a profile. This has been fixed and issue detail codes are translated correctly.

#6440

Previously, if an IInterceptorBroadcaster was set in a RequestDetails object, STORAGE_PRECHECK_FOR_CACHED_SEARCH hooks that were registered to that IInterceptorBroadcaster were not called. Also, if an IInterceptorBroadcaster was set in the RequestDetails object, the boolean return value of the hooks registered to that IInterceptorBroadcaster were not taken into account. This second issue existed for all pointcuts that returned a boolean type, not just for STORAGE_PRECHECK_FOR_CACHED_SEARCH. These issues have now been fixed.

#6451

Previously, activating BulkDataImport job would not change jobs status to RUNNING, causing it to be processed multiple times instead of single time. This has been fixed.

#6467

Fixed an incompatibility between Hibernate Search and Lucene versions that caused ValueSet expansion to fail when Hibernate Search was configured to use Lucene.

#6283

Hibernate Search Fulltext fields which were unused have been removed from indexing. This will reduce storage usage in Lucene and Elasticsearch. The fields that were removed are: myNarrativeTextEdgeNGram, myNarrativeTextNGram, myNarrativeTextPhonetic, myContentTextEdgeNGram, myContentTextNGram, myContentTextPhonetic.

1.1.6HAPI FHIR 7.4.5 (Copernicus)

 

1.1.6.1Release Information

Released: 2024-10-21

Codename: (Copernicus)

1.1.6.2Upgrade Instructions

1.1.6.3Changes

#6372

Searches that combined full-text searching (i.e. _text or _content) with other search parameters could fail to return all results if we encountered 1600 matches against the full-text index where none of them match the rest of the query. This has now been fixed.

1.1.7HAPI FHIR 7.4.4 (Copernicus)

 

1.1.7.1Release Information

Released: 2024-10-17

Codename: (Copernicus)

1.1.7.2Upgrade Instructions

1.1.7.3Changes

#6359

Remote Terminology validation has been enhanced to support output parameter issues for the $validate-code operation.

#6359

After upgrading org.hl7.fhir.core from 6.1.2.2 to 6.3.11, the $validate-code operation stopped returning an error for invalid codes using remote terminology. This has been fixed.

#6363

This release updates the org.hl7.fhir core dependency up to 6.3.23, in order to patch CVE-2024-45294.

1.1.8HAPI FHIR 7.4.3 (Copernicus)

 

1.1.8.1Release Information

Released: 2024-09-30

Codename: (Copernicus)

1.1.8.2Upgrade Instructions

1.1.8.3Changes

#6317

Previously, defining a unique combo Search Parameter with the DateTime component and submitting multiple resources with the same dateTime element (e.g. Observation.effectiveDateTime) resulted in duplicate resource creation. This has been fixed.

1.1.9HAPI FHIR 7.4.2 (Copernicus)

 

1.1.9.1Release Information

Released: 2024-09-20

Codename: (Copernicus)

1.1.9.2Upgrade Instructions

1.1.9.3Changes

#6216

Previously, searches combining the _text query parameter (using Lucene/Elasticsearch) with query parameters using the database (e.g. identifier or date) could miss matches when more than 500 results match the _text query parameter. This has been fixed, but may be slow if many results match the _text query and must be checked against the database parameters.

1.1.10HAPI FHIR 7.4.0 (Copernicus)

 

1.1.10.1Release Information

Released: 2024-08-15

Codename: (Copernicus)

1.1.10.2Upgrade Instructions

Derby JARs removed from HAPI-FHIR

As of Derby 17, in order to support JDK17, the jars must be built from source, as the default package supports JDK21. Due to a high severity vulnerability in older versions, and a lack of appetite to host a forked packaged version of Derby, the Derby JARs have been removed from the HAPI-FHIR distribution. For those who wish to continue to use Derby, you may still do so, but the following jars must be manually added to your classpath:

Possible migration errors on SQL Server (MSSQL)

  • This affects only clients running SQL Server (MSSQL) who have custom indexes on HFJ_SPIDX tables, which include sp_name or res_type columns.
  • For those clients, migration of sp_name and res_type columns to nullable on HFJ_SPIDX tables may be completed with errors, as changing a column to nullable when a column is a part of an index can lead to errors on SQL Server (MSSQL).
  • If client wants to use existing indexes and settings, these errors can be ignored. However, if client wants to enable both Index Storage Optimized and Index Missing Fields settings, manual steps are required to change sp_name and res_type nullability.

To update columns to nullable in such a scenario, execute steps below:

  1. Indexes that include sp_name or res_type columns should be dropped:
DROP INDEX IDX_SP_TOKEN_REST_TYPE_SP_NAME ON HFJ_SPIDX_TOKEN;
  1. The nullability of sp_name and res_type columns should be updated:
ALTER TABLE HFJ_SPIDX_TOKEN ALTER COLUMN RES_TYPE varchar(100) NULL;
ALTER TABLE HFJ_SPIDX_TOKEN ALTER COLUMN SP_NAME varchar(100) NULL;
  1. Additionally, the following index may need to be added to improve the search performance:
CREATE INDEX IDX_SP_TOKEN_MISSING_OPTIMIZED ON HFJ_SPIDX_TOKEN (HASH_IDENTITY, SP_MISSING, RES_ID, PARTITION_ID);

1.1.10.3Changes

#5871

When encoding resources in summary mode, it is now possible to override the built-in list of summary elements, by adding additional elements and/or by removing elements from the default list. This can be done for an individual parser instance, or globally using the ParserOptions object available from the FhirContext.

#5914

Update Clinical Reasoning version to v3.6.0

#5919

Added the entire WorkChunk to the StepExecutionDetails of a Batch Job.

#5935

Remote Terminology Service can now return subproperty fields for a CodeSystem lookup operation. This can be done in DSTU3 and R4. R5 is not yet implemented.

#5938

Generated IPS documents will now include a bundle profile declaration.

#5945

A new utility method has been added to BundleUtil which converts a FHIR Bundle containing resources (e.g. a search result bundle) into a FHIR transaction bundle which could be used to upload those resources to a server.

#5952

Previously, since hapi-fhir 7.0, when retrieving the consecutive pages of a Bundle resource search operation using a client with read permissions for Bundle resources, the request would fail with a 403 Forbidden error. This has been fixed.

#5968

Added support for filtering on CodeSystem defined properties when using database (hibernate) filtering. The following ValueSet filters can be used to filter on CodeSystem defined properties: EQUAL, EXISTS, IN, NOTIN

#5980

When processing a batch job, OpenTelemetry spans named hapifhir.batch_job.execute are now generated by the worker threads. These spans have the following span attributes related to the batch job: hapifhir.batch_job.definition_id, hapifhir.batch_job.definition_version, hapifhir.batch_job.instance_id, hapifhir.batch_job.step_id, hapifhir.batch_job.chunk_id.

#6003

When performing a search for a resource which uses versioned canonical references to another resource (e.g. a QuestionnaireResponse with a questionnaire reference of http://example.org/my-questionnaire|1.0), the server failed to process _include directives which should bring in these references. Includes will now fetch all versions of a canonical reference, which is still not perfect but is an improvement over the current behaviour. A future update may add more targeted behaviour to address including versioned reference targets, but this will require a significant re-architecture of the loading module.

#6008

Previously, when partitioning is enabled, the reindex job could only be run against one partition. The reindex job parameters can now accept a list of partitions or all partitions (list of RequestPartitionId or RequestPartitionId.allPartitions). In the future, the functionality can be extended to other bulk operations run via batch2 jobs (e.g. $delete-expunge, $export).

#6010

When populated, the search score field will now be included in the entries of a response Bundle.

#6014

When uploading an invalid CodeSystem to the JPA server containing duplicate codes, the server responded with an unhelpful error message referring to a database constraint error. This has been fixed so that a more informative error message is returned.

#6031

Subscriptions now support the evaluation use of FhirPath criteria and the use of the variables %current and %previous. Thanks to Jens Villadsen (@jkiddo) for the contribution!

#6038

Allow overriding RestfulServer's contextPath determination by overriding IServerAddressStrategy. Thanks to Alex Kopp (@alexrkopp) for the contribution!

#6046

Added support for :contains parameter qualifier on the _text and _content Search Parameters. When using Hibernate Search, this will cause the search to perform an substring match on the provided value. Documentation can be found here.

#6060

The server-generated CapabilityStatement will now use the server name defined by RestfulServer#setServerName(..) instead of the hardcoded string HAPI FHIR. Thanks to Renaud Subiger for the pull request!

#6070

Added paging support for $everything operation in synchronous search mode.

#6073

Previously, if a unique or non-unique combo SeaerchParameter was defined, it would not be used by searches if any parameter contained multiple OR clauses (e.g. Patient?family=simpson&given=homer,marge). Such searches will now use the combo index table, which should result in much more performant searches in some cases.

#6079

It is now possible to save TermConceptDesignations with values over 2,000 characters.

#6148

Added the target resource partitionId and partitionDate to the resourceLink table.

#5658

The MDM candidate search will now be skipped if data for required search parameters is not present. Thanks to Adrienne Sox for the pull request!

#5885

Indexing for unique combo Search Parameters has been modified so that a hash value is now stored. This hash value is not yet used in searching or enforcing uniqueness, but will be in the future in order to reduce the space required to store the indexes and the current size limitation on unique indexes.

#5885

When unique and non-unique combo parameters are in use on a server, FHIR Transaction and Reindex Job performance has been optimized by pre-fetching all existing combo index rows for a large batch of resources in a single database operation. This should yield a meaningful performance improvement on such systems.

#5885

Indexing for non-unique combo Search Parameters has been improved, using a new hash-based index that should perform significantly better in many circumstances.

#5937

A new configuration option, StorageSettings#setIndexStorageOptimized(boolean) has been added. If enabled, the server will not write data to the SP_NAME, RES_TYPE, SP_UPDATED columns for all HFJ_SPIDX_xxx tables. This can help reduce the overall storage size on servers where HFJ_SPIDX tables are expected to have a large amount of data.

#5999

The in-memory search matcher module (used for Subscriptions and other places where a resource needs to be evaluated against an existing pool of search parameter expressions) has been optimized so that it doesn't evaluate unnecessary search parameters while analyzing the resource. Thanks to Ahmet Melih Aydoğdu for the pull request!

#6099

Database migrations that add or drop an index no longer lock tables when running on Azure Sql Server.

#5887

Extract Subscription Settings from Storage Settings so they can be managed independently.

#5939

This brings the org.hl7.fhir.core dependency to version 6.3.11.

#6023

Previously, CDS hook extensions needed to be encoded as strings. This has been changed so that extensions are now properly provided as inline JSON.

#6140

An prototype interface to abstract data access across different types of FHIR repositories (e.g. remote REST, local JPA) has been added to the hapi-fhir-base project. Implementations of this interface will follow in future HAPI releases, and it will continue to evolve as it's validated through implementation.

#6179

The $reindex operation could potentially initiate a reindex job without any urls provided in the parameters. We now internally generate a list of urls out of all the supported resource types and attempt to reindex found resources of each type separately. As a result, each reindex (batch2) job chunk will be always associated with a url.

#3986

Removed the validation error of the max query parameter on the $lastn operation. Now, the $lastn operation can be invoked with the max query parameter. Contribution by Gijs Groenewegen (@thetrueoneshots).

#4556

The CSS file used by the OpenApiInterceptor to serve up the Swagger UI component inadvertently blocked the authorization button evem when it was wanted. This has been fixed. Thanks Jesse Bonzo for the contribution!

#4837

In the case where a resource was serialized, deserialized, copied and reserialized it resulted in duplication of contained resources. This has been corrected.

#5559

The IPS narrative generator previously created narratives for each Composition.section.text entry, but also combined these section narratives into a single concatenated narrative for Composition.text. This caused validation issues as the narratives then contained duplicate IDs, and also wasted space. This has been removed.

#5867

Previously, when adding multiple resources and defining a golden resource using MDM, the golden resource's tags were removed. This has been fixed

#5877

Previously, updating a tokenParam with a value greater than 200 characters would raise a SQLException. This issue has been fixed.

#5900

Remove unnecessary call to deleteAllSearchParams when $expunge is called on an already-deleted resource.

#5913

Bulk export was failing with a HAPI-2222 error with the persistence module configured for R5. This has been fixed.

#5925

An UnsupportedOperationException occurred when validating R5 MHD bundles using the HAPI FHIR validator. Thanks to Renaud Subiger for contributing a fix!

#5926

A regression in HAPI FHIR 6.4.0 meant that ther JPA server schema migrator ran all tasks even when the database was initially empty and the schema was being initialized by script. This did not produce any incorrect results, but did impact the amount of time taken to initialize an empty database. This has been corrected.

#5926

A number of columns in the JPA schema use primitive types (and therefore can never have a null value) but aren't marked as non-null.

#5942

Delete expunge targeted to resources (not everything) that were created with IfNoneExists URL followed by recreation of said resources was failing with HAPI-0550 due to the fact that the corresponding search url records were not being deleted. This has been fixed.

#5956

Fixed a regression that prevented rebuilding golden resources with mdm survivorship rules when resources have non-numeric fhir ids in a partitioned system.

#6077

Previously, when a MDM rule tried to perform a phonetic match by HumanName (eg. Patient.name), a ClassCastException was thrown. This has now been fixed.

#5959

An overly verbose log in the JPA server about deleting stale searches has been reduced to DEBUG level.

#5960

Previously, queries with chained would fail to sort correctly with lucene and full text searches enabled. This has been fixed.

#5962

The default use of the Accept-Charset header has been removed as its use is deprecated. Thanks to Jens Villadsen for the suggestion and pull request!

#5971

The JSON Parser failed to parse alternate names (e.g. _family) containing extensions if the corresponding regular named element (e.g. family) was not present. Thanks to Stefan Lindström for the pull request!

#5973

Previously, subscription criteria on R4 backport subscriptions were not validated by the SubscriptionValidatingInterceptor. This has been corrected.

#5981

Batch2WorkChunkEntity poll_attempt count is a nullable field, but was incorrectly declared as a primitive. This has been fixed.

#5985

Fixed an issue where MDM json links were unserializable due to using the IResourcePersistenceId objects. This has been fixed, and IResourcePersistenceId objects will not be serialized or returned to users.

#5988

Previously, when creating a custom SearchParameter for a document Bundle that references an entry resource through the composition (e.g. Bundle.entry[0].resource.as(Composition).subject.resolve().as(Patient).identifier), the search using that parameter would not return the matching document Bundle resources, despite the fullUrl of the entry matching the composite reference. This problem does not exist if the reference match can be done against the entry id. However an id is not required so the match should be done against the fullUrl. This issue has been fixed.

#5933

Bulk export was failing with a HAPI-1775 error with the persistence module configured for DSTU3. This has been fixed.

#5993

Corrected a regression in valueset expansion. If a valueset with a non-standard property in the filter used the is-a operation, the caller would receive HAPI-2526. This has been corrected.

#5994

Fixed a bug in the MdmSurvivorshipSvcImpl that caused resourceType/id (as opposed to just id) to be passed on to the IIdHelperService.

#5006

Expanding a ValueSet on a property using a filter operator that is not supported (ISA, NOTISA, etc) would throw an exception and fail expansion. This has been fixed.

#6000

In an MDM enabled system with multi-delete enabled, deleting both the final source resource and it's linked golden resource at the same time results in an error being thrown. This has been fixed.

#6007

Previously, HAPI-FHIR schedulers were automatically suffixing the Quartz scheduler's org.quartz.scheduler.instanceName value to a unique autogenerated value based on the provided instance name. This has been corrected, and now the instance name provided to the BaseHapiFhirScheduler is used directly, with no unique suffix added. This is in line with the Quartz Documentation related to defining the scheduler instance name for those who run schedulers in a cluster.

#6021

The updated Spring Boot was not compatible with jetty version 12.0.3. Jetty has been updated to 12.0.9, fixing this issue.

#6024

Fixed a bug in search where requesting a count with HSearch indexing and FilterParameter enabled and using the _filter parameter would result in inaccurate results being returned. This happened because the count query would use an incorrect set of parameters to find the count, and the regular search when then try and ensure its results matched the count query (which it couldn't because it had different parameters).

#6033

Previously, attempting to store resources with common identifies but different partitions would. This has been fixed by adding a new configuration key defaulting to false to allow storing resources with duplicate identifiers across partitions. This new feature can be activated by calling PartitionSettings.setConditionalCreateDuplicateIdentifiersEnabled()

#6034

Two indexes introduced in HAPI-FHIR 6.6.0, IDX_SP_URI_HASH_IDENTITY_V2 and IDX_SP_URI_HASH_URI_V2 were previously created as unique indexes. This has caused issues on SQL Server due to the way that a filtered index is created. The unique clause was not necessary to this index, and has been removed.

#6036

The maximum length of SP_VALUE_EXACT and SP_VALUE_NORMALIZED in the HFJ_SPIDX_STRING table has been increased from 200 to 768. This allows for longer :contains searches. If you have previously stored values longer than 200 characters in String search parameters and want to perform a :contains search on the new longer maximum size, a reindex of the affected data is required.

#6040

The meta.profile element on resources was not being respected as canonical (ie, allowing for a version to be appended, http://example.com/StructureDefinition/abc|1.0.0), and was thus being ignored during validation. This has been fixed.

#6044

Fixed an issue where doing a cache refresh with advanced Hibernate Search enabled would result in an infinite loop of cache refresh -> search for StructureDefinition -> cache refresh, etc

#6046

Previously, using _text and _content searches in Hibernate Search in R5 was not supported. This issue has been fixed.

#6049

Rolled back org.apache.derby dependency to one that supports JREs 11 - 17.

#6049

Fixed a bug in SchemaMigrator that would considered skippable migration tasks as 'failed' migrations.

#6058

Added PATCH operation to BundleEntryTransactionMethodEnumTest in order to fully support transaction bundle operations.

#6061

The latest migration for HFJ_RES_SEARCH_URL introduced in 6033 does not fully respect dry-run. This has been fixed.

#6063

Removing deprecated thymeleaf syntax from existing templates, so as to avoid deprecation warnings in logs.

#6074

Before being processed, subscriptions would be read out of the database all at once. This lead to massive memory consumption if there were a lot of them. This has now been changed to use batching as a means of mitigating this problem.

#6083

Address care-gaps bug for handling missing improvement notation validation, and group level measure scoring definition. Bug fix for evaluate-measure subject-list where contained List resource was setting invalid references. Bumping to latest version of clinical reasoning 3.8.

#6094

Fix for regression of searches for canonical uris using a version (eg: http://example.com|1.2.3).

#6097

Fixed a bug where booting the JPA Server Starter would get a duplicate bean error. This has been corrected. Thanks to @subigre for the fix!

#6111

Previously, the package installer wouldn't create a composite SearchParameter resource if the SearchParameter resource didn't have an expression element at the root level. This has now been fixed by making SearchParameter validation in package installer consistent with the DAO level validations.

#6094

Searching or conditional creating/updating with a timestamp with an offset containing '+' fails with HAPI-1883. For example: 'Observation?date=2024-07-08T20:47:12.123+03:30' This has been fixed.

#6122

Previously, executing the '$validate' operation on a resource instance could result in an HTTP 400 Bad Request instead of an HTTP 200 OK response with a list of validation issues. This has been fixed.

#6123

IAnyResource _id search parameter was missing path property value, which resulted in extractor not working when standard search parameters were instantiated from defined context. This has been fixed, and also _LastUpdated, _tag, _profile, and _security parameter definitions were added to the class.

#6124

Previously, when retrieving a resource which may contain other resources, such as a document Bundle, if a ConsentService's willSeeResource returned AUTHORIZED or REJECT on this parent resource, the willSeeResource was still being called for the child resources. This has now been fixed so that if a consent service returns AUTHORIZED or REJECT for a parent resource, willSeeResource is not called for the child resources.

#6083

A bug with $everything operation was discovered when trying to search using hibernate search, this change makes all $everything operation rely on database search until hibernate search fully supports the operation.

#6134

Fixed a regression in 7.2.0 which caused systems using FILESYSTEM binary storage mode to be unable to read metadata documents that had been previously stored on disk.

#6142

Previously, if you upgraded from any older HAPI version to 6.6.0 or later, the SEARCH_UUID column length still showed as 36 despite it being updated to have a length of 48. This has now been fixed.

#6146

Previously, on MSSQL, two resources with IDs that are identical except for case (ex: Patient1 vs. patient1) would be considered to have the same ID because the database collation is case insensitive (SQL_Latin1_General_CP1_CI_AS). Among other things, this would manifest itself when trying to delete and re-create one of the resources. This has been fixed with a migration step that makes the collation on the resource ID case sensitive (SQL_Latin1_General_CP1_CS_AS).

#6150

Previously, the resource $validate operation would return a 404 when the associated profile uses a ValueSet that has multiple includes referencing Remote Terminology CodeSystem resources. This has been fixed to return a 200 with issues instead.

#6153

Previously, if you created a resource with some conditional url, but then submitted a transaction bundle that a) updated the resource to not match the condition anymore and b) create a resource with the (same) condition a unique index violation would result. This has been fixed.

#6156

Index IDX_IDXCMBTOKNU_HASHC on table HFJ_IDX_CMB_TOK_NU's migration is now marked as online (concurrent).

#6159

Previously, $apply-codesystem-delta-add and $apply-codesystem-delta-remove operations were failing with a 500 Server Error when invoked with a CodeSystem Resource payload that had a concept without a display element. This has now been fixed so that concepts without display field is accepted, as display element is not required.

When JPA servers are configured to always require a new database transaction when switching partitions, the server will now correctly identify the correct partition for FHIR transaction operations, and fail the operation if multiple partitions would be required.

#6179

Previously, the $reindex operation would fail when using a custom partitioning interceptor which decides the partition based on the resource type in the request. This has been fixed, such that we avoid retrieving the resource type from the request, rather we use the urls provided as parameters to the operation to determine the partitions.

#6188

Previously, a Subscription not marked as a cross-partition subscription could listen to incoming resources from other partitions. This issue is fixed.

#6208

A regression was temporarily introduced which caused searches by _lastUpdated to fail with a NullPointerException when using Lucene as the backing search engine. This has been corrected

#6056

The Derby JARs have been removed from this release. The older versions have multiple high-severity vulnerabilities against them, and the newer versions force usage of Java 21, which HAPI-FHIR does not yet support. If you wish to continue to use derby, you will have to provide the derby, derbyclient,derbynet, derbyshared, and derbytools jars on your classpath.

1.1.11HAPI FHIR 7.2.3 (Borealis)

 

1.1.11.1Release Information

Released: 2024-08-25

Codename: (Borealis)

1.1.11.2Upgrade Instructions

1.1.11.3Changes

#6070

Added paging support for $everything operation in synchronous search mode.

#6216

Previously, searches combining the _text query parameter (using Lucene/Elasticsearch) with query parameters using the database (e.g. identifier or date) could miss matches when more than 500 results match the _text query parameter. This has been fixed, but may be slow if many results match the _text query and must be checked against the database parameters.

1.1.12HAPI FHIR 7.2.2 (Borealis)

 

1.1.12.1Release Information

Released: 2024-07-19

Codename: (Borealis)

1.1.12.2Upgrade Instructions

1.1.12.3Changes

#6046

Added support for :contains parameter qualifier on the _text and _content Search Parameters. When using Hibernate Search, this will cause the search to perform an substring match on the provided value. Documentation can be found here.

#6099

Database migrations that add or drop an index no longer lock tables when running on Azure Sql Server.

#6024

Fixed a bug in search where requesting a count with HSearch indexing and FilterParameter enabled and using the _filter parameter would result in inaccurate results being returned. This happened because the count query would use an incorrect set of parameters to find the count, and the regular search when then try and ensure its results matched the count query (which it couldn't because it had different parameters).

#6044

Fixed an issue where doing a cache refresh with advanced Hibernate Search enabled would result in an infinite loop of cache refresh -> search for StructureDefinition -> cache refresh, etc

#6046

Previously, using _text and _content searches in Hibernate Search in R5 was not supported. This issue has been fixed.

#6083

A bug with $everything operation was discovered when trying to search using hibernate search, this change makes all $everything operation rely on database search until hibernate search fully supports the operation.

#6134

Fixed a regression in 7.2.0 which caused systems using FILESYSTEM binary storage mode to be unable to read metadata documents that had been previously stored on disk.

1.1.13HAPI FHIR 7.2.1 (Borealis)

 

1.1.13.1Release Information

Released: 2024-05-30

Codename: (Borealis)

1.1.13.2Upgrade Instructions

1.1.13.3Changes

#5960

Previously, queries with chained would fail to sort correctly with lucene and full text searches enabled. This has been fixed.

1.1.14HAPI FHIR 7.2.0 (Borealis)

 

1.1.14.1Release Information

Released: 2024-05-18

Codename: (Borealis)

1.1.14.2Upgrade Instructions

HFJ_FORCED_ID Table

The HFJ_FORCED_ID table is no longer used. Users may delete it after upgrading to 7.2 to free database storage space.

1.1.14.3Changes

The version of a few dependencies have been bumped to the latest versions (dependent HAPI modules listed in brackets):

  • Apache Commons Compress (Base): 1.21 -> 1.26.0

#5610

Before, message broker always used JacksonMessageConverter. Added a configuration option that allows to disable it so other converters can be configured depending on the message type.

#5682

Several enhancements have been made to the International Patient Summary generator based on feedback from implementers:

  • New methods have been added to the IIpsGenerationStrategy allowing resources for any or all sections to be fetched from a source other than the FHIR repository.
  • The IpsSectionEnum class has been removed and replaced in any user-facing APIs with references to SectionRegistry.Section. This makes it much easier to extend or replace the section registry with custom sections not defined in the universal IPS implementation guide.
  • Captions have been removed from narrative section tables, and replaced with H5 tags directly above the table. This results in an easier to read display since the table title will appear above the table instead of below it.
  • The IPS narrative generator built in templates will now omit tables when the template specified multiple tables and the specific table would have no resources.

#5692

The JPA WebSocket delivery mechanism now supports the content delivery mode. Thanks to Artiom Darie for the contribution!

#5712

The SearchNarrowingInterceptor can now optionally be configured to also apply URL narrowing to conditional URLs used by conditional create/update/delete/patch operations, both as raw HTTP transactions as well as within FHIR transaction Bundles.

#5745

Added another state to the Batch2 work chunk state machine: READY. This work chunk state will be the initial state on creation. Once queued for delivery, they will transition to QUEUED. The exception is for ReductionStep chunks (because reduction steps are not read off of the queue, but executed by the maintenance job inline.

#5750

Update to the 3.2.0 release of the Clinical Reasoning Module. This includes the following changes:

  • Updated the Clinical Reasoning documentation.
  • Added support for additional parameters on operations.
  • Added StructureDefinition/$questionnaire operation.
  • Add ability to generate PlanDefinition/$apply results with unique ids.
  • Resolved issues with Questionnaire item generation during PlanDefinition/$apply.
  • Resolved issues with some request resources not generated correctly from ActivityDefinition/$apply

#5767

Added new POLL_WAITING state for WorkChunks in batch jobs. Also added RetryChunkLaterException for jobs that have steps that need to be retried at a later time (can be provided optionally to exception). If a step throws this new exception, it will be set with the new POLL_WAITING status and retried at a later time.

#5777

Change the implementation of CDS on FHIR to use the Auto Prefetch functionality and to no longer pass the fhirServer from the request into the dataEndpoint parameter of $apply.

#5784

Add support to _sort for chained composition Bundle SearchParameters

#5800

A new setting in JpaStorageSettings enforces a maximum file size for Bulk Export output files, as well as work chunks creating during processing. This setting has a default value of 100 MB.

#5816

The ConceptMap/$translate operation will include targets with an equivalence code of unmatched in the response regardless of whether the target has a code.

#5818

Added another state to the Batch2 work chunk state machine: GATE_WAITING. This work chunk state will be the initial state on creation for gated jobs. Once all chunks are completed for the previous step, they will transition to READY.

#5845

Added a new pointcut: STORAGE_PRE_INITIATE_BULK_EXPORT. This pointcut is meant to be called explicitly before STORAGE_INITIATE_BULK_EXPORT, so that parameter manipulation that needs to be done before permission checks (currently done using STORAGE_INITIATE_BULK_EXPORT) can safely be done without risk of affecting permission checks/ authorization.

#5850

Add additional Clinical Reasoning operations $collect-data and $data-requirements to HAPI-FHIR to expand capability for clinical reasoning module users. These operations will assist users in identifying data requirements for evaluating a measure, and what data was used for a measure evaluation

#5855

If using an OpenTelemetry agent, a span is now generated for each interceptor method call. The span is named as 'hapifhir.interceptor' and it has the following attributes about the interceptor: 'hapifhir.interceptor.pointcut_name','hapifhir.interceptor.class_name', 'hapifhir.interceptor.method_name'

#5861

Enhance RuleBuilder code to support multiple instance IDs.

#5890

As part of the migration from LOB, provided the capability to force persisting data to LOB columns. The default behavior is to not persist in lob columns.

#5899

The MDM_POST_MERGE_GOLDEN_RESOURCES now supports an additional parameter, of type ca.uhn.fhir.mdm.model.MdmTransactionContext. Thanks to Jens Villadsen for the contribution.

#5748

In the JPA server, several database columns related to Batch2 jobs and searching have been reworked so that they no will longer use LOB datatypes going forward. This is a significant advantage on Postgresql databases as it removes a significant use of the inefficient pg_largeobject table, and should yield performance boosts for MSSQL as well.

#5838

Migration of remaining database columns still using the LOB datatypes. This change effectively cuts all ties with the inefficient pg_largeobject table.

#5682

The IPS $summary generation API has been overhauled to make it more flexible for future use cases. Specifically, the section registry has been removed and folded into the generation strategy, and support has been added for non-JPA sources of data. This is a breaking change to the API, and implementers will need to update their code. This updated API incorporates community feedback, and should now be considered a stable API for IPS generation.

#5814

Extracted methods out of ResourceProviderFactory into ObservableSupplierSet so that functionality can be used by other services. Unit tests revealed a cleanup bug in MdmProviderLoader that is fixed in this MR.

#5817

The HFJ_FORCED_ID table is no longer used.

#3761

Fixed behaviour of the _list query parameter. Now it returns exclusively resources that are members of the given list. Thanks to Jens Villadsen (@jkiddo) for the contribution!

#5088

Previously, the fullUrl for resources in _history bundles was not generated correctly when using a client provided id. The same problem started to happen for the resources with server generated ids more recently (after 6.9.10). This has now been fixed

#5110

When processing a FHIR transaction in the JPA server, an identifier containing a system that has no value but has an extension present could cause a NullPointerException. This has been corrected.

#5667

Previously, creating an XML encoded FHIR resource with a decimal element that has a leading plus sign value would result in JsonParseException during the read operation from the database. Thus, making it impossible to retrieve or modify such resources. This has been fixed.

#5668

Added support for sorting on a chained location.near search. This allows you to sort location by nearness via a chained search. Thanks to Nicolai Gjøderum (@nigtrifork) for the contribution!

#5671

Avoid lock contention by refreshing SearchParameter cache in a new transaction.

#5672

Previously, when performing a FHIR search using a non-chained relative reference (returns entire resource) with a server assigned id, it ignores the invalid resourceType in the parameter value and proceeds with the id based lookup. e.g. GET /MedicationAdministration?context=abc/1352 returns Encounter/1352. This has been fixed.

#5682

The IPS Generator will no longer replace resource IDs with placeholder IDs in the resulting bundle by default, although this can be overridden in the generation strategy object.

#5682

The BundleBuilder utility class will no longer include the /_version/xxx portion of the resource ID in the Bundle.entry.fullUrl it generates, as the FHIR specification states that this should be omitted.

#5690

Previously, a DELETE on a specific URL search string would always attempt to delete no matter the number of resolved resources. This has been fixed by adding a storage setting to enforce a threshold for resolved resources, above which the DELETE operation will fail to execute with HAPI-2496.

#5701

Previously, invoking search URLs containing ':identifier' would result in a HAPI-1250 error complaining about an invalid resource type. This has been fixed by returning a clearer error message for this specific condition: HAPI-2498.

#5707

Previously, with validation active, when a user POSTed a resource with a meta profile with a non-existent StructureDefinition URL, then POSTed the StructureDefinition, POSTing the same or another patient with that same meta profile URL would still fail with a VALIDATION_VAL_PROFILE_UNKNOWN_NOT_POLICY validation error. This has been fixed.

#5771

Previously, a Patch operation would fail when adding a complex extension, i.e. an extension comprised of another extension. This issue has been fixed.

#5720

System-level and Type-level History operations on the JPA server (i.e. _history) could sometimes contain duplicates or miss entries when a large number of matching resources on the server had identical update timestamps. This has been corrected.

#5722

An incorrect migration script caused a failure when upgrading to HAPI FHIR 7.0.0 on PostgreSQL if the database was not in the public schema. Thanks to GitHub user @pano-smals for the contribution!

#5725

The recommended constructor was not present on hibernate dialects provided by HAPI FHIR, leading to warnings during startup, and failures in some cases. This has been corrected. Thanks to GitHub user @pano-smals for the contribution!

#5730

Previously, using the FhirTerser to process an Extension with an Enumeration would fail. This has been fixed.

#5731

Previously, transactions that had entries with Bundle requests failed with HAPI-0339: Can not handle transaction with nested resource of type Bundle. This has been fixed and now transactions are permitted that contain entries with Bundle requests that have a specified url (i.e. POST to /Bundle), but are rejected if no url is specified (i.e. nested transactions or batches).

#5734

A scheduled job to clean up the Search URL table used to enforce uniqueness of conditional create/update jobs was created as a local job and not a clustered job. This has been fixed.

#5735

Previously, complex _has then chain then _has searches would fail to return results when expected (ex: 'Practitioner?_has:ExplanationOfBenefit:care-team:coverage.payor._has:List:item:_id=list1') This has been fixed.

#5742

Fixed behaviour of the _language query parameter. Now it is picked up as search parameter in the resource provider and filters accordingly. Thanks to Jens Villadsen (@jkiddo) for the contribution!

#5746

Batch2 jobs with reduction steps didn't fire the completion handler. This has been fixed.

#5758

Batch2 jobs with reduction steps didn't fire the completion handler with the up-to-date job status. This has been fixed.

#5788

Previously, the casing of the X-Request-ID header key was not retained in the corresponding response. This has been fixed.

#5801

Support for the _language parameter was added but it was not able to be used by clients of a JPA server because the _language parameter was not added to the resource providers. Additionally, no error message was returned when language support was disabled and a search with _language was performed. This has been fixed.

#5812

Previously, the 'planDefinition' resource parameter for the Dstu3 version of PlanDefinition/$apply was incorrectly defined as an R4 resource. This issue has been fixed.

#5820

Unifying the code paths for Patient type export and Patient instance export. These paths should be the same, since type is defined by spec, but instance is just 'syntactic sugar' on top of that spec (and so should be the same).

#5824

We now avoid a query during reindex and transaction processing that was very slow on Sql Server.

#5828

When batch 2 jobs with Reduction steps fail in the final part of the reduction step, this would often leave the job stuck in the FINALIZE state. This has been fixed; the job will now FAIL.

#5842

Fixed a bug where an NPE was being thrown when trying to serialize a FHIR fragment (e.g., backboneElement , compound datatype) to a string representation if the fragment contains a Reference.

#5856

Previously, it was possible to execute the $delete-expunge operation on a resource even if the user did not have delete permissions for the given resource type. This has been fixed.

#5865

Moving the Hibernate.Search annotation for text indexing from the lob column to the column added as part of the PostgreSql LOB migration.

#5874

Fixed a bug where 'List' would be incorrectly shown as 'ListResource' in the error response for a GET for an invalid resource.

#5877

Previously, updating a tokenParam with a value greater than 200 characters would raise a SQLException. This issue has been fixed.

#5886

Previously, either updating links on, or deleting one of two patients with non-numeric IDs linked to a golden patient would result in a HAPI-0389 if there were survivorship rules. This issue has been fixed for both the update links and delete cases.

#5888

Updated documentation on binary_security_interceptor to specify using STORAGE_PRE_INITIATE_BULK_EXPORT not STORAGE_INITIATE_BULK_EXPORT pointcut to change bulk export parameters.

#5893

Previously, hapi-fhir-cli: upload-terminology failed with a HAPI-0862 error when uploading LOINC. This has been fixed.

#5898

Previously, triggering a $meta via GET on a new patient with Megascale configured resulted in error HAPI-0389. This has been corrected This has been fixed.

#5904

Chained sort would exclude results that did not have resources matching the sort chain. These are now included, and sorted at the end.

#5915

Previously, in some edge case scenarios the Bulk Export Rule Applier could accidentally permit a Patient type level bulk export request, even if the calling user only had permissions to a subset of patients. This has been corrected.

#5917

Fix chained sorts on strings when using MS Sql

#5960

Previously, queries with chained would fail to sort correctly with lucene and full text searches enabled. This has been fixed.

#5717

Fixed a potential XSS vulnerability in the HAPI FHIR Testpage Overlay module.

1.1.15HAPI FHIR 7.0.3 (Zed)

 

1.1.15.1Release Information

Released: 2024-08-24

Codename: (Zed)

1.1.15.2Upgrade Instructions

1.1.15.3Changes

#6099

Database migrations that add or drop an index no longer lock tables when running on Azure Sql Server.

1.1.16HAPI FHIR 7.0.2 (Zed)

 

1.1.16.1Release Information

Released: 2024-03-20

Codename: (Zed)

1.1.16.2Upgrade Instructions

1.1.16.3Changes

1.1.17HAPI FHIR 7.0.1 (Zed)

 

1.1.17.1Release Information

Released: 2024-03-01

Codename: (Zed)

1.1.17.2Upgrade Instructions

1.1.17.3Changes

#5671

Avoid lock contention by refreshing SearchParameter cache in a new transaction.

#5722

An incorrect migration script caused a failure when upgrading to HAPI FHIR 7.0.0 on PostgreSQL if the database was not in the public schema. Thanks to GitHub user @pano-smals for the contribution!

#5742

Fixed behaviour of the _language query parameter. Now it is picked up as search parameter in the resource provider and filters accordingly. Thanks to Jens Villadsen (@jkiddo) for the contribution!

#5717

Fixed a potential XSS vulnerability in the HAPI FHIR Testpage Overlay module.

1.1.18HAPI FHIR 7.0.0 (Apollo)

 

1.1.18.1Release Information

Released: 2024-02-18

Codename: (Apollo)

1.1.18.2Upgrade Instructions

This release contains a large breaking change for authors of interceptors. Internally, HAPI-FHIR has swapped from using javax.* to jakarta.* packages. Please see the migration guide for more information. Without manual intervention, the majority of interceptors will fail at runtime unless they are upgraded.

Possible New Indexes on PostgresSQL

  • This affects only clients running PostgreSQL who have a locale/collation that is NOT 'C'
  • For those clients, the migration will detect this condition and add new indexes to:
    • hfj_spidx_string
    • hfj_spidx_uri
  • This is meant to address performance issues for these clients on GET queries whose resulting SQL uses "LIKE" clauses

These are the new indexes that will be created:

CREATE INDEX idx_sp_string_hash_nrm_pattern_ops ON public.hfj_spidx_string USING btree (hash_norm_prefix, sp_value_normalized varchar_pattern_ops, res_id, partition_id);
CREATE UNIQUE INDEX idx_sp_uri_hash_identity_pattern_ops ON public.hfj_spidx_uri USING btree (hash_identity, sp_uri varchar_pattern_ops, res_id, partition_id);

1.1.18.3Changes

The version of a few dependencies have been bumped to the latest versions (dependent HAPI modules listed in brackets):

  • Jackson (Base): 2.15.3 -> 2.16.1
  • SLF4j (Base): 2.0.3 -> 2.0.9
  • Logback (Base): 1.4.7 -> 1.4.14
  • Caffeine (Base): 3.1.1 -> 3.1.8
  • Spring Framework (JPA): 5.3.27 -> 6.1.1
  • Spring Boot (JPA-Starter): 5.3.27 -> 6.2.0
  • Spring Data BOM (JPA): 2021.2.2 -> 2023.1.0
  • Hibernate (JPA): 5.6.15.Final -> 6.4.1.Final
  • Hibernate Validator (JPA): 6.1.5.Final -> 8.0.0.Final
  • Hibernate Search (JPA): 6.1.6.Final -> 7.0.0.Final
  • Commons-DBCP2 (JPA): 2.9.0 -> 2.11.0
  • DataSource-Proxy (JPA): 1.9 -> 1.10
  • Spring Boot (Boot+Starter): 2.7.12 -> 3.1.4
  • Jetty (CLI): 10.0.14 -> 12.0.3
  • Jansi (CLI): 2.4.0 -> 2.4.1
  • Derby (CLI): 10.14.2.0 -> 10.17.1.0
  • Commons-Lang3 (CLI): 3.12.0 -> 3.14.0
  • Commons-CSV (CLI): 1.8 -> 1.10.0
  • Phloc Schematron (Schematron Validator): 5.6.5 -> 7.1.2
  • RestEasy (JAX-RS Server): 5.0.2.Final -> 6.2.5.Final

#5081

Added MDM support for FHIR R5.

#5138

A match result map field has been added to the $mdm-link-history operation. This new field shows the rules that evaluated true during matching and the corresponding initial match result when the link was created.

#5271

The error messages returned in an OperationOutcome when validating terminology codes as a part of resource profile validation have been improved. Machine processable location (line/col) information is now available through a pair of dedicated extensions, and error messages such as UCUM parsing issues are now returned to the client (previously they were swallowed and a generic error message was returned).

#5321

It is now possible to configure the strictness of concept display name validation using a new flag on the InMemoryTerminologyServerValidationSupport (for non-JPA validation) and JpaStorageSettings (for JPA validation). In addition, the error messages emitted by the validator when a concept display doesn't match have been improved to be much more useful.

#5401

Previously, it was only possible to clear a top-level field on a resource using TerserUtil. A new method has been added to TerserUtil to support clearing a value by FhirPath.

#5426

Added a new method getResourceByReferenceAndResourceType() in BundleUtil.java to find a specific Resource from Bundle using Reference.

#5436

Moving clinical reasoning to non-javax dependency for alignment with incoming hapi-fhir changes, bumping CR version and updating impacted classes and services

#5439

Added Terminology Troubleshooting Log to support troubleshooting terminology issues.

#5442

The ValidatorResourceFetcher will now resolve canonical URL references as well as simple local references.

#5469

There is a programmatic filter enabled which skips installation for certain resources based on their status in PackageInstallerSvcImpl. The filter can now be controlled via StorageSettings.

#5476

A new method on the IValidationSupport interface called lookupCode(LookupCodeRequest) has been added. This method will replace the existing lookupCode methods, which are now deprecated.

#5480

Updated $member-match operation signature to match the latest specification.

#5480

Updated Consent storage in $member-match operation.

#5498

Added support for id-only and empty payload content types for notifications triggered by R5, R4B, and R4 back-ported topic subscriptions.

#5502

It is now possible to mutate an HTTP response from the CLIENT_RESPONSE Pointcut, and pass this mutated response to downstream processing.

#5527

Added a map of additionalData to BulkExport job params. This will allow consumers of BulkExport to add additional data to be accessed at later steps by using various pointcuts in the system. Updated ConsentService so that BulkExport operations will call the willSeeResource method for each exported resource.

#5536

In code: Support lowercase for SQL columns and overridden column type/driver type SQL type string rules

#5558

An interceptor was added to block resource updates which would cause the resource to change Patient compartment. Please see JPA Server: Block Resource Updates Changing Patient Compartment for more information.

#5569

Upgrade Clinical Reasoning version for latest bug fixes and available operations. Add $evaluate library operation.

#5588

Added auto-version-references-at-path extension that allows to enable auto versioning references at specified paths of resource instances.

#5593

Hibernate SQL log filtering capability was added. See Hibernate SQL Log Filtering.

#5377

Subscription triggering via the $trigger-subscription operation is now multi-threaded, which significantly improves performance for large data sets.

#5555

Previously, resource body content went into one of 2 columns on the HFJ_RES_VER table: RES_TEXT if the size was above a configurable threshold, or RES_TEXT_VC if it was below that threshold. Performance testing has shown that the latter is always faster, and that on Postgres the use of the latter is particularly problematic since it maps to the largeobject table which isn't the recommended way of storing high frequency objects. The configurable threshold is now ignored, and the latter column is always used. Any legacy data in the former column will still be read however.

HAPI FHIR JPA now requires PostgreSQL 10+. Previously Postgres 9.4 was supported but this version has been dropped.

#5444

The reindexing and mdm-clear batch jobs now stream results internally for more reliable operation.

#5612

The resource dao interface now supports searching for IIdType or full resources.

#5452

Swapped from using javax.* to jakarta.* packages. This is a breaking change for a large majority of people who write custom code against HAPI-FHIR. Please see the migration guide for more information.

#4634

Previously, rule builder could not effectively handle Patient Type-Level Exports. It would over-permit requests in certain scenarios. This fix allows for accumulation of ids on a Patient Type-Level Bulk export to enable us to properly match the requested Patient IDs against the users permitted Patient IDs.

#5192

Fixed a bug where search Bundles with include entries from an _include query parameter might trigger a 'next' link to blank pages when no more results match results are available.

#5333

A regression was introduced in 2023.08.R01 which caused binary storage prefixes to not be applied to exported binary blobs. This has been fixed.

#5340

Updated documentation specifying the correct status (CANCELLED) to set the job status to if a job is cancelled.

#5353

Previously, when using revincludes and includes with iterate, while also using revincludes without iterate, the result omitted some resources that should have been included. This issue has now been fixed.

#5445

Added warnings when MDM candidate search parameters are not defined and candidate search limit is exceeded.

#5452

Previously, the $mdm-query-link operation would return values of field linkCreated and linkUpdated in scientific notation when the last digits are 0. This is now fixed and always returns in standard notation.

#5454

Previously, searching with parameter '_total' could influence chunked query resultsets and subsequently, paged results. This is now fixed.

#5460

Previously, expanding a ValueSet using hierarchical CodeSystem would fail in different scenarios with a constraint violation exception when codes (term concepts) were being persisted. This is now fixed.

#5465

Several fixes to the HAPI FHIR generated OpenAPI schema have been implemented. This means that the spec now validates cleanly. Thanks to Primož Delopst for the contribution!

The hapi-fhir-validation module inadvertently included a mandatory dependency on the Caffeine caching library instead of leaving it to implementors to choose which module to pick. This has been corrected.

#5475

Ensure batch2 jpa persistence always targets the default partition.

#5486

Previously, testing database migration with cli migrate-database command in dry-run mode would insert in the migration task table. The issue has been fixed.

Previously, it was impossible to find all resources from different partitions for $everything operation with partitioning.cross_partition_reference_mode=ALLOWED_UNQUALIFIED and dao_config.client_id_mode=ANY. It's fixed now

#5496

Ensure batch jobs target the default partition for non-gated steps.

The HFQL/SQL engine incorrectly parsed expressions containing a >= or <= comparator in a WHERE clause. This has been corrected. Additionally, the execution engine has been optimized to apply clauses against the meta.lastUpdated path more efficiently by using the equivalent search parameter automatically.

#5511

Previously, when creating an index as a part of a migration, if the index already existed with a different name on Oracle, the migration would fail. This has been fixed so that the create index migration task now recovers with a warning message if the index already exists with a different name.

#5511

Previously, CodeSystem $lookup with Remote Terminology Service enabled would throw NullPointerException when the CodeSystem included designations with no language value. Also, there was an inconsistency between input and output type string vs. code for property parameters. These issues have been fixed.

#5523

Previously, it was possible to store NPM Packages where the package name's case did not match the package ID's case, e.g. my-package was different than MY-PACKAGE. Names are now normalized to lower case before queries occur.

#5529

When using a chained SearchParameter to search within a Bundle as described here, if the Bundle.entry.fullUrl was fully qualified but the reference was not, the search did not work. This has been corrected.

#5537

Calling the method getOrCreateContentType in AttachmentUtil on an attachment with no content type would throw exception because contentType is a code not a string. This fixes the function to create an empty code as expected

#5546

A database migration added trailing spaces to server-assigned resource ids. This fix removes the bad migration, and adds another migration to fix the errors.

#5547

The addition of the indexes idx_sp_uri_hash_identity_pattern_ops and idx_sp_string_hash_nrm_pattern_ops could occasionally timeout during migration in Postgresql on large databases, leaving the migration table in a failed state, and Smile CDR unable to boot. Now existence of the index is checked before attempting to add it again.

#5547

Previously LIKE queries against resources would perform poorly on PostgreSQL if the database locale/collation was not 'C'. This has been resolved by checking hfj_spidx_string.sp_value_normalized and hfj_spidx_uri.sp_uri column collations during migration and if either or both are non C, create a new btree varchar_pattern_ops on the hash values. If both column collations are 'C', do not create any new indexes.

#5553

mdm-clear jobs are prone to failing because of deadlocks when running on SQL Server. Such job failures have been mitigated to some extent by increasing the retries on deadlocks.

#5563

Previously, certain mdm configuration could lead to duplicate eid identifier entries in golden resources. This has been corrected

#5564

Previously, FHIRPath expression evaluation when using the _fhirpath parameter would not work on chained use of 'resolve()'. This was most notable when using _fhirpath with FHIR Documents (i.e. 'Bundle' of type 'document' where 'entry[0]' is a 'Composition'). This has now been fixed.

#5567

When updating or reindexing a resource in the JPA server, if duplicate rows are present in the indexing tables, the duplicate rows may fail to be removed. Duplicates are not typically present in these tables, but can happen if an indexing job fails in some circumstances. The impact of these rows not being cleaned up is that resources may appear in search results that they should no longer appear in.

#5589

When encoding resources using the RDF parser, placeholder IDs (i.e. resource IDs starting with urn:) were not omitted as they are in the XML and JSON parsers. This has been corrected.

#5589

When encoding a Bundle, if resources in bundle entries had a value in Bundle.entry.fullUrl but no value in Bundle.entry.resource.id, the parser sometimes incorrectly moved these resources to be contained within other resources when serializing the bundle. This has been corrected.

$everything queries with MDM expansion were bypassing the partition boundary by return resources outside the partition. Also, POST (as opposed to GET) $everything queries with MDM expansion. The first issue was fixed by reversing the previous changes in 5493 and by filtering source and golden resources by partition ID. The second issue was fixed by correctly capturing the MDM expansion flag in POST $everything queries.

#5602

Previously, instance-level Patient Bulk Export batch job would fail if the _type parameter was empty. This is now fixed and _type will default to all resource types in the Patient Compartment plus Device.

#5603

Previously, the semantics of is-a were incorrect in Valueset Expansion. The implementation previously used the behaviour of descendent-of, which means that A is-a A was not being considered as true. This has been corrected. In addition, descendent-of is now supported, which compares for strict descendency, and does not include itself. Thanks to Ole Hedegaard (@ohetrifork) for the fix.

#5606

Fixed an issue where executing $trigger-subscription with a search URL criteria on a partitioned Subscription resource would result in the failure to deliver the affected resources. This issue has now been resolved.

#5617

Resource UserData RESOURCE_PARTITION_ID was incorrectly being set to null for the default partition. This has been corrected to use RequestPartitionId.defaultPartition()

#5619

Previously, when a transaction was posted with a resource that had placeholder references and auto versioning references enabled for that path, if the target resource was included in the Bundle but not modified, the reference was saved with a version number that didn't exist. This has been fixed.

#5621

Fixed a deadlock in resource conditional create.

#5623

Previously, searches that used more than one chained Bundle SearchParameter (i.e. Composition) were only adding one condition to the underlying SQL query which resulted in incorrect search results. This has been fixed.

#5626

Previously, an exception could be thrown by the container when executing a contextClosedEvent on the Scheduler Service. This issue has been fixed.

#5632

Previously bulk export operation was returning an empty response when no resources matched the request, which didn't comply with HL7 HAPI IG. This has been corrected.

#5633

Smile failed to save resources running on Oracle when installed from 2023-02 or earlier. This has been fixed.

#5634

Previously, expanding a 'ValueSet' with no concepts based on system urn:ietf:bcp:13 would fail with ExpansionCouldNotBeCompletedInternallyException. This has been fixed.

#5636

Previously, the number of threads allocated to the $expunge operation in certain cases could be more than configured, this would cause hundreds of threads to be created and all available database connections to be consumed. This has been fixed.

#5640

Clinical reasoning version bump to address reported 'null pointer' error that is encountered when running $evaluate-measure against a measure with an omitted measure.group.population.id

#5642

A non-superuser with correct permissions encounters HAPI-0339 when POSTING a transaction Bundle with a PATCH. This has been fixed.

#5644

Previously, searching for Bundle resources with read all Bundle resources permissions, returned an HTTP 403 Forbidden error. This was because the AuthorizationInterceptor applied permissions to the resources inside the Bundle, instead of the Bundle itself. This has been fixed and permissions are no longer applied to the resources inside a Bundle of type document, message, or collection for Bundle requests.

#5649

Change database upgrade script to avoid holding locks while adding indices.

#5651

Previously, conditional creates would fail with HAPI-0929 errors if there was no preceding '?'. This has been fixed.

#5654

Fixed a MeasureReport measureScoring bug impacting any measures currently using denominator-exception population will incorrectly calculate the score without following specification. This bug adds an extension to MeasureReport Groups to capture calculated denominator and numerator to bring transparency to the measureScore calculation and act as a dataSource of measureScore instead of behind the scenes calculations.

Previously, the Bulk Import ($import) job was ignoring the httpBasicCredentials section of the incoming parameters object, causing the job to fail with a 403 error. This has been corrected.

#5659

Previously, after registering built-in interceptor PatientIdPartitionInterceptor, the system bulk export (with no filters) operation would fail with a NullPointerException. This has been fixed.

#5680

Previously, after registering built-in interceptor PatientIdPartitionInterceptor, while performing an async system bulk export, the $poll-export-status operation would fail with a NullPointerException. This has been fixed.

#5700

Previously (this release cycle), when you call RemoteTerminologyServiceValidationSupport method lookupCode with a CodeSystem that has properties that are not string or Coding, the method would throw an exception. It should instead accept any type and convert any unsupported type to string. This has been fixed.

The legacy $lastn support has been removed, and only the redesigned 'advanced' version is now supported. The advanced version requires Elasticsearch.

#5505

Removed an incorrect implementation of $member-match.

1.1.19HAPI FHIR 6.8.7 (Yucatán)

 

1.1.19.1Release Information

Released: 2024-03-01

Codename: (Yucatán)

1.1.19.2Upgrade Instructions

This release strictly attempts to remove as much usage of the LOB table as possible in postgres. Specifically, in the JPA server, several database columns related to Batch2 jobs and searching have been reworked so that they no will longer use LOB datatypes going forward. This is a significant advantage on Postgresql databases as it removes a significant use of the inefficient pg_largeobject table, and should yield performance boosts for MSSQL as well.

1.1.19.3Changes

#5748

In the JPA server, several database columns related to Batch2 jobs and searching have been reworked so that they no will longer use LOB datatypes going forward. This is a significant advantage on Postgresql databases as it removes a significant use of the inefficient pg_largeobject table, and should yield performance boosts for MSSQL as well.

1.1.20HAPI FHIR 6.8.6 (Yucatán)

 

1.1.20.1Release Information

Released: 2023-12-06

Codename: (Yucatán)

1.1.20.2Upgrade Instructions

Fixed migration related issues

1.1.20.3Changes

#5486

Previously, testing database migration with cli migrate-database command in dry-run mode would insert in the migration task table. The issue has been fixed.

#5511

Previously, when creating an index as a part of a migration, if the index already existed with a different name on Oracle, the migration would fail. This has been fixed so that the create index migration task now recovers with a warning message if the index already exists with a different name.

1.1.21HAPI FHIR 6.8.5 (Yucatán)

 

1.1.21.1Release Information

Released: 2023-10-20

Codename: (Yucatán)

1.1.21.2Upgrade Instructions

1.1.21.3Changes

#5377

Subscription triggering via the $trigger-subscription operation is now multi-threaded, which significantly improves performance for large data sets.

1.1.22HAPI FHIR 6.8.4 (Yucatán)

 

1.1.22.1Release Information

Released: 2023-10-18

Codename: (Yucatán)

1.1.22.2Upgrade Instructions

1.1.22.3Changes

#5353

Previously, when using revincludes and includes with iterate, while also using revincludes without iterate, the result omitted some resources that should have been included. This issue has now been fixed.

1.1.23HAPI FHIR 6.8.3 (Yucatán)

 

1.1.23.1Release Information

Released: 2023-09-22

Codename: (Yucatán)

1.1.23.2Upgrade Instructions

This release permits you to change the severity of a coding display mismatch error during validation. This also fixes a regression which was causing Bulk Export _exportId to not be respected during blob prefixing.

1.1.23.3Changes

#5271

The error messages returned in an OperationOutcome when validating terminology codes as a part of resource profile validation have been improved. Machine processable location (line/col) information is now available through a pair of dedicated extensions, and error messages such as UCUM parsing issues are now returned to the client (previously they were swallowed and a generic error message was returned).

#5321

It is now possible to configure the strictness of concept display name validation using a new flag on the InMemoryTerminologyServerValidationSupport (for non-JPA validation) and JpaStorageSettings (for JPA validation). In addition, the error messages emitted by the validator when a concept display doesn't match have been improved to be much more useful.

#5333

A regression was introduced in 2023.08.R01 which caused binary storage prefixes to not be applied to exported binary blobs. This has been fixed.

1.1.24HAPI FHIR 6.8.2 (Yucatán)

 

1.1.24.1Release Information

Released: 2023-09-05

Codename: (Yucatán)

1.1.24.2Upgrade Instructions

Note: this release has been decommissioned, and you should not be using it. Please upgrade to a newer version.

1.1.24.3Changes

1.1.25HAPI FHIR 6.8.1 (Yucatán)

 

1.1.25.1Release Information

Released: 2023-08-31

Codename: (Yucatán)

1.1.25.2Upgrade Instructions

Note: this release has been decommissioned, and you should not be using it. Please upgrade to a newer version.

1.1.25.3Changes

1.1.26HAPI FHIR 6.8.0 (Yucatán)

 

1.1.26.1Release Information

Released: 2023-08-18

Codename: (Yucatán)

1.1.26.2Upgrade Instructions

Users of the Resource.meta.source field, as well as users of the _source parameter should perform a global $reindex after upgrading to this version of HAPI FHIR with the following parameters:

[base]/$reindex?reindexSearchParameters=false&optimizeStorage=ALL_VERSIONS

The previous mechanism for storing and indexing these parameters is inefficient and will be replaced in a future release of HAPI FHIR. Performing this reindex operation ensures that existing data will continue to be searchable.

1.1.26.3Changes

The version of a few dependencies have been bumped to the latest versions (dependent HAPI modules listed in brackets):

  • Hibernate ORM (JPA): 5.6.12.Final -> 5.6.15.Final

#4380

The @Interceptor annotation can now be placed at the method level. This is used only as a marker, and does not change the behaviour or interceptors in any way. Thanks to Dominique Villard for the pull request!

#4570

The batch2 framework now supports warning messages.

#4787

A new interceptor called BalpAuditCaptureInterceptor has been added. This interceptor automatically generates AuditEvent resources in a HAPI FHIR server that are conformant with the IHE BasicAudit Log Patterns IG.

#4838

When invoking the instance level $reindex and $reindex-dryrun operations, the resulting status message and any warnings are now included in the response Parameters object as well as in the generated response HTML narrative.

#4838

When performing a resource reindex on a deleted resource, any search index rows will now be deleted. Deleting a resource should generally not leave any such rows behind, but they can be left if the resource is manually deleted using SQL directly against the database and in this case the reindex job will now clean up these unwanted rows.

#4911

Added a new SubscriptionTopicDispatcher service for use by java extensions that need to dispatch their own subscription topic notifications

#4913

Added support for Topic Subscription Filters. In R4B and R5, SubscriptionTopic notifications will interpret subscription filters as FHIR Search Parameters and perform an in-memory match of the focus resource against the search parameters. For R4 or user-generated event notifications, the caller can specify a custom implementation of ISubscriptionTopicFilterMatcher on the call to SubscriptionTopicDispatcher.dispatch() to provide custom filter matching logic.

#4913

Added support for Subscriptions R5 Backport to R4 as documented in http://build.fhir.org/ig/HL7/fhir-subscription-backport-ig/components.html.

#4931

The $delete-expunge operation has a new parameter cascade that can be used to request that resources with indexed references to other resources being deleted should also be deleted.

#4937

The SQL schema migrator now returns a status flag indicating whether the schema was initialized or not.

#5003

The IParser interface now has an additional pair of methods called encodeToString(IBase) and encodeToWriter(IBase, Writer) that can be used to encode fragments of resources, such as datatypes or infrastructure elements.

#5009

Previously, all revincludes would always be evaluated before all includes. Now the system checks if any revincludes are recursive (i.e. are modified :iterate) and if so, it evaluates all the includes first.

#5014

There was a bug with automatic partition ID selection where it was not bound to positive integers and could return a value that was out of range. This has been fixed.

#5014

It is no longer mandatory to provide a partition ID when executing the $partition-management-create-partition operation. If you omit the partition ID, one will be randomly selected from the available pool of values. Note that this may incur a small performance cost when creating partitions.

A new configuration option, JpaStorageSettings#setOnlyAllowInMemorySubscriptions(boolean) can now prevent the creation of Subscriptions that would need to be matched in the database. If enabled, only Subscriptions which can be evaluated IN-MEMORY are permitted to be created.

#5052

A new interceptor called BinarySecurityInterceptor has been added. This interceptor can be used to enforce access to Binary resources by using values in the Binary.securityContext element.

#5058

Added infrastructure to allow consumers to define MDM block rules based on fhir path and specific values. To utilize this feature, an IBlockListRuleProvider must be wired up with the required rules json.

#5061

Added a utility method to the TerserUtil class to facilitate the creation of new instances of BackboneElement classes.

#5071

Previously, calls to the Fulltext Search service (Lucene/Elasticsearch) did not invoker the JPA_PERFTRACE_INFO. Now, they invoke this pointcut with information of which query went out to the fulltext system.

#5080

Extended the existing MDM similarity algorithms to numeric values such that the input is normalized by removing all non-numeric characters from the string before the similarity algorithm is applied. This can be useful when wanting to measure similarity between identifying numbers or phone numbers where dashes or other special separating characters may be used.

#5083

A new SQL-like evaluator called the HAPI FHIR Query Language (HFQL) has been added.

#5083

The IFhirPath evaluator interface now has an additional overload of the evaluate method which takes in a parsed expression returned by the parse method. This can be used to improve performance in cases where the same expression is being used repeatedly.

#5095

Added support for :above, :below, :contains and :missing _source search parameter modifiers.

#5115

The Generic/Fluent client can now handle arbitrary (ie. non-FHIR) responses from $operation invocation by specifying a response resource type of Binary.

#5115

A new experimental SQL-like query syntax called HFQL (HAPI FHIR Query Language) has been added.

#5115

OpenAPI definitions were not working for R5 JPA servers. This has been corrected.

#5158

Added support for Subscription matching of ':above', ':below', ':contains' and ':missing' '_source' search parameter modifiers.

#4831

Conditional deletes that delete multiple resources at once have been optimized to perform fewer SQL select statements, which should improve performance on large deletes.

#4817

Introduce IBaseResource.isDeleted() method and convert code to use it. Add subscription_topic_troubleshooting log. No longer rely on ResourceGoneException to detect deleted subscription. Instead use the new isDeleted() method. Demote unexpected exceptions in HapiTransactionService from error to debug since these exceptions are expected e.g. when checking if a resource has been deleted by catching a ResourceGoneException

#5029

Searching for token parameters has been extended to systems and values of any length. Sorting by tokens is still limited to the first 200 characters each of the system and value. valid request.

#5039

Bulk export fetch operations now properly account for the partition being searched, which should improve performance in some cases on partitioned systems.

#5039

A new interceptor pointcut called STORAGE_BULK_EXPORT_RESOURCE_INCLUSION has been added. This pointcut is called for every resource that will be included in a bulk export data file. Hook methods may modify the resources or signal that they should be filtered out.

#5039

The class BulkDataExportOptions has been removed and replaced with an equivalent class called BulkExportJobParameters. This change is a breaking change unfortunately, but should be easily remedied as the replacement class has a very similar signature. This change reduces a large amount of duplication in the bulk export codebase and should make for more maintainable code in the future.

#5128

Previously, when running with mdm, the server automatically changed storage settings to enable message subscriptions. This has been changed to require the user to explicitly enable message subscriptions when running with mdm. If mdm is enabled and message subscriptions are not enabled, the server will now throw an exception on startup.

#4468

When performing a search using a plain server without a cache, pagination links could contain invalid offsets in the prev link. Thanks to Aleksej Parovysnik for the pull request!

#4468

When parsing a FHIR resource which has multiple value[x] choice fields, the parser does not call the IParserErrorHandler#unexpectedRepeatingElement method on the configured parser error handler. Thanks to Max Bureck for the pull request!

#4783

FHIR Patch operations on choice types in nested expressions did not work correctly. Thanks to Zach Smith for the pull request!

#4787

HashMapResourceProvider invoked the STORAGE_PRESTORAGE_xxx and STORAGE_PRECOMMIT_xxx pointcuts after storing the resource into memory. This means that if any interceptors threw an exception in an attempt to abort the transaction, this did not actually result in the resource storage being aborted. This has been corrected.

#4799

There is an issue where searching on paramName '_profile' with modifier 'missing' will not provide the correct search result. This has been fixed.

#4813

Under heavy concurrency, a bug resulted in identical tag definitions being rejected with a NonUniqueResultException some of the time. This has been corrected.

#4831

When performing a FHIR transaction containing both a conditional delete as well as a conditional create/update for the same resource, the resource was left in an inconsistent state. This has been corrected. Thanks to Laxman Singh for raising this issue.

#4832

When serializing resources in JSON, if resource came from an XML-parsed resource that contained comments, the JSON serializer incorrectly created an empty object. This has been corrected.

#4838

Two failures in the $delete-expunge operation were fixed:

  • Jobs could fail if hibernate search was loaded but not enabled.
  • Jobs could fail if the criteria included a _lastUpdated=lt[date] clause

#4838

When reindexing resources, deleted resources could incorrectly fail validation rules and cause the reindex job to not complete correctly. This has been corrected.

#4838

The BALP AsyncMemoryQueueBackedFhirClientBalpSink incorrectly used a non-blocking method to add events to the blocking queue, resulting in race conditions on a heavily loaded server.

#4842

There was a bug with the TerserUtil, where it would not overwrite non-empty values with empty values from a source resource. This has been corrected. Thanks to @nigtrifork for the fix!

#4878

Batch jobs occasionaly reported zero (0) record processed counts. This has been corrected.

#4881

When Index Contained References is enabled in the JPA server, Bundle resources could not be stored or indexed due to an incompatibility with the default Bundle search parameters. This has been corrected.

#4888

Previously, it was possible to create composite SP with any types of SP as components. This has been fixed by limiting the component SP types to String, Token, Date, or Quantity.

#4896

The _lastUpdated query parameter is no longer applied to _include or _revinclude search results.

#4917

Matching algorithms have been refactored to allow greater flexibility in setting and defining nicknames as well as allowing bean injection into matcher classes.

#4922

R5 Subscription.filterBy.resourceType failed to deserialize because the deserializer skipped all elements named 'resourceType'. This has been changed so that only toplevel resourceType elements are skipped in the deserialization process.

#4934

Previously, installing or uninstalling an implementation guide does not refresh the validation cache. This problem has been fixed.

#4947

Previously, logging level on specific services was set too high. This has been modified.

#4952

Previously, the resource server Id strategy was not honoured when doing a create with a conditional update operation on a resource where the ID was not assigned. This is now fixed.

#4957

Previously, performing a $validate-code operation with a remote terminology service on an invalid CodeSystem or ValueSet returned 500. This problem has been fixed.

#4959

Previously, set synchronous search size to a low value will make MDM startup validation fail. This is now fixed.

#4960

Running a $delete-expunge MSSQL or Oracle with over 10,000 resources results in a error and a stack trace, even though the job ends in status COMPLETE. This has been fixed.

#4968

Previously, when performing a $mdm-clear followed by an update to an existing resource without doing the required $mdm-submit first, a non-descriptive NullPointerException was thrown. To fix this, an exception that includes a more descriptive/suggestive message will be thrown when this condition is detected.

#4971

Previously, expanding a valueSet including a codeSystem that is unknown to the server would return an internal error(500) to the caller. This problem has been fixed.

#4976

Added a test to verify that all Foreign Key constraints are explicitly indexed as well. Added indexes to a number of tables that declared foreign keys that weren't explicitly indexed. This should not only make many of these queries (including $mdm-clear operations) much faster, it will prevent deadlocks in Oracle and other databases that require foreign keys to be indexed.

#4982

$mdm-clear has been fixed to respect batch-size parameter (unless it exceeds 500). It has also been made slightly more efficient.

#4987

Search bundle entry parts were being created as INCLUDE unless explicitly indicated as MATCH. This has been fixed. Now they are created as MATCH unless explicitly indicated as INCLUDE.

#4989

Bulk export with patient ID specific user rules/permissions will fail with Parameters that include that patient ID in a _typeFilter. This has been fixed.

#5000

Previously, the JPA_PERFTRACE_RAW_SQL was not firing for raw sql that occurred during a revinclude or include. This has been corrected.

#5004

Previously when requesting previous or prev link using BundleUtil.getLinkUrlOfType, only the literal requested link was returned. Now when requesting either previous or prev previous or prev link is returned. If both exist, equality is validated and exception is thrown on failure.

#5005

Nickname Service Config has been moved out of search parameters as an optional config to add. Nickname service now has an interface to allow flexibility in implementation.

#5008

Previously, the GenericClient would only support the HTTP GET method for paging requests. This has been corrected by adding the possibility for paging with an HTTP POST.

#5011

Previously, if a partition was created with an ID that was already in use, it would overwrite the partition that was using that ID. Now attempting to overwrite will return a 400

#5021

Previously, running batch jobs with postgresql as the db will result in SQL error. This has now been fixed.

#5023

Jpa migration task used awssdk StringUtils rather than apache commons string utils. Thanks to @Thopap for the contribution

#5032

Fixed a condition by which a NPE was sometimes thrown when performing gateway pagination with targets with property useHttpPostForAllSearches configured to true.

#5033

Updated the query that is supposed to help detect foreign key constraints that also do not have indexes to be a) simpler (smaller) and b) find more results. Added an additional entry to the whitelist as a result.

#5037

Previously, when the last source resource with a MATCH link was deleted, the golden resource remained in the database, leaving it orphaned. This has now been fixed such that when there are no more MATCH links left associated with a golden resource, the golden resource will automatically be deleted.

#5041

Fixed an issue where reindex batch jobs failed to start and were stuck in QUEUED status after a SearchParameter update.

#5055

Delete expunge (and possibly other batch 2 jobs) will fail when given more than 2100 resources with identical timestamps when using an mssql database. This has been fixed.

#5057

Fixed recently introduced regression that when following bundle next links through to the end, in certain circumstances a next link would appear in the final bundle when in fact it was the last page.

#5075

The system was failing to recognize custom resources during transaction processing. This has been fixed.

#5084

Fixed FindCandidateByExampleSvc.findMatchGoldenResourceCandidates to not return duplicate golden resource candidates.

#5100

Fixed a bug in FindCandidateByExampleSvc that resulted in class cast exceptions for IResourcePersistentIds that are not based on Long value ids.

#5102

Consider user-assigned IDs, instead of system assigned IDs, when sorting MDM links history.

#5103

Remove + from the list of characters that are escaped automatically since + is already an escaped character (representing a space) in the query part of URLs.

#5112

Returns better diagnostics message to expunge requests that failed due to unfinished batch deletion

#5117

Previously, all MDM field scores, including NO_MATCHes, were included in the final total MDM score. This has now been fixed so that only MATCHed fields are included in the total MDM score.

#5119

Previously, when the consent service would remove all resources to be returned, the response bundle would not provide the previous/next link(s). This has been corrected.

#5126

Previously, updating from Hapi-fhir 6.6.0 to 6.8.0 would cause migration error, it is now fixed.

#5150

When running a $delete-expunge with over 10,000 resources, only the first 10,000 resources were deleted. This is now fixed.

#5155

Previously, requesting an $expunge operation on CodeSystem resources while CS batch deletion is underway would return HTTP 500. This has been fixed to return HTTP 412 (precondition failed).

#5157

Previously, the reuse functionality did not operate correctly when dealing with POST and GET requests. This fix ensures that similar POST and GET export requests will be reused.

#5167

Fixed a dependency in the HSQL JDBC driver referencing a non-bundled class (javax.ServletOutputStream)

#5173

Fix gateway $everything operation to respect server configured default and maximum page sizes.

#5179

Added evaluation setting for hapi-fhir storage-cr module operations from outside. Updated provider loading from hapi-fhir instead of external server for caregaps and submitdata providers. Updated testing suite to depend on restful server for new provider loader

#5182

Previously, removing tags in a resource update with proper headers and versioning flag would not trigger a new subscription. This has been fixed.

#5183

The latest US Core IG includes two ValueSets with different contents, but the same FHIR Id and OID via two different included IGs (i.e. 2.16.840.1.113762.1.4.1010.9 via us.cdc.phinvads and us.nlm.vsac). Ingesting these duplicates in US Core failed with a 500 error. This has been resolved by logging the error and allowing the rest of the ingestion to proceed.

#5205

Previously, uploading a large vocabulary file (like Loinc) through the upload-external-code-system command would return an error. The issue has been fixed.

1.1.27HAPI FHIR 6.6.2 (Xenon)

 

1.1.27.1Release Information

Released: 2023-07-04

Codename: (Xenon)

1.1.27.2Upgrade Instructions

This release resolves several CVEs.

1.1.27.3Changes

#5023

Jpa migration task used awssdk StringUtils rather than apache commons string utils. Thanks to @Thopap for the contribution

1.1.28HAPI FHIR 6.6.1 (Xenon)

 

1.1.28.1Release Information

Released: 2023-05-28

Codename: (Xenon)

1.1.28.2Upgrade Instructions

This release resolves several CVEs.

1.1.28.3Changes

1.1.29HAPI FHIR 6.6.0 (Xenon)

 

1.1.29.1Release Information

Released: 2023-05-18

Codename: (Xenon)

1.1.29.2Upgrade Instructions

This release has breaking changes.

  • The Resource $validate operation no longer returns Precondition Failed 412 when a resource fails validation. It now returns 200 irrespective of the validation outcome as required by the FHIR Specification for the Resource $validate operation.

  • This release changes database indexing for string, uri, and reference SearchParameters. The database migration may take several minutes. These changes will be applied automatically on first startup. To avoid this delay on first startup, run the migration manually.

Bulk export behaviour is changing in this release such that Binary resources created as part of the response will now be created in the partition that the bulk export was requested rather than in the DEFAULT partition as was being done previously.

Bulk import behaviour is changing in this release such that data imported as part of the request will now create resources in the partition that the bulk import was requested rather than in the DEFAULT partition as was being done previously.

The default statistics depth for many tables has changed for Postgres. This improves the performance of many queries. Users of Postgres may wish to ANALYZE the HFJ_SPIDX_* indexing tables to see these improvements immediately.

analyze hfj_spidx_coords;
analyze hfj_spidx_date;
analyze hfj_spidx_number;
analyze hfj_spidx_quantity;
analyze hfj_spidx_quantity_nrml;
analyze hfj_spidx_string;
analyze hfj_spidx_token;
analyze hfj_spidx_uri;
analyze hfj_res_link;

1.1.29.3Changes

#4544

The HapiTransactionService (HAPI FHIR JPA Transaction Manager) has been improved and used in a number of new places (replacing the @Transactional annotation). This means that stack traces have much less transaction logic noise, and give a clear indication of transaction boundaries.

#4544

A new API has been added to the JPA server for storing resources which are actually placeholders for externally stored payloads. This API is not yet used for any published use cases but will be rolled out for future uses.

#4562

Added support for the $care-gaps operation defined by the DaVinci DEQM IG

#4566

When creating or modifying a SearchParameter in the JPA server, the local SearchParameter cache is now immediately flushed. This should help with situations such as tests where a SearchParameter is created and then used before the scheduled cache refresh typically occurs.

#4567

The IPackageInstallerSvc interface for managing NPM packages now exposes an uninstall method. Thanks to Jens Kristian Villadsen for the pull request!

#4724

Preliminary support for R5 and R4B SubscriptionTopic matching has been added. This is not yet complete, but the simplest use cases now work. Comments in the code with prefix 'WIP STR5' indicate areas that need to be extended.

#4632

Add support for MdmLink history in the data model. MdmLink history will be stored in the new mdm_link_aud table.

#4633

A new JPA feature called Uplifed Refchains has been added. This feature allows chained search expressions to be precalculated for much better performance when executing chained searches.

#4633

JPS server _sort expressions can now include a single chained search expression, such as a search for Encounter?_sort=patient.name.

#4651

Introduce configuration to enable the feature that stores the history of MdmLinks. Introduce the $mdm-link-history operation.

#4650

When performing a search using the Location:near search parameter, it is now possible to include this parameter in a _sort expression as well. This will result in locations being sorted by their proximity to the coordinates in the parameter value. Thanks to Jens Kristian Villadsen for the suggestion and algorithm design!

#4654

Add scaffolding for automated migration tests that use different database vendors.

#4654

Adds an Oracle embedded database to the automated migration test scaffolding. Also adds an initialization schema (version 5.1.0) with test data to the automated migration tests.

#4679

When executing FHIR transactions in the JPA server where the transaction contained large numbers of inline match URLs, the transaction processor will now prefetch the match URL targets in a single optimized batch. This avoids a potentially significant number of database round trips. In addition, the SQL query used for pre-resolving resource update targets in the transaction processor has been reworked to fully leverage available database indexes. This should result in significant performance improvements for certain large FHIR transactions.

#4695

Add an implementation of the Clinical Reasoning FHIR Repository to allow calling the available CR operations in hapi-fhir.

#4697

Added DSTU3 and R4 support for the DaVinci Documentation Templates and Rules (DTR) Questionnaire/$questionnaire-package operation. This operation allows a Questionnaire to be packaged as a Bundle with all the supporting resources that may be required for its use such as ValueSets and Libraries. This operation is used in context of prior authorization.

#4697

Added DSTU3 and R4 support for the FHIR Clinical Reasoning module operations ActivityDefinition/$apply and PlanDefinition/$apply. $apply allows for general workflow processing and is used in clinical decision support, prior authorization, quality reporting, and disease surveillance use cases.

#4697

Added R4 support for Questionnaire/$prepopulate, Questionnaire/$package and PlanDefinition/$package operations. These are operations are intended to support extended DaVinci DTR and SDC uses cases.

#4697

Added DSTU3 and R4 support for the DaVinci Structured Data Capture (SDC) operations Questionnaire/$populate operation and QuestionnaireResponse/$extract. These operations are used in data capture and exchange use cases, and are used by downstream specifications such as DaVinci Documentation Templates and Rules (DTR) for prior authorization.

#4699

Two new operations have been added to the JPA server: * Instance level $reindex performs a synchronous reindex of a single resource and returns a Parameters object containing all previous and new indexes * Instance level $reindex-dryrun simulates a reindex and shows the previous and new indexes generated

#4702

The ResponseHighlightingInterceptor (which renders a stylized HTML view of resources) will now include the resource narrative in the rendered view if one is present.

#4727

The FHIR R5 definitions have been upgraded to the final FHIR R5 release version.

#4735

It is now possible to perform a conditional create and a conditional patch on the same resource (i.e. the same conditional URL) within a FHIR Transaction bundle.

#4742

The JPA server in-memory resource matcher, which is used to improve the efficiency of subscription processing on eligible criteria, now has support for the _tag, _tag:not, _security, _security:not and _profile parameters.

#4742

The in-memory matcher used by the JPA server subscription processor has been optimized to reduce the number of FHIRPath expressions executed while processing in-memory matching.

#4758

The $reindex operation now supports several new optional parameters. 'optimizeStorage' can be used to migrate data to/from inline storage mode, and optimisticLock can be used to control whether to guard against concurrent data modification during reindexing. reindexSearchParameters can be used to contron whether search parameters are reindexed.

#4758

The JPA server REST-HOOK subscription delivery client had a hardcoded connection pool limit of 20 outgoing connections. This has been increased to 1000, since subscriptions themselves and their delivery channels already act as a rate-limiting step.

#4758

An unexpected failure to reindex a single resource during a reindex job will no longer cause the entire job to fail.

#4772

A new optional parameter called _typePostFetchFilterUrl has been added to the Bulk Export $export operation parameters. This parameter allows filters to be specified that will be applied in-memory to the resources after they have been initially fetched by the database. This can be used to allow complex filters which only remove small numbers of resources to be efficiently applied against large datasets.

#4773

Added mdm setting allowing for resources to be matched regardless of partition, also added mdm setting for the storage of all golden resources in a single designated partition

#4774

A new Pointcut called STORAGE_BINARY_ASSIGN_BLOB_ID_PREFIX has been added. This pointcut is called when a binary blob is about to be stored, and allows implementers to attach a prefix to the blob ID before it is stored.

#4774

Bulk Export now supports a new _exportId parameter. If provided, any Binary resources generated by this export will have an extension in their binary.meta field which identifies this export. This can be used to correlate exported resources with the export job that generated them. In addition, the binary.meta field of Bulk Export-generated binaries will also contain the job ID of the export job that generated them, as well as the resource type of the data contained within the binary.

#4821

Update the clinical reasoning module version to the latest release of 3.0.0-PRE2

#4861

Add documentation for $care-gaps operation

#4545

The InterceptorService now maintains an EnumSet of all registered interceptor Pointcuts, which should improve performance when testing for the existence of specific pointcuts.

#4569

A race condition in the Bulk Export module sometimes resulted in bulk export jobs producing completion reports that did not contain all generated output files. This has been corrected.

#4569

An inefficient query in the JPA Bulk Export module was optimized. This query caused exports for resources containing tags/security labels/profiles to perform a number of redundant database lookups, so this type of export should be much faster now.

#4622

The batch system now reads less data during the maintenance pass. This avoids slowdowns on large systems.

#4629

String and URI indexing has been improved in some multi-clause queries.

#4712

Postgres indexing settings have changed. Autovacuum will run more frequently, and hashed columns will track more most-frequent items.

#4716

The SQL query used to fetch pages of search results resulted in an inefficient use of the database in cases where resources have many different versions stored. Thanks to Primož Delopst for the pull request!

#4742

The SQL generated for the JPA server $trigger-subscription operation has been optimized in order to drastically reduce the number of database round trips for large triggering jobs. In addition, a bug prevented the subscription retriggering from fully executing in a multithreaded way. This has been corrected.

#4758

When performing FHIR resource searches, the resource ID fetch size has been reduced. This should improve the memory impact of performing searches which return very large numbers of resources.

#4763

The SQL column type used for inline resource storage mode in the JPA server has been changed in order to avoid abitrary database size limits. We now use text on PostgreSQL, long on Oracle, and varchar(MAX) on MSSQL. Previously varchar(4000) was used in all cases, requiring manual resizing in order to support longer values.

#4769

Chained and reverse-chained searches will be faster in some scenarios. All required columns are now included in the IDX_RL_TGT_v2 index.

#4915

Includes by canonical url now use an indexed query, and are much faster.

#4920

The $expunge operation has been slightly optimized and should issue fewer SQL statements to the database.

#4545

The settings beans for the JPA server have been renamed to better reflect their purpose. Specifically the ModelConfig bean has been renamed to StorageSettings and the DaoConfig bean has been renamed to JpaStorageSettings.

#4603

Transaction retry will now also apply to ObjectOptimisticLockingFailureException. This enables retry of $reindex work chunks when they collide with a DELETE operation.

#4610

Bulk export operations have been enhanced to be fully partition aware.

#4618

A new interface has been created for SearchParamWithInlineReferencesExtractor with a base implementation. This allows us to encapsulate logic for resolving and replacing inline resources to the same place is also cuts down on code duplication and allow for easier sharing of the same logic

#4621

Batch2 work-chunk processing now aligns transaction boundaries with event transitions.

#4662

The Resource $validate operation no longer returns Precondition Failed 412 when a resource fails validation. It now returns 200 irrespective of the validation outcome as required by the FHIR Spec for the Resource $validate operation.

#4685

When calling $everything on a Patient instance, the jpa server no longer traverses into other patients. Previously it was possible to pull in data from another patient for example, via a Provenance resource.

#4691

When calling $everything on a Patient instance, the jpa server no longer traverses into other patients. Previously it was possible to pull in data from another patient for example, via Provenance and Composition resources.

#4693

Bulk import operations have been enhanced to be fully partition aware.

#4710

Removed maven configuration hack for IntelliJ now that Jetbrains supports different java versions in test and main (IDEA-85478).

#4748

Previously, HAPI-FHIR converted R5 Subscriptions into R4 Subscriptions and triggered those subscriptions by resource changes in the same way R4 subscriptions are triggered. Now R5 Subscriptions are triggered based on the topic they subscribe to and the resource matching happens via the SubscriptionTopic resource. This also means that R5 Subscription endpoints are now delivered a subscription-notification Bundle as opposed to the resource as is the case with R4 Subscriptions.

#3231

Previously, conditional updates always followed the STU3 specifications. Now, conditional updates in an R4 server follow the R4 specifications.

#4204

With default configuration, Resource meta.tag properties: userSelected and version, were not stored in the database. This is now fixed.

#4736

When enabling both auto_create_placeholder_reference_targets and allow_inline_match_url_references, POSTing a bundle with a conditional create URL will fail with HAPI-0507. This has now been fixed.

#4483

The OverridePathBasedReferentialIntegrityForDeletesInterceptor now works on partitioned servers. Thanks to GitHub user @JorisHeadease for the pull request!

#4509

References to the patient/subject in IPS documents generated using the $summary operation were not replaced with the bundle-local UUID assigned to the patient. Also, some dangling references were left in the generated bundle. This has been corrected.

#4551

The HapifhirDal search method required use of TypedBundleProvider.getallresources to avoid null pointer issue on searches that are greater than the default querycount

#4565

The JPA server Patient:address SearchParameter did not index values in the element Address.district. This has been corrected.

#4575

Previously, the full set of meta tags is not present in the payload of the subscription message when UPDATE the resource. Now, this issue has been fixed.

#4580

Fix the BaseTransactionProcessor.UNQUALIFIED_MATCH_URL_START REGEX so that it correctly matches patterns that contain dashes in them.

#4582

Update IBaseCoding, Tag, and tinder Child to support new userSelected and version fields for resource tags.

#4582

Upgrade dependency on core to 5.6.97 including hapi-fhir code enhancements and unit test fixes.

#4548

Simultaneous DELETE and $reindex operations could corrupt the search index. This has been fixed.

#4597

Simultaneous conditional create or create-on-update operations no longer create duplicate matching resources.

#4601

The InteractionBlockingInterceptor did not have support for the interactions 'search' and 'history' despite them being declared in the code system. This has been fixed.

#4613

Previously, SPECIAL search parameters that were not nearness parameters, such as simple string Search Parameters, could not be used in chained queries. This has been resolved, and now queries like OrganizationAffiliation?location.some-special-param=abc will work as intended.

#4617

Previously, Quartz jobs were scheduled after the scheduler was started which resulted in a race condition where duplicate TRIGGER_ACCESS entries were being added to the QRTZ_LOCKS table. This has been fixed.

#4630

Default values are provided for the new UPDATE_TIME columns so batch jobs started before an upgrade can complete.

#4639

When executing FHIR transactions in the JPA server with automatic retry enabled, if automatic placeholder-reference creation is enabled the system could sometimes fail to automatically retry. This has been corrected.

#4643

There was a transaction boundary issue in the Batch2 storage layer which resulted in the framework needing more open database connections than necessary. This has been corrected.

#4644

The %now value for date search parameters did not properly set the time zone of the time being compared to. This has been corrected.

#4647

Batch job state transitions are are now transitionally safe.

#4650

When processing the Location:near Search Parameter, if a distance unit was supplied in the parameter value it was ignored and the distance was always assumed to be km. This has been corrected.

#4657

Fixing inconsistency between the method behavior and naming.

#4663

Removing previous bundle provider to allow for iterableBundle provider, which will allow for paging resources instead of full consumption of patient resources at once

#4670

Previously, the $export response Content-Location header would not use a fixed base URL. Now, the URLs that are returned will respect the Fixed Value for Endpoint Base URL.

#4671

Previously, searching with the '_source' parameter would return matching source for all resource types. This has been corrected.

#4675

Previously, when a _has query was performed with a non-existent reference field, the query succeed with empty results in H2 and failed with a 500 Server Error in Postgres. Now all database vendors will throw an InvalidRequestException if a non-existent reference field is provided for a _has query.

#4680

Previously, invoking $mdm-link-history on only the golden resource ID or source ID would fail due to faulty validation. This has been corrected.

#4699

When updating resource fields targeted by a Combo Non-Unique SearchParameter, previous indexes were not deleted meaning that old search values could still find the resource. This has been corrected.

#4699

The BundleBuilder utility class did not work with DSTU2 bundles. This has been corrected.

#4700

When querying $mdm-link-history with no inputs, the error message is mislaeading. Also, $mdm-link-history cannot handle comma-delimited inputs. Both issues are now fixed.

#4721

Previously, clicking the '$diff' button on FHIRweb module would direct the user to an empty page. Now it displays the correct page.

#4725

Make small changes to stabilize the clinical reasoning code base.

#4729

When there is an EID MDM MATCH, the MATCH link has no score. This issue has been fixed.

#4734

Fixed a regression introduced by 4624 that prevented subscriptions from loading into the in-memory subscription cache on system startup.

#4738

Processing multiple transaction bundles with similar entries on different threads would lead to Constraint Violations if the entries contained similar unique values. This is an error that can be fixed with Retry Handlers now.

#4745

Fixed an issue where a golden resource could not be chosen as no-match when another golden resource was already chosen as a match.

#4746

Previously, the Lenient error handler will accept invalid extension containing value and nested extensions by default. This will lead to errors when client further attempt to read, update or delete the resources. Now, this has been fixed and a DataFormatException will be thrown instead.

#4750

Previously, an mdm-submit operation with Prefer: response-async header resulted in a NullPointerException in the error logs and a batch job status of FAILED. This has been fixed.

#4757

Previously, if a binary resource was read via GET, and the binary content had been externalized and not reinflated, a NullPointerException would be thrown. This has been fixed.

#4766

Previously, performing $mdm-clear would soft delete Golden Record resources and keep them in the database. Now, $mdm-clear will expunge the resources from the database.

#4782

Previously, a FHIRPath patch delete operation where the path resolved to an element in a collection, the element was not always being removed from the collection. This has been fixed.

#4786

With default configuration, Resource meta.tag properties: userSelected and version, were not stored in the database. This is now fixed.

#4789

Previously, there was the possibility for a race condition to happen in the initialization of the email subscription processing component that would result in email not being sent out. This issue has been fixed.

#4804

Improved performance of mdm-clear operation by adding index and avoiding redundant deletion.

#4814

A recent regression prevented the SQL Migrator from running on Oracle. This has been corrected.

#4812

The tag being added on golden resources does not have a version, might as well add one.

#4819

Tags no longer provide a default false value for userSelected.

#4844

/Patient/{patientid}/$everything?_type={resource types} would omit resources that were not directly related to the Patient resource (even if those resources were specified in the _type list). This was in conflict with /Patient/{patientid}/$everything operation, which did return said resources. This has been fixed so both return all related resources, even if those resources are not directly related to the Patient resource.

#4846

Job maintenance service would throw an exception if a job definition is unknown, this would run maintenance on every job instance after it. Now the maintenance will skip over unknown job definitions and display a warning log message indication a job definition is missing.

#4853

Previously, when validating resources that contain a display in a Coding/CodeableConcept different from the display defined in the CodeSystem that is used, no errors are returned in the outcome. This is now fixed.

#4860

Running an $export that completes successfully results in a progress percentage of less than 100%. This has now been fixed.

#4863

Previously the SearchParameterCanonicalizer did not correctly convert DSTU2 and DSTU3 custom resources SearchParameters into RuntimeSearchParam. This is now fixed.

#4872

POSTing a Bundle with over 100 references to the same resource will fail with HAPI-2207 'Multiple resources match'. This has been fixed.

#4873

Previously, if the fhirId in ResourceTable happened to be set to an empty string, the resourceId would be missing when trying to generate the full ID string. This has now been fixed.

#4875

Previously, $binary-access-write operation didn't trigger STORAGE_BINARY_ASSIGN_BLOB_ID_PREFIX Pointcut. This has been fixed.

#4886

Requests to start an $export of Patient or Group will now fail with 404 ResourceNotFound when the target resources do not exist. Before, the system would start a bulk export background job which would then fail.

#4891

Initiating a bulk export with a _type filter would sometimes return resource types not specified in the filter. This has been fixed.

#4893

Update the IRuleBuilder to support Patient Export rules via the new patientExportOnPatient method on the IRuleBuilder. Previously, it was accidentally using Group Export rules.

#4910

Remove some references to all_constraints table in oracle database migration tasks which were causing errors for version 19c.

#4545

The InterceptorService no longer supports ThreadLocal interceptor registrations. This feature was deprecated in 6.2.0 due to lack of use and has never been enabled by default. Please let us know on the mailing list if this affects you.

#4727

The HAPI FHIR CLI run-server command has been removed. This command was used to launch a HAPI FHIR JPA Server instance. The hapi-fhir-jpaserver-starter project has long since duplicated and improved on the CLI version of the launcher, and maintaining both was been a maintenance burden. Users of the CLI command are recommended to migrate to the starter project.

1.1.30HAPI FHIR 6.4.6 (Wizard)

 

1.1.30.1Release Information

Released: 2023-06-28

Codename: (Wizard)

1.1.30.2Upgrade Instructions

1.1.30.3Changes

#5008

Previously, the GenericClient would only support the HTTP GET method for paging requests. This has been corrected by adding the possibility for paging with an HTTP POST.

1.1.31HAPI FHIR 6.4.5 (Wizard)

 

1.1.31.1Release Information

Released: 2023-03-15

Codename: (Wizard)

1.1.31.2Upgrade Instructions

This release fixes an accidental behaviour that was introduced in 6.4.2. From that version up until now, if a Tag Definition was created with a null userSelected element, it would still be stored as false instead of null. This release fixes that behaviour, and now correctly stores the value as null if it is not specified. If you do not use this field, no action needs to be taken. However, if you do use this field, the userSelected elements stored from the installation of version 2023.02.R02 up until now are potentially suspect. The following SQL can be executed to clear the false value from this table and replace it with null, if desired:

update HFJ_TAG_DEF  set TAG_USER_SELECTED = null where TAG_USER_SELECTED = 'false'

This will wholesale replace all userSelected fields.

1.1.31.3Changes

#4652

Fix for MSSQL migration failure related to Job instance UPDATE_TIME column default value not being set correctly

#4813

Under heavy concurrency, a bug resulted in identical tag definitions being rejected with a NonUniqueResultException some of the time. This has been corrected.

1.1.32HAPI FHIR 6.4.4 (Wizard)

 

1.1.32.1Release Information

Released: 2023-03-15

Codename: (Wizard)

1.1.32.2Upgrade Instructions

1.1.32.3Changes

#4597

Simultaneous conditional create or create-on-update operations no longer create duplicate matching resources.

#4652

Fix for MSSQL migration failure related to Job instance UPDATE_TIME column default value not being set correctly

1.1.33HAPI FHIR 6.4.3 (Wizard)

 

1.1.33.1Release Information

Released: 2023-03-08

Codename: (Wizard)

1.1.33.2Upgrade Instructions

The known issue with Bulk Export in HAPI 6.4.0 has been resolved. Bulk export functionality is now more performant at large scale, and does not generate occasional incomplete file reports.

1.1.33.3Changes

#4622

The batch system now reads less data during the maintenance pass. This avoids slowdowns on large systems.

#4324

Fix issue where end time is missing for bulk exports on completion

#4630

Default values are provided for the new UPDATE_TIME columns so batch jobs started before an upgrade can complete.

#4636

Fixed Oracle syntax problem with the fix that was previously provided via Pull Request 4630.

1.1.34HAPI FHIR 6.4.2 (Wizard)

 

1.1.34.1Release Information

Released: 2023-02-27

Codename: (Wizard)

1.1.34.2Upgrade Instructions

The known issue with Bulk Export in HAPI 6.4.0 has been resolved. Bulk export functionality is now more performant at large scale, and does not generate occasional incomplete file reports.

1.1.34.3Changes

#4204

With default configuration, Resource meta.tag properties: userSelected and version, were not stored in the database. This is now fixed.

#4548

Simultaneous DELETE and $reindex operations could corrupt the search index. This has been fixed.

1.1.35HAPI FHIR 6.4.1 (Vishwa)

 

1.1.35.1Release Information

Released: 2023-02-24

Codename: (Vishwa)

1.1.35.2Upgrade Instructions

This release bumps the org.hl7.fhir core dependency up to 5.6.97, and modifies IBaseCoding

1.1.35.3Changes

#4569

A race condition in the Bulk Export module sometimes resulted in bulk export jobs producing completion reports that did not contain all generated output files. This has been corrected.

#4569

An inefficient query in the JPA Bulk Export module was optimized. This query caused exports for resources containing tags/security labels/profiles to perform a number of redundant database lookups, so this type of export should be much faster now.

#4551

The HapifhirDal search method required use of TypedBundleProvider.getallresources to avoid null pointer issue on searches that are greater than the default querycount

#4582

Update IBaseCoding, Tag, and tinder Child to support new userSelected and version fields for resource tags.

#4582

Upgrade dependency on core to 5.6.97 including hapi-fhir code enhancements and unit test fixes.

1.1.36HAPI FHIR 6.2.5 (Vishwa)

 

1.1.36.1Release Information

Released: 2023-01-09

Codename: (Vishwa)

1.1.36.2Upgrade Instructions

This release fixes a problem with the batch framework which could cause jobs to hang indefinitely if multiple processes attempted to run a maintenance pass simultaneously.

1.1.36.3Changes

#4065

A new DaoConfig configuration setting has been added called JobFastTrackingEnabled, default false. If this setting is enabled, then gated batch jobs that produce only one chunk will immediately trigger a batch maintenance job. This may be useful for testing, but is not recommended for production use. Prior to this change, fasttracking was always enabled which meant if the server was not busy, small batch jobs would be processed quickly. However this lead do instability on high-volume servers, so this feature is now disabled by default.

#4400

When Batch2 work notifications are received twice (e.g. because the notification engine double delivered) an unrecoverable failure could occur. This has been corrected.

#4417

Fixed a bug with batch2 which could cause previously completed chunks to be set back to in-progress. This could cause a batch job to never complete. Now, a safeguard to ensure a job can never return to in-progress once it has completed or failed.

#4422

When a Bulk Export job runs with a large amount of data, there is a chance the reduction step can be kicked off multiple times, resulting in data loss in the final report. Jobs will now be set to in-progress before processing to prevent multiple reduction steps from being started.

1.1.37HAPI FHIR 6.2.4 (Vishwa)

 

1.1.37.1Release Information

Released: 2023-01-04

Codename: (Vishwa)

1.1.37.2Upgrade Instructions

1.1.37.3Changes

#4388

Fixed an edge case during a Read operation where hooks could be invoked with a null resource. This could cause a NullPointerException in some cases.

1.1.38HAPI FHIR 6.2.3 (Vishwa)

 

1.1.38.1Release Information

Released: 2023-01-05

Codename: (Vishwa)

1.1.38.2Upgrade Instructions

1.1.38.3Changes

The $mdm-clear operation sometimes failed with a constraint error when running in a heavily multithreaded environment. This has been fixed.

1.1.39HAPI FHIR 6.10.5 (Prerelease)

 

1.1.39.1Release Information

Note: This version of HAPI FHIR is a SNAPSHOT (prerelease), meaning that it has not yet been released, but all changes and fixes listed here are available to try out as Snapshot Builds.

1.1.39.2Changes

#5589

When encoding resources using the RDF parser, placeholder IDs (i.e. resource IDs starting with urn:) were not omitted as they are in the XML and JSON parsers. This has been corrected.

#5589

When encoding a Bundle, if resources in bundle entries had a value in Bundle.entry.fullUrl but no value in Bundle.entry.resource.id, the parser sometimes incorrectly moved these resources to be contained within other resources when serializing the bundle. This has been corrected.

#5623

Previously, searches that used more than one chained Bundle SearchParameter (i.e. Composition) were only adding one condition to the underlying SQL query which resulted in incorrect search results. This has been fixed.

1.1.40HAPI FHIR 6.10.4 (Zed)

 

1.1.40.1Release Information

Released: 2024-01-31

Codename: (Zed)

1.1.40.2Upgrade Instructions

1.1.40.3Changes

#5621

Fixed a deadlock in resource conditional create.

1.1.41HAPI FHIR 6.10.3 (Zed)

 

1.1.41.1Release Information

Released: 2024-01-17

Codename: (Zed)

1.1.41.2Upgrade Instructions

1.1.41.3Changes

#5563

Previously, certain mdm configuration could lead to duplicate eid identifier entries in golden resources. This has been corrected

1.1.42HAPI FHIR 6.10.2 (Zed)

 

1.1.42.1Release Information

Released: 2023-12-22

Codename: (Zed)

1.1.42.2Upgrade Instructions

Major Database Change

This release fixes a migration from 6.10.1 that was ineffective for SQL Server (MSSQL) instances. This may take several minutes on a larger system (e.g. 10 minutes for 100 million resources). For zero-downtime, or for larger systems, we recommend you upgrade the schema using the CLI tools.

1.1.42.3Changes

1.1.43HAPI FHIR 6.10.1 (Zed)

 

1.1.43.1Release Information

Released: 2023-12-18

Codename: (Zed)

1.1.43.2Upgrade Instructions

Major Database Change

This release contains a migration that covers every resource. This may take several minutes on a larger system (e.g. 10 minutes for 100 million resources). For zero-downtime, or for larger systems, we recommend you upgrade the schema using the CLI tools.

1.1.43.3Changes

#5486

Previously, testing database migration with cli migrate-database command in dry-run mode would insert in the migration task table. The issue has been fixed.

#5511

Previously, when creating an index as a part of a migration, if the index already existed with a different name on Oracle, the migration would fail. This has been fixed so that the create index migration task now recovers with a warning message if the index already exists with a different name.

#5546

A database migration added trailing spaces to server-assigned resource ids. This fix removes the bad migration, and adds another migration to fix the errors.

1.1.44HAPI FHIR 6.10.0 (Zed)

 

1.1.44.1Release Information

Released: 2023-11-18

Codename: (Zed)

1.1.44.2Upgrade Instructions

Major Database Change

This release makes performance changes to the database definition in a way that is incompatible with releases before 6.4. Attempting to run version 6.2 or older simultaneously with this release may experience errors when saving new resources.

Change Tracking and Subscriptions

This release introduces significant a change to the mechanism performing submission of resource modification events to the message broker. Previously, an event would be submitted as part of the synchronous transaction modifying a resource. Synchronous submission yielded responsive publishing with the caveat that events would be dropped upon submission failure.

We have replaced the synchronous mechanism with a two stage process. Events are initially stored in database upon completion of the transaction and subsequently submitted to the broker by a scheduled task. This new asynchronous submission mechanism will introduce a slight delay in event publishing. It is our view that such delay is largely compensated by the capability to retry submission upon failure which will eliminate event losses.

Tag, Security Label, and Profile changes

There are some potentially breaking changes:

  • On resource retrieval and before storage, tags, security label and profile collections in resource meta will be sorted in lexicographical order. The order of the elements for Coding types (i.e. tags and security labels) is defined by the (security, code) pair of each element. This normally should not break any clients because these properties are sets according to the FHIR specification, and hence the order of the elements in these collections should not matter. Also with this change the following side effects can be observed:
    • If using INLINE tag storage mode, the first update request to a resource which has tags, security labels or profiles could create a superfluous resource version if the update request does not really introduce any change to the resource. This is because the persisted tags, security labels, and profile may not be sorted in lexicographical order, and this would be interpreted as a new resource version since the tags would be sorted before storage after this change. If the update request actually changes the resource, there is no concern here. Also, subsequent updates will not create an additional version because of ordering of the meta properties anymore.
    • These meta collections are sorted in place by the storage layer before persisting the resource, so any piece of code that is calling storage layer directly should not be passing in unmodifiable collections, as it would result in an error.

1.1.44.3Changes

The version of a few dependencies have been bumped to the latest versions (dependent HAPI modules listed in brackets):

  • MSSQL JDBC (JPA): 9.4.1.jre8 -> 12.2.0.jre11
  • Flexmark (All): 0.50.40 -> 0.64.8
  • Logback (All): 1.4.4 -> 1.4.7
  • H2 Database (JPA): 2.1.214 -> 2.2.220
  • Thymeleaf (Testpage Overlay): 3.0.14.RELEASE -> 3.1.2.RELEASE
  • xpp3 (All): 1.1.4c.0 -> 1.1.6
  • HtmlUnit (All): 2.67.0 -> 2.70.0
  • org.hl7.fhir.core (All): 6.0.22.2 -> 6.1.2.2

#5089

Updating storage-cr module to latest CQL 3.0.0, latest cql engine improvements, and Clinical Reasoning operations to leverage repository api pattern. This will remove several dependencies from within hapi-fhir to make future maintenance simpler and performance more robust.

#5090

Adding pointcuts for the following MDM Operations: MDM_CREATE_LINK, MDM_UPDATE_LINK, MDM_MERGE_GOLDEN_RESOURCES, MDM_LINK_HISTORY, MDM_NOT_DUPLICATE, MDM_CLEAR, MDM_SUBMIT.

#5129

Added a field that shows the total number of POSSIBLE_DUPLICATE links has been added to the $mdm-duplicate-golden-resources operation response.

#5141

Previously, updating an existing resource (resource A) to match a resource that it didn't match to before (resource B) would update only the already existing links on resource A. This behaviour has been changed. Now such an update will also add additional links, if necessary, from resource A to resource B, including adding a POSSIBLE_DUPLICATE between golden resource A and golden resource B.

#5235

Changes have been made to allow searching on multiple patient _ids when in a patient_id partitioned environment.

#5236

Previously, when updating an MDM link to NO_MATCH, the golden resource involved would maintain its previous values, as defined by survivorship service. This would result in out-of-date golden resources with data that might not be accurate anymore. Now, when a link is changed to NO_MATCH, golden resources will be rebuilt from the ground up using the MDM survivorship service, and the set of links/source resources available at the time of update.

#5238

Added an implementation of Clinical Reasoning CDS on FHIR to the CDS Hooks module that allows PlanDefinition worfklows to be processed as CDS Services using the $apply operation.

#5246

Combined the ExpandResources step and WriteBinary step in the new WriteBinary step v2 for bulk exports.

#5271

The error messages returned in an OperationOutcome when validating terminology codes as a part of resource profile validation have been improved. Machine processable location (line/col) information is now available through a pair of dedicated extensions, and error messages such as UCUM parsing issues are now returned to the client (previously they were swallowed and a generic error message was returned).

#5274

Added a service for generating metrics on mdm links and resources. This includes JPA queries and updated indices.

#5275

Added an API that allows to configure permission rules for operations with access to all resources. This permission is needed to allow a search across the entire patient's record in the scope of the $everything operation to access all resources that references input Patient, including resources outside of the patient's compartment.

#5290

Added storage property to prevent conditional updates from invalidating match criteria.

#5300

A new configuration option has been added to StorageSettings which enables support in the JPA server for the _language SearchParameter.

#5306

A new option has been added to the JPA server JpaStorageOptions which prevents the server from maintaining a version history. In this mode, when a new version of a resource is added, the previous version is automatically expunged.

#5321

It is now possible to configure the strictness of concept display name validation using a new flag on the InMemoryTerminologyServerValidationSupport (for non-JPA validation) and JpaStorageSettings (for JPA validation). In addition, the error messages emitted by the validator when a concept display doesn't match have been improved to be much more useful.

#5341

Added registries for CdsCrServices and CrDiscoveryServices in CDS Hooks to allow registration of custom services.

#5355

The generated OpenAPI documentation produced by OpenApiInterceptor will now include additional details in the individual resource type documentation, including the values of CapabilityStatement.rest.resource.documentation, CapabilityStatement.rest.resource.profile, and CapabilityStatement.rest.resource.supportedProfile.

#5366

The package installer overrides existing (built-in) SearchParameter with multiple base resources. This is happening when installing US Core package for Practitioner.given as an example. This change allows the existing SearchParameter to continue to exist with the remaining base resources.

#5375

Add settings for CDS Services using CDS on FHIR. Also removed the dependency on Spring Boot from the CR configs used by CDS Hooks.

#5407

Previously, when the payload of a subscription message exceeds the broker maximum message size, exception would be thrown and retry will be performed indefinitely until the maximum message size is adjusted. Now, the message will be successfully delivered for rest-hook and email subscriptions, while message subscriptions remains the same behavior as before.

#5428

Add support for non-standard _pid SearchParameter to the the JPA engine. This new SP provides an efficient tie-breaking sort key.

#5215

When executing an HFQL search with a FHIRPath filter on the id element, this will now be automatically converted into an _id search parameter match for better performance.

#5377

Subscription triggering via the $trigger-subscription operation is now multi-threaded, which significantly improves performance for large data sets.

#5387

Enable the search cache for some requests even when a consent interceptor is active. If no consent service uses canSeeResource (i.e. shouldProcessCanSeeResource() returns false); or startOperation() returns AUTHORIZED; then the search cache is enabled.

#5395

The background activity that clears stale search results now has higher throughput. Busy servers should no longer accumulate dead stale search results.

#5405

Sorting by _id now uses the FHIR_ID column on HFJ_RESOURCE and avoid joins.

#4803

Internal client-assigned ids are now resolved within the HFJ_RESOURCE table, avoiding a join to HFJ_FORCED_ID

#4834

Several enhancements were made to the IPS generator:

  • Generated IPS documents will no longer include sections that contain no contents.
  • NarrativeLink extensions now use the correct datatype (url instead of uri)
  • Section profile URLs have been updated to no longer use an unknown URL
  • Some resources added to the generated IPS did not have their FHIR server IDs replaced with a placeholder UUID.
  • Immunization manufacturer was not fetched from the server
Thanks to Rio Bennin for all of the feedback!

#5229

Previously, when using INLINE tag storage mode, a superfluous version of a resource would be created as a result of an update request which didn't have a real logical change to the resource but only changed the order of existing items in tag, security label or profile collections. This change prevents this behaviour. Also on resource retrieval, these meta collections are sorted alphabetically, based on (security, code) pair for tags and security labels.

#5262

Previously, when both resourceId and goldenResourceId are provided to the mdm link history operation, they will be treated as an OR. This is now changed to AND in order to comply with REST conventions.

#5371

Remote terminology operations that fetch ValueSets or CodeSystems now force _summary=false to allow local validation.

#3786

Previously, when executing an update on a resource that had to undergo MDM, a nullpointer could occur. This has been fixed.

#5176

Previously, the use of search parameter _lastUpdated as part of a reverse chaining search would return an error message to the client. This issue has been fixed

#5192

Fixed a bug where search Bundles with include entries from an _include query parameter might trigger a 'next' link to blank pages. Specifically, if _include'd resources + requested resources were greater than (or equal to) requested page size, a 'next' link would be generated, even though no additional resources are available.

#5196

Previously, type-level expunge was allowed even if expunge operation was turned off. This is now fixed.

#5198

Resolved an issue with type-everything search operations (eg, /Patient/$everything), where not all page results were being returned if _count was specified to be the same value as the maximum page size to fetch.

#5212

Previously, when a CDS hook was registered and called with a empty context, the server returned a 500. This behaviour has been fixed.

#5219

Reindex batch job threw an exception when no results matched the reindex request. This has been corrected.

#5220

Fixed a race condition in RestfulClientFactory that could cause validateInitialized() to deadlock. Fixed a race condition in FhirContext initialization that could produce a 'this.myNameToResourceType is null' NPE. Fixed a shutdown hook memory leak in BaseApp that happened when the command threw an exception; this memory leak only affects code that calls App.main repeatedly which is probably only in test code.

#5230

batch2 jobs on MS SQL Server were failing to transition to FAILED state after max retrials for the job are exhausted. This is now fixed.

#5231

Previously, the $mdm-link-history operation would result in a 404 response when it was executed after a $mdm-clear. This has now been fixed by removing link history on $mdm-clear.

#5242

Previously, $mdm-clear failed to expunge REDIRECTED golden resources which left them as orphans. This is now fixed.

#5254

Previously, when bulk export is enabled the resource list would be generated and would not be able to add a custom resource to that list. Now once a custom resource is added the list is rebuilt.

#5256

Added RequestDetails as part of the parameters when cleaning up possible matches to enable interceptors to access it.

Previously, executing a Group Bulk Export without defining the _type parameter would accidentally omit Patient and Organization types. This has been corrected.

#5268

Previously, the response status code set in a MethodOutcome of a Resource provider was not respected. This has been fixed.

#5275

Previously, when calling $everything operation on a Patient instance, it was possible to retrieve data related to another patient via a List or Group resources. This has been fixed.

#5276

Previously, GraphQL queries will error when using base resource search parameters such as '_id' after search parameter rebuild. This has been fixed.

#5295

A regression in the HAPI FHIR 6.6.0 JPA server meant that absolute resource references which also contained an identifier were rejected even if the server was configured to allow absolute references. This has been corrected.

#5297

Several fixes have been made to the IPS generator:

  • The display names associated with several sections have been corrected to exactly match the LOINC definitions for their codes
  • Immunizations will now be ordered from most recent to least recent
  • IPS documents containing Consent resources for Advanced Directives could result in a crash
  • IPS documents containing Procedure resources for History of Procedures with a performed date could result in a crash
  • IPS documents containing AllergyIntolerance resources containing an occurrence but not a reaction date could result in a crash
  • IPS documents containing AllergyIntolerance resources containing an onset value in string format could result in a crash
  • IPS documents containing MedicationRequest resources with no associated Medication could result in a crash

#5298

Under some circumstances, a large $everything operation could enter an infinite loop and eventually timeout with a failure. This has been corrected.

#5300

A bug in DefaultProfileValidationSupport in R5 mode caused it to return duplicates in the lists returned by fetchAllStructureDefinitions(), fetchAllSearchParameters(), etc. This has been corrected.

#5307

Some search parameters include parenthetical expressions (e.g. (MedicationRequest.medication as Reference)). The leading ( was causing searches using parenthetical expressions to fail where the reference target was a contained resource. This has been corrected.

#5310

Update DSTU2 tags and security labels with support for userSelected and version elements. Also fix them on security labels in JPA storage.

#5312

Previously, issuing a reindex operation for resources on a specific partition would fail. This problem has been fixed.

#5316

Previously, performing a FHIR transaction containing both a conditional delete and a conditional update on the same resource would fail. This has been fixed.

#5322

Update DSTU3 validation resources to FHIR 3.0.2 instead of 3.0.1

#5330

Previously, the capability statement returned by the server would not declare conformance to IG when a bulk data export provider is registered with the server. This issue has been fixed.

#5331

Previously, the score field returned by $mdm-query-links operation would contain imprecise decimal values. This is now fixed and rounded to 4 decimal places.

#5333

A regression was introduced in 2023.08.R01 which caused binary storage prefixes to not be applied to exported binary blobs. This has been fixed.

#5336

Previously, on PostgreSQL, the $mdm-link-history operation would fail if all ids provided to a parameter are unknown, and the error will persist for all subsequent requests. This is now fixed.

#5339

Previously, Bulk Export will error when processing a resource if the patient compartment SearchParameter of that resource is not present. This has been fixed, the new behaviour is to ignore such resources.

#5344

Previously, issuing an expunge operation for resources on a specific partition would fail. This problem has been fixed.

#5349

Removed duplicate helperSvc bean in JpaConfig (also defined in imported MdmJpaConfig) to resolve BeanDefinitionOverrideException

#5353

Previously, when using revincludes and includes with iterate, while also using revincludes without iterate, the result omitted some resources that should have been included. This issue has now been fixed.

#5356

Clinical reasoning bug that did not invalidate resources in repository api global caches for terminology and libraries when updates/deletes were made.

#5388

Previously, with partitioning enabled and UrlBaseTenantIdentificationStrategy used, registering SearchNarrowingInterceptor would cause to incorrect resolution of entry.request.url parameter during transaction bundle processing. This has been fixed.

#5404

Cql translating bug where FHIRHelpers library function was erroring and blocking clinical reasoning content functionality

#5412

Previously, with Partitioning enabled, submitting a bundle request would return a response with the partition name displayed twice in response.link property. This has been fixed.

#5415

Previously, $mdm-clear jobs would fail on MSSQL. This is now fixed.

#5419

Previously, when AllowAutoInflateBinaries was enabled in JpaStorageSettings and bundles with multiple resources were submitted, binaries were created on the disk only for the first resource entry of the bundle. This has been fixed.

#5431

Previously, using VersionCanonicalizer to convert a CapabilityStatement from R5 to DSTU2 would fail. This is now fixed.

1.1.45HAPI FHIR 5.5.0 (Prerelease)

 

1.1.45.1Release Information

Note: This version of HAPI FHIR is a SNAPSHOT (prerelease), meaning that it has not yet been released, but all changes and fixes listed here are available to try out as Snapshot Builds.

1.1.45.2Changes

The version of a few dependencies have been bumped to the latest versions (dependent HAPI modules listed in brackets):

  • Spring (JPA): 5.3.6 -> 5.3.7
  • Spring Boot (JPA Starter): 2.4.4 -> 2.5.0
  • Jetty (CLI): 9.4.39.v20210325 -> 9.4.42.v20210604

#2509

Pagination returned incorrect offset and count in the previous link of the last page when total element count was one more than multiple of page size. Problem is now fixed

#2652

Settings have been added to the JPA Server DaoConfig to enable/disable various individual kinds of scheduled tasks.

#2653

When performing a conditional create operation on a JPA server, the system will now verify that the conditional URL actually matches the data supplied in the resource body, and aborts the conditional create if it does not.

#2672

Support has been added to the JPA server for _include and _revinclude where the value is a qualified star, e.g. _include=Observation:*.

#2675

A new interceptor ValidationMessageSuppressingInterceptor has been added. This interceptor can be used to selectively suppress specific vaLidation messages.

#2676

A new config option has been added to the DaoConfig that causes generated SQL statements to account for potential null values in HAPI FHIR JPA date index rows. Nulls are no longer ever used in this table after HAPI FHIR 5.3.0, but legacy data may still have nulls.

#2676

A new setting has been added to the DaoConfig that allows the maximum number of _include and _revinclude resources to be added to a single search page result. In addition, the include/revinclue processor have been redesigned to avoid accidentally overloading the server if an include/revinclude would return unexpected massive amounts of data.

#2676

When performing non-query cache JPA searches (i.e. searches with Cache-Control: no-store) the loading of _include and _revinclude will now factor the maximum include count.

#2681

A new DaoConfig setting called Mass Ingestion Mode has been added. This mode enables rapid data ingestion by skipping a number of unnecessary checks during backloading.

#2692

A new Pointcut has been added that is invoked when a new Bulk Export is initiated.

#2702

The JPA server terminology uploader now supports uploading ICD-10-CM (US Edition) using the native format for that vocabulary.

#2712

AuthorizationInterceptor can now be used to authorize bulk export requests

#2721

Support for LOINC 2.70 has been added.

#2828

PatientIdPartitionInterceptor now supports conditional creates of resources where the resource is in the patient compartment but the conditional URL does not contain a patietn reference.

#2735

The $evaluate-measure now works on a partitioned server.

#2743

A new interceptor has been added for JPA servers that uses semaphores to avoid multiple concurrent FHIR transactions from trying to create/update the same resource at the same time. This can improve overall performance when writing many concurrent transactions since it avoids the need for retries.

#2748

A new tag storage mode called Inline Tag Mode tas been added. In this mode, all tags are stored directly in the serialized resource body in the database, instead of using dedicated tables. This has significant performance advantages when storing resources with many distinct tags (i.e. many tags that are unique to each resource, as opposed to being reused across multiple resources).

#2756

A new interceptor has been addeed to the JPA server called ForceOffsetSearchModeInterceptor. This interceptor forces all searches to be offset searches, instead of relying on the query cache. This means that FHIR search operations will never result in any database write, which can be good for highly concurrent servers.

#2766

A new JPA partitioning interceptor PatientIdPartitionInterceptor has been added. This interceptor uses the ID of the patient associated with any resources in the patient compartment to generate a consistent partition ID.

#2767

$mdm-query-links and $mdm-duplicate-golden-resources now enforce paging via parameters _offset and _count. More details can be found in the MDM Operations documentation.

#2777

Support for multiple header-passthrough option using -hp or --header-passthrough parameter has been added to hapi-fhir-cli commands: example-data-uploader, export-conceptmap-to-csv, import-csv-to-conceptmap and upload-terminology

#2782

A new Validation Support Module has been added that can use NPM Packages to supply validation conformance artifacts programatcally to the validator.

#2786

Add 'loinc.codesystem.make.current' property to upload-terminology command to allow loading LOINC version without becoming current.

#2800

Allowed the optional inclusion of the LOINC Consumer Names archive in addition to the main LOINC distribution. If it is supplied, the consumer names CSV file will be scanned, and all consumer names will be added to uploaded Concepts as additional designations

#2803

Allowed the optional inclusion of the LOINC Linguistic Variants archive in addition to the main LOINC distribution. If it is supplied, all linguistic variants files will be scanned, and all translations will be added to uploaded Concepts as additional designations

Upgrade net.java.dev.jna to run docker tests on Mac arm64 M1 machines

#2841

The :text Search Parameter modifier now searches by word boundary of the text content as opposed to only searching at the start of the text when using Lucene/Elasticsearch indexing. Add * to match word prefixes (e.g. weig* will match weight).

#2845

Added new $reindex operation with similar syntax to $delete-expunge that creates a spring-batch job to reindex selected resources. $mark-all-resources-for-reindexing and $perform-reindexing-pass are now deprecated, and will likely be removed in a future release.

#2852

Replace existing email implementation code with SimpleJavaMail library.

#2871

Modified the behaviour of the :mdm param qualifier. Previously, it used to only resolve IDs if the resource ID was a source resource. Now, MDM expansion will work if you pass it the ID of a golden resource instead.

#2688

FHIR Transaction duplicate record checks are now performed without any database interactions or SQL statements, reducing the processing load associated with FHIR transactions by at least a small amount.

#2688

Conditional URL lookups in the JPA server will now explicitly specify a maximum fetch size of 2, avoiding fetching more data that won't be used inadvertently in some situations.

#2717

A new setting has been added to the DaoConfig called Tag Versioning Mode. This setting controls whether a single collection of tags/profiles/security labels is maintained across all versions of a single resource, or whether each version of the resource maintains its own independent collection. Previously each version always maintained an independent collection, which is useful sometimes, but is often not useful and can affect performance.

#2717

FHIR transactions in the JPA server that perform writes will now aggressively pre-fetch as many entities as possible at the very start of transaction processing. This can drastically reduce the number of round-trips, especially as the number of resources in a transaction gets bigger.

#2653

When performing a conditional create/update/delete on a JPA server, if the match URL contained a plus character, this character was interpreted as a space (per legacy URL encoding rules) even though this has proven to not be the intended behaviour in real life applications. Plus characters will now be treated literally as a plus character in these URLs.

#2695

Bulk import batch jobs are now activated in a local scheduled task, making bulk import jobs better able to take advantage of large clusters.

#2697

DELETE _expunge=true has been converted to use Spring Batch. It now simply returns the jobId of the Spring Batch job while the job continues to run in the background. A new operation called $expunge-delete has been added to provide more fine-grained control of the delete expunge operation. This operation accepts an ordered list of URLs to be delete expunged and an optional batch-size parameter that will be used to perform the delete expunge. If no batch size is specified in the operation, then the value of DaoConfig.getExpungeBatchSize() is used.

#2732

The ConceptMap.group.element.display storage size limit has been increased to 500 characters.

#2751

The bulk export request length limit has been increased to 1024 characters.

#2760

If two authorization compartments apply to the same targets and share the same compartment name, then instead of creating a new compartment, the rule builder now adds the new owner to the list of owners in the existing compartment.

#2766

When operating in partitioned mode, the interceptor pointcut STORAGE_PARTITION_IDENTIFY_CREATE will now be invoked to determine the partition to use for create with client-assigned IDs. Previously the STORAGE_PARTITION_IDENTIFY_READ pointcut was invoked, which was confusing and potentially unexpected.

#2773

Flyway migration used to enforce order by default. This has been changed so now the default behaviour is out of order migrations are permitted. Strict order can be enforced via the new strict-order flag if required.

#2791

Identifier maximum length increased from 200 to 500. This specifically applies to table HFJ_IDX_CMP_STRING_UNIQ.

#2805

When the contents of a package are corrupt, the error messages now identify the corrupt element

#2665

When performing a FHIR transaction containing a conditional create, references to that resource were inadvertently replaced with contained references."

#2672

A concurrency error was fixed when using client assigned IDs on a highly concurrent server with resource deletion disabled.

#2674

A null-pointer exception was fixed when a ResponseTerminologyDisplayInterceptor is registered and a search or read response returns a resource with code value that in turn returns a null code lookup.

#2676

Subscription notifications will no longer be triggered by default in response to changes that do not increment the resource version (e.g. $meta-add and $meta-delete). A new DaoConfig setting has been added to make this configurable.

#2674

When myDaoConfig.setDefaultTotalMode(SearchTotalModeEnum.ACCURATE) and there are zero search results on an _id search, An Index Out of Bounds error was thrown. This has been corrected.

#2682

Fixes the problem that FHIR package IDs were incorrectly treated as case sensitive when being loaded, causing loads to fail when dependencies were declared with a different case than in the package itself.

#2693

Constraint errors were not always auto-retried even when configured to do so on certain platforms (particularly Postgresql) where constraint names are auto converted to lower case. Thanks to Bruno Hedman for the pull request!

#2705

When searching by source, if deleted resources are matched, the search returned an incorrect size. This has been corrected.

#2695

The _filter search parameter was incorrectly included in the server capability statement if it was disabled on the server. This has been corrected.

#2624

ValueSet expansion did not correctly preserve the order if multiple codes were included in a single inclusion block.

#2739

Too many MDM candidates matching could result in an OutOfMemoryError. Candidate matching is now limited to the value of IMdmSettings.getCandidateSearchLimit(), default 10000.

#2741

A regression caused the JPA Server History operation to not return paging links in responses. This has been corrected.

#2747

Added null checks to MDM resource interceptor in order to avoid NPEs.

#2748

The SQL generated for the _profile search parameter did not use all of the columns on the tag index table, resulting on poor performance on MySQL. This has been corrected.

#2758

The internal cache for tags, concepts, and others had longer or shorter expiry times than was intended. This has been corrected.

#2761

When searching for ExplanationOfBenefit?patient=123,456, the compartment authorization interceptor was treating '123,456' as a single id rather than as a list of ids. This has been corrected.

#2762

A regression was introduced in 2760 where a READ compartment could get collapsed into a WRITE compartment. This has been corrected.

#2764

Searches for mdm-expanded references such as Observation?subject:mdm=123 were getting denied by access rules that did not recognize the :mdm suffix. This has been corrected.

#2768

$mdm-submit operation was only submitting 100 resources and then stopping. It now correctly submits all requested resources.

#2794

When providing links for placeholder creation, DaoResourceLinkResolver expects just a single 'identifier=value' param, but it can be additional data, s.a. tags, extra identifiers, etc.

#2797

When initiating a FHIR bulk export, if more than one _typeFilter parameter was supplied only the first one was respected. This has been corrected.

#2808

Loading packages would fail when partitioning was enabled with unnamed partitions. This has been fixed.

#2810

An issue in the FHIRPath evaluator prevented Encounters from being stored when using the new PatientIdPartitionInterceptor. This has been corrected.

#2823

Mdm failed to load if any mdm subscription had been deleted, e.g. if $expunge expungeEverything had been run on the server. This has been corrected.

#2826

When Client Id Strategy is set to NOT_ALLOWED, permit system requests to create resources, e.g. SearchParameter and Subscription resources required by the system.

#2829

Add DSTU3 Support To UploadTerminologyCommand.

#2868

Fixed a bug in transaction bundle processing, specifically for bundles which contained both a conditional create, and a resource which relied on this conditional create as a reference. This would cause the referring resource to generate a contained resource instead of appropriately referencing the existing patient.

#2876

Fixed a bug wherein an NPE could be thrown by the MDM module interceptor if an incoming resource had a tag with no system.

#2887

Fixed a bug where the search results cache was ignoring the value of _contained parameter when assigning a cache key. This was causing queries run in a short period of time to return wrong cached results if one query used _contained=true and the other did not.

#2835

Addressed the following CVE report by bumping the minor version for Jetty in the root POM: