1.1Changelog: 2022

 

1.1.1Changelog

 

1.1.2HAPI FHIR 6.1.0 (TBD)

 

Release Information

Released: 2022-08-18

Codename: (TBD)

Upgrade Instructions

When upgrading to this release, there are a few important notes to be aware of:

  • This release removes the Legacy Search Builder. If you upgrade to this release, the new Search Builder will automatically be used.

  • This release will break existing implementations which use the subscription delete feature. The place where the extension needs to be installed on the Subscription resource has now changed. While it used to be on the top-level Subscription resource, the extension should now be added to the Subscription's channel element.

Here is how the subscription should have looked before:

{
    "resourceType": "Subscription",
    "id": "1",
    "status": "active",
    "reason": "Monitor resource persistence events",
    "criteria": "Patient",
    "channel": {
        "type": "rest-hook",
        "payload": "application/json"
    },
   "extension": [
      {
         "url": "http://hapifhir.io/fhir/StructureDefinition/subscription-send-delete-messages",
         "valueBoolean": "true"
      }
   ]
}

And here is how it should now look:


{
    "resourceType": "Subscription",
    "id": "1",
    "status": "active",
    "reason": "Monitor resource persistence events",
    "criteria": "Patient",
    "channel": {
        "extension": [
            {
                "url": "http://hapifhir.io/fhir/StructureDefinition/subscription-send-delete-messages",
                "valueBoolean": "true"
            }
        ],
        "type": "rest-hook",
        "payload": "application/json"
    }
}

Changes

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

  • 9.4.44.v20210927 -> 9.4.48.v20220622 (Addresses CVE-2022-2047)

#3243

Previously, the http://hapifhir.io/fhir/StructureDefinition/subscription-send-delete-messages extension on REST-HOOK subscription channel element was only valid for R4. This has been expanded to support DSTU3 and DSTU2.

#3269

The SearchParameterMap query normalizer did not support _include and _revinclude parameters with the :recurse qualifier. This has been corrected. Thanks to Augustas Vilčinskas for the PR!

#3577

Experimental support for CockroachDB has been added to the JPA server. Thanks to Joe Shook for the contribution!

#3619

The ValueSet/$expand operation can now optionally support the displayLanugage parameter. Thanks to Gjergj Sheldija for the pull request!

#3620

Add support for the :in and :not-in qualifiers for use in SMART on FHIR v2 granular scope definition.

#3631

If a gated Batch job step and all prior steps produced only a single chunk of work, notify the next step immediately instead of waiting for the scheduled job maintenance to advance it.

#3640

Extended Lucene/Elasticsearch indexing of search parameters now supports _tag, _profile and _security.

#3658

Currently neither HAPI-FHIR nor the FHIR specification supports modifying historical version of a resource. This implementation adds the feature Update with History Rewrite to HAPI-FHIR. It can be accessed via the IGenericClient's updateHistoryRewrite method

#3674

The rule system has been extended to support optional fhir-expressions that narrow the application of a rule. A matching RuleFilteringConsentService implements post-query support for this filtering using an in-memory matcher.

#3702

Added index for table MPI_LINK on attributes MATCH_RESULT, TARGET_PID and VERSION

#3719

Added support to Bulk Export for FHIR Response Terminology Translation. It will use the same mappings as the Translation Interceptor.

#3724

Adding some test cases for CQL measures on immunization as well as some testing methods to support easier changes of CQL in unit tests.

#3728

If provided, the practitioner parameter for $evaluate-measure is now also be passed on to measures of type population (not only for type subject-list).

#3742

Added operations to batch2 api for searching job instances.

#3752

Batch2 job definitions can now optionally provide an error handler callback that will be called when a job instance fails, errors or is cancelled.

#3762

JPA server patch operation has been moved to the hapi-fhir-storage project, for reuse in other backends.

#3784

The InMemoryMatcher used by Subscription matching not supports the token :not modifier. The :not-in modifier was also corrected for cases of multiple values in a , separated or-list.

#3817

The 'SUBSCRIPTION_BEFORE_MESSAGE_DELIVERY' pointcut now supports a new parameter, ResourceModifiedJsonMessage. This permits interceptor implementers to modify the outgoing envelope before it is sent off.

#3820

Providing a specialized exception encapsulating the mechanism for reporting TokenParam validation failure when searching resources on parameter _tag and _security. The new exception was introduced primarily for reusability purposes.

#3714

Chained searches have been sped up for configurations where the Index Contained Resources feature is enabled.

#3671

Converted mdm clear batch job from Spring Batch to Batch2

#3755

When the Mark Resources for Reindexing after SearchParameter change configuration parameter is enabled, SMILE will use the Batch 2 framework to perform the reindexing operation.

#3756

The IAuthRuleTester api has changed and now uses a parameter object for flexibility.

#3757

The Delete Expunge operation has been moved from Spring Batch to Batch 2.

#3790

The Legacy Search Builder has been removed in favour of the new Search Builder. The DaoConfig will retain its setter for deprecation purposes, but that will also be removed after the next release.

#3459

Previously, R5 Appointment resources would fail to save in JPA servers due to a path splitting problem during Search Parameter extraction. This has been corrected.

#3574

Previously, PATCH operations that were contained in a transaction bundle would not return response entries. This has been corrected.

#3612

Search with tag parameters using :below qualifier was not working. This is now fixed.

#3627

Previously, the $expunge operation at the system level was always available, regardless of configuration parameter settings. Now, the system-level $expunge operation requires that the Expunge Enabled parameter is enabled. Additionally, the expungeEverything option of the operation requires that the Allow Multiple Delete Enabled parameter is enabled.

#3628

Nickname matching only matched formal names to a nickname. This has been broadened to match nicknames to other nicknames for the same formal name.

#3642

Previously, the RuleBuilder's rules surrounding Group Bulk Export would return failures too early in the case of multiple permissions. This has been corrected, and the rule will no longer prematurely return a DENY verdict, instead opting to delegate to future rules.

#3650

Removed a strict dependency on a FullTextSVC. This was causing HAPI to fail to boot when Lucene/ElasticSearch was not enabled.

#3651

MS SQL Standard Edition does not support the ONLINE=ON feature for index creation, and failed during upgrades to 6.0. Upgrades now detect these limitations and avoid this feature when unsupported.

#3668

Fhir patch operation returning 500 when patching in a transaction with a resource query in property request.url.

#2669

Previously subscriptions in a partition with the id null will be matched against incoming resources from all partitions. Changed to subscriptions will only match against incoming resources in the partition the subscription exists in unless cross partition subscription is enabled and the subscription has the appropriate extension.

#3673

A change in H2's new version caused resources >1mb in size to fail to correctly store. This has been corrected. Thanks to Patrick Werner for the report and pull request!

#3684

Moved the http://hapifhir.io/fhir/StructureDefinition/subscription-send-delete-messages from the Subscription to the Subscription's Channel element.

#3693

Previously, deleted resources with client generated ids were being included in the bundle total when searching by _id. This has been corrected by adding functionality to optionally filter out deleted resources when resolving forced ids to persistent ids.

#3700

Previously, Group Bulk Export would expand into other groups, due to the nature of Group.member being part of the patient search compartment. This has been fixed, and now, Group Bulk Export will only ever export the Group resource specified in the request, regardless of patient membership.

#3710

Changing the Unknown resource type error message to include only resource provider classes and exclude plain providers classes.

#3716

Server was blocking updates with Forbidden 403 that included a resource version in the url without the X-Rewrite-History header. This has been corrected.

#3722

Fixed the $expunge operation that expunge everything response will return the correct number of dropped resources.

#3729

The patient-list type was renamed to subject-list for a CQL measure in R4.

#3736

Previously, the DSTU3 Conformance provider was not including searchInclude or searchRevInclude results in the conformance response. This has been corrected.

#3749

Fixed a regression in 6.0.0 which caused the SearchNarrowingInterceptor to occcasionally be applied to non-search operations.

#3752

It was possible under certain race conditions for the batch2 completion handler to be called twice. This has been corrected.

#3770

Batch2 will have a standard error handling that will fail the job if it fails a chunk processing for more than 3 times. Further, added better validation to reindex job to disallow bad urls.

#3773

A batch2 state change regression was introduced recently that resulted in batch2 jobs not being properly completed. This has been corrected.

#3787

FHIR queries using date sort were ignoring seconds and milliseconds when using lucene/elasticsearch SearchParameter indexing. This has been corrected.

#3788

Previously, if a FHIR patch was performed on a soft deleted resource, the patch was successfully applied and the resource was undeleted and populated with only the data contained in the patch. This has been fixed so that patch on deleted resources now issues a HTTP 410 response.

#3796

Previously, the FHIRPath PATCH operation type add was replacing the entire element as opposed to adding the new element to the existing element. This has been corrected.

#3801

For Lucene/Elastic previously we were using scrolled results even when performing synchronous searches. That has now been fixed.

#3804

When starting hapi-fhir from starter application, BeanDefinitionOverrideException was thrown with message: Invalid bean definition with name loadIdsStep. This issue is now fixed.

#3810

Elastic/Lucene documentation was updated to indicate that full reindex is required when enabling storing resource bodies in indexes when indexed resources exist.

#3829

Previously when a Subscription was created using the package installer and with partitioning enabled, there was an error reading the partition name inside the SubscriptionRegisteringSubscriber. This fix checks incoming Subscription requests for a RequestPartitionId with a list of partition names containing null values and uses RequestPartitionId#defaultPartition() to obtain the default partition instead.

1.1.3HAPI FHIR 6.0.2 (Tanuki)

 

Release Information

Released: 2022-06-14

Codename: (Tanuki)

Upgrade Instructions

Changes

1.1.4HAPI FHIR 6.0.1 (Tanuki)

 

Release Information

Released: 2022-05-25

Codename: (Tanuki)

Upgrade Instructions

Changes

#3642

Previously, the RuleBuilder's rules surrounding Group Bulk Export would return failures too early in the case of multiple permissions. This has been corrected, and the rule will no longer prematurely return a DENY verdict, instead opting to delegate to future rules.

#3650

Removed a strict dependency on a FullTextSVC. This was causing HAPI to fail to boot when Lucene/ElasticSearch was not enabled.

1.1.5HAPI FHIR 6.0.0 (Tanuki)

 

Release Information

Released: 2022-05-18

Codename: (Tanuki)

Upgrade Instructions

This release has breaking changes, and some large database changes.

  • Hibernate Search mappings for Terminology entities have been upgraded, which requires a reindex of ValueSet resources.
  • Database SearchParameter indexes have been redefined. This stage of the upgrade may be slow, and can be scheduled before the main upgrade window.

Hibernate Search Mappings Upgrade

Some freetext mappings (definitions about how resources are freetext indexed) were changed for Terminology resources. This change requires a full reindexing for any Smile CDR installations which make use of the following features:

  • Fulltext/Content search
  • Terminology Expansion

To reindex all resources call:

POST /$reindex Content-Type: application/fhir+json
{
  "resourceType": "Parameters",
  "parameter": [ {
    "name": "everything",
    "valueBoolean": "true"
  }, {
    "name": "batchSize",
    "valueDecimal": 1000
  } ]
}

Database Indexing

The JPA SearchParameter database indexing has been redesigned in 6.0. As a result, performing the upgrade may take longer than usual. Database migrations happen automatically after server upgrade during the next restart, and the server is unavailable during this migration window. To avoid this prolonged outage during server restart, you can apply these index changes manually before upgrading the server. The server is compatible with both the old and new indexes. The syntax for index definition varies, and we include separate scripts for MS Sql, Postgres, and Oracle.

Upgrade indexing to 6.0 manually on MS Sql Server

This script updates the indexing, and assumes Enterprise Edition. If you are running Standard Edition, edit the script and remove the WITH (ONLINE = ON) clauses.

Note: Without this feature, the database tables will be locked during the creation of each index, and you will be unable to save, update, or delete any resource until the statement completes.

-- Table: HFJ_SPIDX_DATE create index IDX_SP_DATE_HASH_V2 on HFJ_SPIDX_DATE(HASH_IDENTITY, SP_VALUE_LOW, SP_VALUE_HIGH, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_DATE.IDX_SP_DATE_HASH;
drop index HFJ_SPIDX_DATE.IDX_SP_DATE_HASH_LOW;
create index IDX_SP_DATE_HASH_HIGH_V2 on HFJ_SPIDX_DATE(HASH_IDENTITY, SP_VALUE_HIGH, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_DATE.IDX_SP_DATE_HASH_HIGH;
create index IDX_SP_DATE_ORD_HASH_V2 on HFJ_SPIDX_DATE(HASH_IDENTITY, SP_VALUE_LOW_DATE_ORDINAL, SP_VALUE_HIGH_DATE_ORDINAL, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_DATE.IDX_SP_DATE_ORD_HASH;
create index IDX_SP_DATE_ORD_HASH_HIGH_V2 on HFJ_SPIDX_DATE(HASH_IDENTITY, SP_VALUE_HIGH_DATE_ORDINAL, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_DATE.IDX_SP_DATE_ORD_HASH_LOW;
create index IDX_SP_DATE_RESID_V2 on HFJ_SPIDX_DATE(RES_ID, HASH_IDENTITY, SP_VALUE_LOW, SP_VALUE_HIGH, SP_VALUE_LOW_DATE_ORDINAL, SP_VALUE_HIGH_DATE_ORDINAL, PARTITION_ID) WITH (ONLINE = ON);
alter table HFJ_SPIDX_DATE drop constraint FK17S70OA59RM9N61K9THJQRSQM;
drop index HFJ_SPIDX_DATE.IDX_SP_DATE_RESID;
ALTER TABLE HFJ_SPIDX_DATE DROP CONSTRAINT FK17s70oa59rm9n61k9thjqrsqm;
alter table HFJ_SPIDX_DATE add constraint FK_SP_DATE_RES foreign key (RES_ID) references HFJ_RESOURCE;
drop index HFJ_SPIDX_DATE.IDX_SP_DATE_UPDATED;
-- Table: HFJ_SPIDX_TOKEN create index IDX_SP_TOKEN_HASH_V2 on HFJ_SPIDX_TOKEN(HASH_IDENTITY, SP_SYSTEM, SP_VALUE, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_TOKEN.IDX_SP_TOKEN_HASH;
create index IDX_SP_TOKEN_HASH_S_V2 on HFJ_SPIDX_TOKEN(HASH_SYS, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_TOKEN.IDX_SP_TOKEN_HASH_S;
create index IDX_SP_TOKEN_HASH_SV_V2 on HFJ_SPIDX_TOKEN(HASH_SYS_AND_VALUE, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_TOKEN.IDX_SP_TOKEN_HASH_SV;
create index IDX_SP_TOKEN_HASH_V_V2 on HFJ_SPIDX_TOKEN(HASH_VALUE, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_TOKEN.IDX_SP_TOKEN_HASH_V;
drop index HFJ_SPIDX_TOKEN.IDX_SP_TOKEN_UPDATED;
create index IDX_SP_TOKEN_RESID_V2 on HFJ_SPIDX_TOKEN(RES_ID, HASH_SYS_AND_VALUE, HASH_VALUE, HASH_SYS, HASH_IDENTITY, PARTITION_ID) WITH (ONLINE = ON);
alter table HFJ_SPIDX_TOKEN drop constraint FK7ULX3J1GG3V7MAQREJGC7YBC4;
drop index HFJ_SPIDX_TOKEN.IDX_SP_TOKEN_RESID;
ALTER TABLE HFJ_SPIDX_TOKEN DROP CONSTRAINT FK7ulx3j1gg3v7maqrejgc7ybc4;
alter table HFJ_SPIDX_TOKEN add constraint FK_SP_TOKEN_RES foreign key (RES_ID) references HFJ_RESOURCE;
-- Table: HFJ_SPIDX_NUMBER create index IDX_SP_NUMBER_HASH_VAL_V2 on HFJ_SPIDX_NUMBER(HASH_IDENTITY, SP_VALUE, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_NUMBER.IDX_SP_NUMBER_HASH_VAL;
create index IDX_SP_NUMBER_RESID_V2 on HFJ_SPIDX_NUMBER(RES_ID, HASH_IDENTITY, SP_VALUE, PARTITION_ID) WITH (ONLINE = ON);
alter table HFJ_SPIDX_NUMBER drop constraint FKCLTIHNC5TGPRJ9BHPT7XI5OTB;
drop index HFJ_SPIDX_NUMBER.IDX_SP_NUMBER_RESID;
ALTER TABLE HFJ_SPIDX_NUMBER DROP CONSTRAINT FKcltihnc5tgprj9bhpt7xi5otb;
alter table HFJ_SPIDX_NUMBER add constraint FK_SP_NUMBER_RES foreign key (RES_ID) references HFJ_RESOURCE;
drop index HFJ_SPIDX_NUMBER.IDX_SP_NUMBER_UPDATED;
-- Table: HFJ_SPIDX_QUANTITY create index IDX_SP_QUANTITY_HASH_V2 on HFJ_SPIDX_QUANTITY(HASH_IDENTITY, SP_VALUE, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_QUANTITY.IDX_SP_QUANTITY_HASH;
create index IDX_SP_QUANTITY_HASH_SYSUN_V2 on HFJ_SPIDX_QUANTITY(HASH_IDENTITY_SYS_UNITS, SP_VALUE, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_QUANTITY.IDX_SP_QUANTITY_HASH_SYSUN;
create index IDX_SP_QUANTITY_HASH_UN_V2 on HFJ_SPIDX_QUANTITY(HASH_IDENTITY_AND_UNITS, SP_VALUE, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_QUANTITY.IDX_SP_QUANTITY_HASH_UN;
create index IDX_SP_QUANTITY_RESID_V2 on HFJ_SPIDX_QUANTITY(RES_ID, HASH_IDENTITY, HASH_IDENTITY_SYS_UNITS, HASH_IDENTITY_AND_UNITS, SP_VALUE, PARTITION_ID) WITH (ONLINE = ON);
alter table HFJ_SPIDX_QUANTITY drop constraint FKN603WJJOI1A6ASEWXBBD78BI5;
drop index HFJ_SPIDX_QUANTITY.IDX_SP_QUANTITY_RESID;
ALTER TABLE HFJ_SPIDX_QUANTITY DROP CONSTRAINT FKn603wjjoi1a6asewxbbd78bi5;
alter table HFJ_SPIDX_QUANTITY add constraint FK_SP_QUANTITY_RES foreign key (RES_ID) references HFJ_RESOURCE;
drop index HFJ_SPIDX_QUANTITY.IDX_SP_QUANTITY_UPDATED;
-- Table: HFJ_SPIDX_QUANTITY_NRML create index IDX_SP_QNTY_NRML_HASH_V2 on HFJ_SPIDX_QUANTITY_NRML(HASH_IDENTITY, SP_VALUE, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_QUANTITY_NRML.IDX_SP_QNTY_NRML_HASH;
create index IDX_SP_QNTY_NRML_HASH_SYSUN_V2 on HFJ_SPIDX_QUANTITY_NRML(HASH_IDENTITY_SYS_UNITS, SP_VALUE, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_QUANTITY_NRML.IDX_SP_QNTY_NRML_HASH_SYSUN;
create index IDX_SP_QNTY_NRML_HASH_UN_V2 on HFJ_SPIDX_QUANTITY_NRML(HASH_IDENTITY_AND_UNITS, SP_VALUE, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_QUANTITY_NRML.IDX_SP_QNTY_NRML_HASH_UN;
create index IDX_SP_QNTY_NRML_RESID_V2 on HFJ_SPIDX_QUANTITY_NRML(RES_ID, HASH_IDENTITY, HASH_IDENTITY_SYS_UNITS, HASH_IDENTITY_AND_UNITS, SP_VALUE, PARTITION_ID) WITH (ONLINE = ON);
alter table HFJ_SPIDX_QUANTITY_NRML drop constraint FKRCJOVMUH5KC0O6FVBLE319PYV;
drop index HFJ_SPIDX_QUANTITY_NRML.IDX_SP_QNTY_NRML_RESID;
ALTER TABLE HFJ_SPIDX_QUANTITY_NRML DROP CONSTRAINT FKrcjovmuh5kc0o6fvble319pyv;
alter table HFJ_SPIDX_QUANTITY_NRML add constraint FK_SP_QUANTITYNM_RES foreign key (RES_ID) references HFJ_RESOURCE;
drop index HFJ_SPIDX_QUANTITY_NRML.IDX_SP_QNTY_NRML_UPDATED;
-- Table: HFJ_RESOURCE create index IDX_RES_TYPE_DEL_UPDATED on HFJ_RESOURCE(RES_TYPE, RES_DELETED_AT, RES_UPDATED, PARTITION_ID, RES_ID) WITH (ONLINE = ON);
drop index HFJ_RESOURCE.IDX_INDEXSTATUS;
drop index HFJ_RESOURCE.IDX_RES_TYPE;
-- Table: HFJ_SPIDX_STRING create index IDX_SP_STRING_HASH_NRM_V2 on HFJ_SPIDX_STRING(HASH_NORM_PREFIX, SP_VALUE_NORMALIZED, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_STRING.IDX_SP_STRING_HASH_NRM;
create index IDX_SP_STRING_HASH_EXCT_V2 on HFJ_SPIDX_STRING(HASH_EXACT, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
drop index HFJ_SPIDX_STRING.IDX_SP_STRING_HASH_EXCT;
drop index HFJ_SPIDX_STRING.IDX_SP_STRING_UPDATED;
-- Table: HFJ_RES_TAG create index IDX_RES_TAG_RES_TAG on HFJ_RES_TAG(RES_ID, TAG_ID, PARTITION_ID) WITH (ONLINE = ON);
create index IDX_RES_TAG_TAG_RES on HFJ_RES_TAG(TAG_ID, RES_ID, PARTITION_ID) WITH (ONLINE = ON);
ALTER TABLE HFJ_RES_TAG DROP CONSTRAINT IDX_RESTAG_TAGID;
drop index IDX_RESTAG_TAGID on HFJ_RES_TAG;
ALTER TABLE HFJ_RES_TAG ADD CONSTRAINT IDX_RESTAG_TAGID UNIQUE (RES_ID, TAG_ID);
-- Table: HFJ_TAG_DEF create index IDX_TAG_DEF_TP_CD_SYS on HFJ_TAG_DEF(TAG_TYPE, TAG_CODE, TAG_SYSTEM, TAG_ID);
ALTER TABLE HFJ_TAG_DEF DROP CONSTRAINT IDX_TAGDEF_TYPESYSCODE;
drop index IDX_TAGDEF_TYPESYSCODE on HFJ_TAG_DEF;
ALTER TABLE HFJ_TAG_DEF ADD CONSTRAINT IDX_TAGDEF_TYPESYSCODE UNIQUE (TAG_TYPE, TAG_CODE, TAG_SYSTEM);

Upgrade indexing to 6.0 manually on Postgres

-- Table: HFJ_SPIDX_DATE create index CONCURRENTLY IDX_SP_DATE_HASH_V2 on HFJ_SPIDX_DATE(HASH_IDENTITY, SP_VALUE_LOW, SP_VALUE_HIGH, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_DATE_HASH;
drop index CONCURRENTLY IDX_SP_DATE_HASH_LOW;
create index CONCURRENTLY IDX_SP_DATE_HASH_HIGH_V2 on HFJ_SPIDX_DATE(HASH_IDENTITY, SP_VALUE_HIGH, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_DATE_HASH_HIGH;
create index CONCURRENTLY IDX_SP_DATE_ORD_HASH_V2 on HFJ_SPIDX_DATE(HASH_IDENTITY, SP_VALUE_LOW_DATE_ORDINAL, SP_VALUE_HIGH_DATE_ORDINAL, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_DATE_ORD_HASH;
create index CONCURRENTLY IDX_SP_DATE_ORD_HASH_HIGH_V2 on HFJ_SPIDX_DATE(HASH_IDENTITY, SP_VALUE_HIGH_DATE_ORDINAL, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_DATE_ORD_HASH_LOW;
create index CONCURRENTLY IDX_SP_DATE_RESID_V2 on HFJ_SPIDX_DATE(RES_ID, HASH_IDENTITY, SP_VALUE_LOW, SP_VALUE_HIGH, SP_VALUE_LOW_DATE_ORDINAL, SP_VALUE_HIGH_DATE_ORDINAL, PARTITION_ID);
alter table HFJ_SPIDX_DATE drop constraint FK17S70OA59RM9N61K9THJQRSQM;
drop index CONCURRENTLY IDX_SP_DATE_RESID;
alter table HFJ_SPIDX_DATE add constraint FK_SP_DATE_RES foreign key (RES_ID) references HFJ_RESOURCE;
drop index CONCURRENTLY IDX_SP_DATE_UPDATED;
-- Table: HFJ_SPIDX_TOKEN create index CONCURRENTLY IDX_SP_TOKEN_HASH_V2 on HFJ_SPIDX_TOKEN(HASH_IDENTITY, SP_SYSTEM, SP_VALUE, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_TOKEN_HASH;
create index CONCURRENTLY IDX_SP_TOKEN_HASH_S_V2 on HFJ_SPIDX_TOKEN(HASH_SYS, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_TOKEN_HASH_S;
create index CONCURRENTLY IDX_SP_TOKEN_HASH_SV_V2 on HFJ_SPIDX_TOKEN(HASH_SYS_AND_VALUE, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_TOKEN_HASH_SV;
create index CONCURRENTLY IDX_SP_TOKEN_HASH_V_V2 on HFJ_SPIDX_TOKEN(HASH_VALUE, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_TOKEN_HASH_V;
drop index CONCURRENTLY IDX_SP_TOKEN_UPDATED;
create index CONCURRENTLY IDX_SP_TOKEN_RESID_V2 on HFJ_SPIDX_TOKEN(RES_ID, HASH_SYS_AND_VALUE, HASH_VALUE, HASH_SYS, HASH_IDENTITY, PARTITION_ID);
alter table HFJ_SPIDX_TOKEN drop constraint FK7ULX3J1GG3V7MAQREJGC7YBC4;
drop index CONCURRENTLY IDX_SP_TOKEN_RESID;
alter table HFJ_SPIDX_TOKEN add constraint FK_SP_TOKEN_RES foreign key (RES_ID) references HFJ_RESOURCE;
-- Table: HFJ_SPIDX_NUMBER create index CONCURRENTLY IDX_SP_NUMBER_HASH_VAL_V2 on HFJ_SPIDX_NUMBER(HASH_IDENTITY, SP_VALUE, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_NUMBER_HASH_VAL;
create index CONCURRENTLY IDX_SP_NUMBER_RESID_V2 on HFJ_SPIDX_NUMBER(RES_ID, HASH_IDENTITY, SP_VALUE, PARTITION_ID);
alter table HFJ_SPIDX_NUMBER drop constraint FKCLTIHNC5TGPRJ9BHPT7XI5OTB;
drop index CONCURRENTLY IDX_SP_NUMBER_RESID;
alter table HFJ_SPIDX_NUMBER add constraint FK_SP_NUMBER_RES foreign key (RES_ID) references HFJ_RESOURCE;
drop index CONCURRENTLY IDX_SP_NUMBER_UPDATED;
-- Table: HFJ_SPIDX_QUANTITY create index CONCURRENTLY IDX_SP_QUANTITY_HASH_V2 on HFJ_SPIDX_QUANTITY(HASH_IDENTITY, SP_VALUE, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_QUANTITY_HASH;
create index CONCURRENTLY IDX_SP_QUANTITY_HASH_SYSUN_V2 on HFJ_SPIDX_QUANTITY(HASH_IDENTITY_SYS_UNITS, SP_VALUE, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_QUANTITY_HASH_SYSUN;
create index CONCURRENTLY IDX_SP_QUANTITY_HASH_UN_V2 on HFJ_SPIDX_QUANTITY(HASH_IDENTITY_AND_UNITS, SP_VALUE, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_QUANTITY_HASH_UN;
create index CONCURRENTLY IDX_SP_QUANTITY_RESID_V2 on HFJ_SPIDX_QUANTITY(RES_ID, HASH_IDENTITY, HASH_IDENTITY_SYS_UNITS, HASH_IDENTITY_AND_UNITS, SP_VALUE, PARTITION_ID);
alter table HFJ_SPIDX_QUANTITY drop constraint FKN603WJJOI1A6ASEWXBBD78BI5;
drop index CONCURRENTLY IDX_SP_QUANTITY_RESID;
alter table HFJ_SPIDX_QUANTITY add constraint FK_SP_QUANTITY_RES foreign key (RES_ID) references HFJ_RESOURCE;
drop index CONCURRENTLY IDX_SP_QUANTITY_UPDATED;
-- Table: HFJ_SPIDX_QUANTITY_NRML create index CONCURRENTLY IDX_SP_QNTY_NRML_HASH_V2 on HFJ_SPIDX_QUANTITY_NRML(HASH_IDENTITY, SP_VALUE, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_QNTY_NRML_HASH;
create index CONCURRENTLY IDX_SP_QNTY_NRML_HASH_SYSUN_V2 on HFJ_SPIDX_QUANTITY_NRML(HASH_IDENTITY_SYS_UNITS, SP_VALUE, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_QNTY_NRML_HASH_SYSUN;
create index CONCURRENTLY IDX_SP_QNTY_NRML_HASH_UN_V2 on HFJ_SPIDX_QUANTITY_NRML(HASH_IDENTITY_AND_UNITS, SP_VALUE, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_QNTY_NRML_HASH_UN;
create index CONCURRENTLY IDX_SP_QNTY_NRML_RESID_V2 on HFJ_SPIDX_QUANTITY_NRML(RES_ID, HASH_IDENTITY, HASH_IDENTITY_SYS_UNITS, HASH_IDENTITY_AND_UNITS, SP_VALUE, PARTITION_ID);
alter table HFJ_SPIDX_QUANTITY_NRML drop constraint FKRCJOVMUH5KC0O6FVBLE319PYV;
drop index CONCURRENTLY IDX_SP_QNTY_NRML_RESID;
alter table HFJ_SPIDX_QUANTITY_NRML add constraint FK_SP_QUANTITYNM_RES foreign key (RES_ID) references HFJ_RESOURCE;
drop index CONCURRENTLY IDX_SP_QNTY_NRML_UPDATED;
-- Table: HFJ_RESOURCE drop index IDX_INDEXSTATUS;
create index CONCURRENTLY IDX_RES_TYPE_DEL_UPDATED on HFJ_RESOURCE(RES_TYPE, RES_DELETED_AT, RES_UPDATED, PARTITION_ID, RES_ID);
drop index CONCURRENTLY IDX_RES_TYPE;
-- Table: HFJ_SPIDX_STRING create index CONCURRENTLY IDX_SP_STRING_HASH_NRM_V2 on HFJ_SPIDX_STRING(HASH_NORM_PREFIX, SP_VALUE_NORMALIZED, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_STRING_HASH_NRM;
create index CONCURRENTLY IDX_SP_STRING_HASH_EXCT_V2 on HFJ_SPIDX_STRING(HASH_EXACT, RES_ID, PARTITION_ID);
drop index CONCURRENTLY IDX_SP_STRING_HASH_EXCT;
drop index CONCURRENTLY IDX_SP_STRING_UPDATED;
-- Table: HFJ_RES_TAG create index CONCURRENTLY IDX_RES_TAG_RES_TAG on HFJ_RES_TAG(RES_ID, TAG_ID, PARTITION_ID);
create index CONCURRENTLY IDX_RES_TAG_TAG_RES on HFJ_RES_TAG(TAG_ID, RES_ID, PARTITION_ID);
alter table HFJ_RES_TAG drop constraint if exists IDX_RESTAG_TAGID cascade;
drop index if exists IDX_RESTAG_TAGID cascade;
ALTER TABLE HFJ_RES_TAG ADD CONSTRAINT IDX_RESTAG_TAGID UNIQUE (RES_ID, TAG_ID);
-- Table: HFJ_TAG_DEF create index IDX_TAG_DEF_TP_CD_SYS on HFJ_TAG_DEF(TAG_TYPE, TAG_CODE, TAG_SYSTEM, TAG_ID);
alter table HFJ_TAG_DEF drop constraint if exists IDX_TAGDEF_TYPESYSCODE cascade;
drop index if exists IDX_TAGDEF_TYPESYSCODE cascade;
ALTER TABLE HFJ_TAG_DEF ADD CONSTRAINT IDX_TAGDEF_TYPESYSCODE UNIQUE (TAG_TYPE, TAG_CODE, TAG_SYSTEM);

Upgrade indexing to 6.0 manually on Oracle


-- Table: HFJ_SPIDX_DATE create index IDX_SP_DATE_HASH_V2 on HFJ_SPIDX_DATE(HASH_IDENTITY, SP_VALUE_LOW, SP_VALUE_HIGH, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_DATE_HASH ONLINE;
drop index IDX_SP_DATE_HASH_LOW ONLINE;
create index IDX_SP_DATE_HASH_HIGH_V2 on HFJ_SPIDX_DATE(HASH_IDENTITY, SP_VALUE_HIGH, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_DATE_HASH_HIGH ONLINE;
create index IDX_SP_DATE_ORD_HASH_V2 on HFJ_SPIDX_DATE(HASH_IDENTITY, SP_VALUE_LOW_DATE_ORDINAL, SP_VALUE_HIGH_DATE_ORDINAL, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_DATE_ORD_HASH ONLINE;
create index IDX_SP_DATE_ORD_HASH_HIGH_V2 on HFJ_SPIDX_DATE(HASH_IDENTITY, SP_VALUE_HIGH_DATE_ORDINAL, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_DATE_ORD_HASH_LOW ONLINE;
create index IDX_SP_DATE_RESID_V2 on HFJ_SPIDX_DATE(RES_ID, HASH_IDENTITY, SP_VALUE_LOW, SP_VALUE_HIGH, SP_VALUE_LOW_DATE_ORDINAL, SP_VALUE_HIGH_DATE_ORDINAL, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
alter table HFJ_SPIDX_DATE drop constraint FK17S70OA59RM9N61K9THJQRSQM;
drop index IDX_SP_DATE_RESID ONLINE;
alter table HFJ_SPIDX_DATE add constraint FK_SP_DATE_RES foreign key (RES_ID) references HFJ_RESOURCE;
drop index IDX_SP_DATE_UPDATED ONLINE;
-- Table: HFJ_SPIDX_TOKEN create index IDX_SP_TOKEN_HASH_V2 on HFJ_SPIDX_TOKEN(HASH_IDENTITY, SP_SYSTEM, SP_VALUE, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_TOKEN_HASH ONLINE;
create index IDX_SP_TOKEN_HASH_S_V2 on HFJ_SPIDX_TOKEN(HASH_SYS, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_TOKEN_HASH_S ONLINE;
create index IDX_SP_TOKEN_HASH_SV_V2 on HFJ_SPIDX_TOKEN(HASH_SYS_AND_VALUE, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_TOKEN_HASH_SV ONLINE;
create index IDX_SP_TOKEN_HASH_V_V2 on HFJ_SPIDX_TOKEN(HASH_VALUE, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_TOKEN_HASH_V ONLINE;
drop index IDX_SP_TOKEN_UPDATED ONLINE;
create index IDX_SP_TOKEN_RESID_V2 on HFJ_SPIDX_TOKEN(RES_ID, HASH_SYS_AND_VALUE, HASH_VALUE, HASH_SYS, HASH_IDENTITY, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
alter table HFJ_SPIDX_TOKEN drop constraint FK7ULX3J1GG3V7MAQREJGC7YBC4;
drop index IDX_SP_TOKEN_RESID ONLINE;
alter table HFJ_SPIDX_TOKEN add constraint FK_SP_TOKEN_RES foreign key (RES_ID) references HFJ_RESOURCE;
-- Table: HFJ_SPIDX_NUMBER create index IDX_SP_NUMBER_HASH_VAL_V2 on HFJ_SPIDX_NUMBER(HASH_IDENTITY, SP_VALUE, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_NUMBER_HASH_VAL ONLINE;
create index IDX_SP_NUMBER_RESID_V2 on HFJ_SPIDX_NUMBER(RES_ID, HASH_IDENTITY, SP_VALUE, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
alter table HFJ_SPIDX_NUMBER drop constraint FKCLTIHNC5TGPRJ9BHPT7XI5OTB;
drop index IDX_SP_NUMBER_RESID ONLINE;
alter table HFJ_SPIDX_NUMBER add constraint FK_SP_NUMBER_RES foreign key (RES_ID) references HFJ_RESOURCE;
drop index IDX_SP_NUMBER_UPDATED ONLINE;
-- Table: HFJ_SPIDX_QUANTITY create index IDX_SP_QUANTITY_HASH_V2 on HFJ_SPIDX_QUANTITY(HASH_IDENTITY, SP_VALUE, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_QUANTITY_HASH ONLINE;
create index IDX_SP_QUANTITY_HASH_SYSUN_V2 on HFJ_SPIDX_QUANTITY(HASH_IDENTITY_SYS_UNITS, SP_VALUE, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_QUANTITY_HASH_SYSUN ONLINE;
create index IDX_SP_QUANTITY_HASH_UN_V2 on HFJ_SPIDX_QUANTITY(HASH_IDENTITY_AND_UNITS, SP_VALUE, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_QUANTITY_HASH_UN ONLINE;
create index IDX_SP_QUANTITY_RESID_V2 on HFJ_SPIDX_QUANTITY(RES_ID, HASH_IDENTITY, HASH_IDENTITY_SYS_UNITS, HASH_IDENTITY_AND_UNITS, SP_VALUE, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
alter table HFJ_SPIDX_QUANTITY drop constraint FKN603WJJOI1A6ASEWXBBD78BI5;
drop index IDX_SP_QUANTITY_RESID ONLINE;
alter table HFJ_SPIDX_QUANTITY add constraint FK_SP_QUANTITY_RES foreign key (RES_ID) references HFJ_RESOURCE;
drop index IDX_SP_QUANTITY_UPDATED ONLINE;
-- Table: HFJ_SPIDX_QUANTITY_NRML create index IDX_SP_QNTY_NRML_HASH_V2 on HFJ_SPIDX_QUANTITY_NRML(HASH_IDENTITY, SP_VALUE, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_QNTY_NRML_HASH ONLINE;
create index IDX_SP_QNTY_NRML_HASH_SYSUN_V2 on HFJ_SPIDX_QUANTITY_NRML(HASH_IDENTITY_SYS_UNITS, SP_VALUE, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_QNTY_NRML_HASH_SYSUN ONLINE;
create index IDX_SP_QNTY_NRML_HASH_UN_V2 on HFJ_SPIDX_QUANTITY_NRML(HASH_IDENTITY_AND_UNITS, SP_VALUE, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_QNTY_NRML_HASH_UN ONLINE;
create index IDX_SP_QNTY_NRML_RESID_V2 on HFJ_SPIDX_QUANTITY_NRML(RES_ID, HASH_IDENTITY, HASH_IDENTITY_SYS_UNITS, HASH_IDENTITY_AND_UNITS, SP_VALUE, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
alter table HFJ_SPIDX_QUANTITY_NRML drop constraint FKRCJOVMUH5KC0O6FVBLE319PYV;
drop index IDX_SP_QNTY_NRML_RESID ONLINE;
alter table HFJ_SPIDX_QUANTITY_NRML add constraint FK_SP_QUANTITYNM_RES foreign key (RES_ID) references HFJ_RESOURCE;
drop index IDX_SP_QNTY_NRML_UPDATED ONLINE;
-- Table: HFJ_RESOURCE drop index IDX_INDEXSTATUS;
create index IDX_RES_TYPE_DEL_UPDATED on HFJ_RESOURCE(RES_TYPE, RES_DELETED_AT, RES_UPDATED, PARTITION_ID, RES_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_RES_TYPE ONLINE;
-- Table: HFJ_SPIDX_STRING create index IDX_SP_STRING_HASH_NRM_V2 on HFJ_SPIDX_STRING(HASH_NORM_PREFIX, SP_VALUE_NORMALIZED, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_STRING_HASH_NRM ONLINE;
create index IDX_SP_STRING_HASH_EXCT_V2 on HFJ_SPIDX_STRING(HASH_EXACT, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
drop index IDX_SP_STRING_HASH_EXCT ONLINE;
drop index IDX_SP_STRING_UPDATED ONLINE;
-- Table: HFJ_RES_TAG create index IDX_RES_TAG_RES_TAG on HFJ_RES_TAG(RES_ID, TAG_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
create index IDX_RES_TAG_TAG_RES on HFJ_RES_TAG(TAG_ID, RES_ID, PARTITION_ID) ONLINE DEFERRED INVALIDATION;
ALTER TABLE HFJ_RES_TAG DROP CONSTRAINT IDX_RESTAG_TAGID;
drop index IDX_RESTAG_TAGID;
ALTER TABLE HFJ_RES_TAG ADD CONSTRAINT IDX_RESTAG_TAGID UNIQUE (RES_ID, TAG_ID);
-- Table: HFJ_TAG_DEF create index IDX_TAG_DEF_TP_CD_SYS on HFJ_TAG_DEF(TAG_TYPE, TAG_CODE, TAG_SYSTEM, TAG_ID);
ALTER TABLE HFJ_TAG_DEF DROP CONSTRAINT IDX_TAGDEF_TYPESYSCODE;
drop index IDX_TAGDEF_TYPESYSCODE;
ALTER TABLE HFJ_TAG_DEF ADD CONSTRAINT IDX_TAGDEF_TYPESYSCODE UNIQUE (TAG_TYPE, TAG_CODE, TAG_SYSTEM);

Changes

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

  • FlywayDB (JPA): 8.4.4 -> 8.5.0
  • Postgresql (JPA): 42.3.2 -> 42.3.3 (Addresses WS-2022-0080)

#3348

The HAPI FHIR server GraphQL endpoints now support GraphQL introspection, making them much easier to use with GraphQL-capable IDEs.

#3360

Support has been added to the JPA server for token :not-in queries. Similar to :not queries, resources will currently be considered to match if any codes in the relevant resource field are not found in the given ValueSet (as opposed to matching if all codes are not in the given ValueSet).

#3360

SearchNarrowingInterceptor can now be used to automatically narrow searches to include a code:in or code:not-in expression, for mandating that results must be in a specified list of codes.

#3360

The SearchNarrowingInterceptor can now narrow searches to require a token:in or token:not-in parameter.

#3360

Performance for JPA Server ValueSet expansion has been significantly optimized in order to minimize database lookups, especially with large expansions.

#3384

Added logs that identify the resource that failed the validation check during package installation, and describe the reason for the failure.

#3387

Support has now (finally!) been added for the FHIR Bulk Import ($import) operation. This operation is the first operation to leverage the new Batch2 framework.

#3387

A new batch operation framework for executing long running background jobs has been created. This new framework is called 'Batch2', and will eventually replace Spring Batch. This framework is intended to be much more resilient to failures as well as much more paralellized than Spring Batch jobs.

#3405

It is now possible to register multiple IConsentService implementations against a single ConsentInterceptor.

#3405

When validating a code, a helpful error message is now returned if the user has supplied a ValueSet URL where a CodeSystem URL should be used, since this is a common mistake.

#3405

A consent service implementation that enforces search narrowing rules specified by the SearchNarrowingInterceptor has been added. This can be used to narrow results from searches in cases where this can't be done using search URL manipulation. See ResultSet Narrowing for more information.

#3442

Provided a Remote Terminology Service implementation for the $translate operation.

#3450

Previously there was no way to recreate freetext indexes for terminology entities. A new CLI operation, reindex-terminology now exists for this purpose.

#3452

Improve logging so it is clear when a new search parameter has been loaded into the cache.

#3452

The JPA server terminology service can now process IS-A filters in ValueSet expansion on servers with Hibernate Search disabled.

#3470

The server now supports date searches with the NOT_EQUALS (ne) prefix.

#3490

When using ApacheProxyAddressStrategy as a server address strategy, the Forward header will now be respected. Thanks to Thomas Papke for the pull request!

#3521

Added a helper method to BundleUtil, to support the creation of a new bundle entry and to set the value for one of the fields.

#3534

Added a new multi-column index on the HFJ_RESOURCE table indexing the columns RES_TYPE, RES_DELETED_AT, RES_UPDATED, PARTITION_ID and RES_ID and removed the existing single-column index on the RES_TYPE column. This new index will improve the performance of the $reindex operation and will be useful for some other queries a well.

#3547

Added a new pointcut: STORAGE_PRESTORAGE_CLIENT_ASSIGNED_ID which is invoked when a user attempts to create a resource with a client-assigned ID.

#3557

Group Bulk Export (e.g. Group/123/$export) now additionally supports Organization and Practitioner as valid _type parameters. This works internally by querying using a _has parameter

#3563

Added search parameter modifier :nickname that can be used with 'name' or 'given' search parameters. E.g. ?Patient?given:nickname=Kenny will match a patient with the given name Kenneth. Also added MDM matching algorithm named NICKNAME that matches based this.

#3468

The resource JSON can now be stored and retrieved in the Lucene/Elasticsearch index. This enables some queries to provide results without using the database. This is enabled via DaoConfig.setStoreResourceInLuceneIndex()

#3478

When using JPA persistence with Hibernate Search (Lucene or Elasticsearch), simple FHIR queries that can be satisfied completely by Hibernate Search no longer query the database. Before, every search involved the database, even when not needed. This is faster when there are many results.

#3482

When updating or reindexing a resource on a JPA server where indexing search param presence is enabled (i.e. support for the :missing modifier), updates will try to reuse existing database rows where possible instead of deleting one row and adding another. This should cause a slight performance boost systems with this feature enabled.

#2843

Reverting the change to treat canonical references as local when setting the flag getTreatBaseUrlsAsLocal(). This was added to address a limitation in _include that did not process references by canonical URLs. The _include search operation now includes canonical references without special configuration.

#3460

Previously, during RepositoryValidation, we would perform validation on resources created via DaoConfig's setAutoCreatePlaceholderReferenceTargets property. This caused validation failures on placeholder resources as they do not conform to any profile. This has been changed, and Repository Validation will not occur on any resource containing an extension with URL http://hapifhir.io/fhir/StructureDefinition/resource-placeholder`.

#3506

Changing the MDM logging to contain scores for each applied matcher field. Deleting summary score when creating MDM link.

#3529

Several classes and interfaces related to the $expunge operation have moved from the hapi-fhir-jpaserver-base project to the hapi-fhir-storage project.

#3534

Ensure that migration steps do not timeout. Adding an index, and other migration steps can take exceed the default connection timeout. This has been changed - migration steps now have no timeout and will run until completion.

#3550

Method signatures on several interfaces and classes related to the $expunge operation have changed to support the case where the primary identifier of a resource is not necessarily a Long.

#3568

Modified operation method binding so that later registered custom providers take precedence over earlier registered ones. In particular, this means that custom operations can now override built-in operations.

#3569

The normalized and exact string database indexes have been changed to provide faster string searches.

#3570

The tag indexes have been changed to provide faster tag searches.

#3571

Hibernate search has been updated to 6.1.4, which adds support for Elasticsearch 7.16.X. Previous installations running on 7.10.X will continue to work normally, and this change does not require you to upgrade your elasticsearch service.

#1466

The XML and JSON Parsers are now encoding narratives of contained resources. Narratives were skipped before for contained resources. This was a rule which was only valid in STU1 (https://www.hl7.org/fhir/DSTU1/narrative.html), and was removed in DSTU2+

#2588

Include property regex operation was not working when expanding ValueSet. This is now fixed

#3065

A regression in HAPI FHIR 5.5.0 meant that very large transactions where the bundle contained over 1000 distinct client-assigned resource IDs could fail on MSSQL and Oracle due to SQL parameter count limitations.

#3256

An occasional concurrency failure in AuthorizationInterceptor has been resolved. Thanks to Martin Visser for reporting and providing a reproducible test case!

#3261

When performing a search with a _revinclude. the results sometimes incorrectly included resources that were reverse included by other search parameters with the same name. Thanks to GitHub user @vivektk84 for reporting and to Jean-Francois Briere for proposing a fix.

#3346

When searching for date search parameters on Postgres, ordinals could sometimes be represented as strings, causing a search failure. This has been corrected.

#3387

A race condition in the Subscription processor meant that a Subscription could fail to register right away if it was modified immediately after being created. Note that this issue only affects rapid changes, and only caused the subscription to be unregistered for a maximum of one minute after its initial creation so the impact of this issue is expected to be low.

#3392

When cross-partition reference Mode is used, the rest-hook subscriptions on a partition enabled server would cause a NPE. Cause of this is from the reloading of the subscription when the server is restarted. This issue has been fixed. Also fixed issue with revinclude for rest-hook subscription not working.

#3421

ValueSet pre-expansion was failing when number of concepts was larger than configured BooleanQuery.maxClauseCount value (default is 1024). This is now fixed.

#3423

Fixed a bug when searching for the resource persistent id in the partitioned environment. This happens when the Cross-Partition Reference Mode is set to ALLOWED_UNQUALIFIED and it is searching for the wrong partition id and resulted in resource persistent id not found.

#3418

Updated the FHIR core libs to 5.6.36 to support fix for funcReplace in FHIRPathEngine.

#3436

A regression in HAPI FHIR 5.7.0 meant that when UnknownCodeSystemWarningValidationSupport was configured for WARNING behaviour, validating a field with an implicit code system could incorrectly result in an error.

#3441

Reindexing jobs were not respected the passed in date range in SearchParams. We now take date these date ranges into account when running re-indexing jobs.

#3469

Previously, or expressions were not being properly validated in FHIRPath in STU3 due to a bug with expression path splitting. This has been corrected.

#3486

When doing package upload, all resources were filtered by status=active. That is inappropriate for some types. For Subscription, we need to check if the value is requested, for DocumentReference and Communication other values outside the expected active and not active also exist. This change adds a check for those types of resources other than the one normally done for active matching value.

#3493

Previously the Fhir parser would only set the resource type on the resource ID for resources which implemented IDomainResource. This caused a few resource types to be missed. This has been corrected, and resource type is now set on the id element for all IBaseResource instances instead.

#3504

Previously, allowing any client assigned ID by setting ClientIdStrategyEnum to ANY threw an exception when creating CodeSystem resources. This has been corrected.

#3515

Supporting expansion of ValueSet include/exclude system URI expressed in canonical format during validation.

#3524

Previously if partitioning was enabled, the URL returned from $export-poll-status provided a location in the wrong partition. This has been fixed and all Bulk Exports will be stored in the DEFAULT partition.

#3530

TerserUtil.mergeAllFields() threw an exception when cloning contained resources. This has been corrected.

#3553

Added a new setting to BinaryStorageInterceptor which allows you to disable binary de-externalization during resource reads.

#3561

Previously, Bulk export jobs automatically cleared the collection after a hardcoded 2 hour time period from start of the job. This is now configurable via a new DaoConfig property, setBulkExportFileRetentionPeriodHours(). If this is set to a value of 0 or below, then the collections will never be expired.

#3578

The tag index migration failed on Postres and Oracle. These have been fixed.

#3579

Mdm was not excluding NO_MATCH from golden-resource candidates in eid mode. This caused mdm to produce an error when a Patient eid is changed after that patient's link was updated to NO_MATCH. This has been corrected

#3584

Unmodified string searches and string :contains search were incorrectly case-sensitive when configured with recent versions of Lucene/Elasticsearch. This has been corrected.

#3586

While converting the reindexing job to the new batch framework, a regression of #3441 was introduced. Reindexing jobs were not respecting the passed in _lastUpdated parameter. We now take date these date ranges into account when running re-indexing jobs.

#3590

When searching with the _lastUpdated parameter and using the ne prefix, search would fail with HAPI-1928 error. This has been fixed.

#3592

Command-line log output now only sends colour commands if output is being printed to a console. Otherwise, (e.g. if output is redirected to a file) the log output will not contain any special colour escape characters.

#3602

New batch job implementation (batch2) were staying on IN_PROGRESS status after being cancelled. That is now fixed. After cancellation status is changed to CANCELLED.

#3396

Previously, it was possible to update a resource with wrong tenantID. This issue has been fixed.

#3510

The Spring Framework library was upgraded to version 5.3.18 in order to avoid depending on a version known to be vulnerable to CVE-2022-22965, known as Spring4Shell. HAPI FHIR is not believed to be vulnerable to this issue, but the library has been bumped as a precaution.

1.1.6HAPI FHIR 5.7.6 (Sojourner)

 

Release Information

Released: 2022-07-07

Codename: (Sojourner)

Changes

1.1.7HAPI FHIR 5.7.5 (Sojourner)

 

Release Information

Released: 2022-07-07

Codename: (Sojourner)

Changes

#3065

A regression in HAPI FHIR 5.5.0 meant that very large transactions where the bundle contained over 1000 distinct client-assigned resource IDs could fail on MSSQL and Oracle due to SQL parameter count limitations.

1.1.8HAPI FHIR 5.7.4 (Sojourner)

 

Release Information

Released: 2022-06-03

Codename: (Sojourner)

Changes

#2669

Previously subscriptions in a partition with the id null will be matched against incoming resources from all partitions. Changed to subscriptions will only match against incoming resources in the partition the subscription exists in unless cross partition subscription is enabled and the subscription has the appropriate extension.

1.1.9HAPI FHIR 5.7.3 (Sojourner)

 

Release Information

Released: 2022-05-30

Codename: (Sojourner)

Changes

This version specifically modifies reindex to support moving data from the RES_TEXT to the RES_TEXT_VC column in the HFJ_RES_VER table. This is especially important for PostgreSQL users, as the RES_TEXT column only has an addressable space of about 4 billion resources. Any installation that exceeds this amount of resources stored in the RES_TEXT will experience that the software hangs on attempting to store new resources. In order to avoid this, you should use the DaoConfig#setInlineResourceTextBelowSize setting, and set it to a large non-zero value. This will cause PostgreSQL to not store the resource text as a LOB, but instead as a VARCHAR field. By default, this field has length 4000, but you can and should update it by following the documentation here.

#3654

UPDATE: This change has breen removed. Previous content was: 'Modify reindexing to migrate data HFJ_RES_VER data from the RES_TEXT column to the RES_TEXT_VC if the resource's size falls inside of the configuration defined in DaoConfig's getInlineResourceTextBelowSize property.'

1.1.10HAPI FHIR 5.7.2 (Sojourner)

 

Release Information

Released: 2022-03-31

Codename: (Sojourner)

Changes

#3514

Bump the version of Spring Core to 5.3.18 to avoid CVE-2022-22963

1.1.11HAPI FHIR 5.7.1 (Sojourner)

 

Release Information

Released: 2022-03-09

Codename: (Sojourner)

Changes

#3460

Previously, during RepositoryValidation, we would perform validation on resources created via DaoConfig's setAutoCreatePlaceholderReferenceTargets property. This caused validation failures on placeholder resources as they do not conform to any profile. This has been changed, and Repository Validation will not occur on any resource containing an extension with URL http://hapifhir.io/fhir/StructureDefinition/resource-placeholder`.

1.1.12HAPI FHIR 5.7.0 (Sojourner)

 

Release Information

Released: 2022-02-17

Codename: (Sojourner)

Changes

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

  • log4j-api (JPA): 2.11.1 -> 2.17.1 (Addresses CVE-2021-44228 - HAPI FHIR was not vulnerable to this issue but this upgrade avoids unnecessary OWASP scan notices)
  • SLF4j (All): 1.7.30 -> 1.7.33
  • Logback (All): 1.2.8 -> 1.2.10
  • Commons-IO (All): 2.8.0 -> 2.11.0
  • Jackson (All): 2.13.0 -> 2.13.1
  • Guava (All): 30.1.1-jre -> 31.0.1-jre
  • JDOM (XML Patch Support): 2.0.6 -> 2.0.6.1 (Addresses CVE-2021-33813)
  • Spring (JPA): 5.3.7 -> 5.3.15
  • Spring (JPA): 5.3.7 -> 5.3.15
  • Spring-Data (JPA): 2.5.0 -> 2.6.1
  • Hibernate ORM (JPA): 5.4.30.Final -> 5.6.2.Final
  • Flyway (JPA): 6.5.4 -> 8.4.1
  • Sqlbuilder (JPA): 3.0.1 -> 3.0.2
  • H2 (JPA): 1.4.200 -> 2.1.210 (Note that this change requires the use of the HapiFhirH2Dialect instead of the built-in Hibernate H2Dialect due to Hibernate issue HHH-15002
  • Commons-DBCP2 (JPA): .8.0 -> .8.0 -> 2.9.0
  • Swagger-Models (OpenAPI Support): 2.1.7 -> 2.1.12
  • Thymeleaf (Testpage Overlay): 3.0.12.RELEASE -> 3.0.14.RELEASE (Addresses CVE-2021-43466)
  • Commons-CLI (CLI): 1.4 -> 1.5.0
  • JANSI (CLI): 2.3.2 -> 2.4.0
  • Jetty Server (CLI): 9.4.43.v20210629 -> 9.4.44.v20210927
  • Spring Boot (Boot): 2.5.0 -> 2.6.2
  • Swagger UI (OpenAPI): 3.46.0 -> 4.1.3
  • Resteasy (JAX-RS): 4.0.0.Beta3 -> 5.0.2.Final
  • Postgresql (JPA): 42.3.1 -> 42.3.2
  • Spring Security Oauth2(Oauth): 2.0.2.RELEASE -> 2.0.17.RELEASE

#1892

In the JPA server, the token :of-type modifier is now supported. This is an optional feature and must be explicitly enabled (default is disabled).

#2480

Added partition support for subscriptions. Subscriptions will now only match resource from the same partition

New configuration option added to validate bundle resources concurrently. Also new configuration added to skip validation of contained resources.

#2718

Added support for cross-partition subscriptions. Subscription in the default partition can now listen to resource changes from all partitions

#2838

The resource contents are optionally added to the lucene index so $lastn queries can be satisfied without database access. This is activated by the DaoConfig 'StoreResourceInLuceneIndex' property.

#3120

Added http://hapifhir.io/fhir/StructureDefinition/subscription-delivery-retry-count extension that can be provided to a subscription to define a specific retry strategy (retry retry-count number of times before giving up).

#3136

Provided a Remote Terminology Service implementation for the $validate-code Operation.

#3158

Add the concept of messageKey to the BaseResourceMessage class. This is to support brokers which permit key-based partitioning.

#3243

Allow Rest Hook subscriptions to be configured to send delete requests.

#3347

Added ability to load Implementation Guide packages from filesystem by supporting the file:/ syntax of url.

#1892

A redundant set of hash calculations in the JPA server was eliminated.

#3197

A number of minor optimizations have been added to the JsonParser serializer module as well as to the transaction processor. These optimizations lead to a significant performance improvement when processing large transaction bundles (i.e. transaction bundles containing a larger number of entries).

#3197

A new configuration option has been added to ParserOptions called setAutoContainReferenceTargetsWithNoId. This setting disables the automatic creation of contained resources in cases where the target/contained resource is set to a Reference instance but not actually added to the Resource.contained list. Disabling this automatic containing yields a minor performance improvement in systems that do not need this functionality.

Improved validation performance by switching validation serialization from XML to JSON.

#3153

Significantly improved $delete-expunge performance by adding database indexes, and filtering needed foreign keys to delete by resource type.

#3267

A new JPA setting has been added to DaoConfig settings called Inline Resource Text Below Size. When this setting is set to a positive value, any resources with a total serialized length smaller than the given number will be stored as an inline VARCHAR2 text value on the HFJ_RES_VER table, instead of using an external LOB column. This improves read/write performance (often by a significant amount) at the expense of a slightly larger amount of disk usage.

#3312

Improves the performance of the query for searching by chained search parameter when the Index Contained Resources feature is enabled.

#3327

Improved performance of validating resources when skip contained resources is enabled.

#3158

Previously in configuring MDM, you were only allowed to set a single eidSystem which was global regardless of how many resource types you were performing MDM on. This has been changed. That field is now deprecated, and a new field called eidSystems (a json object) should be used instead. This will allow you to have granular control over which resource types use which EIDs. See the documentation of eidSystems for more information.

#3198

Fixed a regression where packages would fail to load if HAPI-FHIR was operating in DATABASE binary storage mode.

#3205

These changes are related to bumping the dependency on org.hl7.fhir.core to version 5.3.0. The main updates that resulted in the majority of the changes in this PR were the addition of the interface IValidationPolicyAdvisor, and the refactoring of some of the main validation classes (for cleaning purposes). Also, many of the error messages were updated, so the resulting tests in HAPI had to be modified to reflect these message changes. In regard to the new interface IValidationPolicyAdvisor, by implementing this interface and passing it through the validation context in HAPI to the InstanceValidator in the core libraries, users can now control the behavior of the validator when validating references, contained resources, and coded content. Previously, only references were controlled in this way, and users controlled this by overriding the validation fetcher. Test cases were added in the validation test cases repository to demonstrate it's functionality. In particular, the two test cases contained-resource-bad-id, and contained-resource-bad-id-ignore. The definitions and expected outcomes of these test cases are in the manifest.json in that repository.

Add email configuration to MailSvc constructor

#3379

Removed the following modules from the HAPI-FHIR project: hapi-fhir-testpage-interceptor, hapi-fhir-structures-dstu, hapi-fhir-oauth2, hapi-fhir-narrativegenerator.

#2377

Calling the $document operation previously omitted the fullUrl of the bundle entries. This has been corrected.

When a subscription fails to activate (either on the first attempt or on start up), hapi-fhir will log the exception, set the subscription to ERROR state, and continue on. This is to prevent hanging on startup for errors that cannot be resolved by infinite retries.

$member-match operation was allowed to be invoked by GET when it shouldn't have. That is fixed. Operation can only be invoked by POST request

#2720

Using the delivery option: Payload Search Result Mode for rest-rook subscriptions on a partition enabled server would cause a NPE. This issue has been fixed.

#3108

Code System deletion background tasks were taking over a day to complete on very large CodeSystems for PostgreSQL, SQL Server and Oracle databases. That was improved now taking less than an hour in all three platforms

#3145

RequestValidatingInteceptor incorrectly prevented GraphQL requests from being submitted using the HTTP POST form of the GraphQL operation.

#3153

Updated UnknownCodeSystemWarningValidationSupport to allow the throwing of warnings if configured to do so.

#3158

Resource links were previously not being consistently created in cases where references were versioned and pointing to recently auto-created placeholder resources.

Fixed a serious performance issue with the $reindex operation.

In servers with a large number of StructureDefinition resources loaded, occasionally a call for the CapabilityStatement could take a very long time to return. This has been corrected.

#3215

$everything operation returns a 500 error when querying for a page when _getpagesoffset is greater than or equal to 300. This has been corrected.

MDM was throwing a NullPointerException when upgrading a match from POSSIBLE_MATCH to MATCH. This has been corrected.

#3242

Fixed bug that caused queries that checked Elasticsearch when setting _total=accurate searches to return all values when using _content or _text parameters

Terminology reindexing job was launching the wrong process, so terminology reindexing was never launched. This has been fixed.

#3266

Concurrent validation failed with StringIndexOutOfBoundsException when the validation location did not contain a '.'. This has been corrected.

#3275

In rare cases where patient ID String happened to have hashCode equal to Integer.MIN_VALUE, PatientIdPartitionInterceptor would generate an invalid partition ID. This has been fixed.

#3295

When $mdm-clear operation batch was split into multiple threads, ResourceVersionConflictExceptions were being thrown. This issue has been fixed.

Conformance validation should happen once per client-endpoint, no matter the number of threads executing the requests, but was happening once per client-endpoint-thread. This is now fixed.

#3314

Previously, $binary-access-read and other operations that return neither method outcomes nor resources were causing no invocation of the SERVER_OUTGOING_RESPONSE pointcut. This has been corrected, and those operations will now correctly invoke SERVER_OUTGOING_RESPONSE.

#3322

GraphQL searches cannot be executed when number of matching results exceeds default page size. This has been corrected.

#3325

In HAPI FHIR 5.6.0, a regression meant that JPA server FHIR transactions containing two identical conditional operations (for example, a transaction with two conditional create operations where the conditional URL was identical for both) could result in resources being saved in an inconsistent state. This scenario will now be result in the server returning an HTTP 400 error instead. Note that there is no meaning defined in the FHIR specification for duplicate entries in a FHIR transaction bundle, so it has never been recommended to do this.

#3331

The JPA server will now validate _include and _revinclude statements before beginning search processing. This prevents an ugly JPA error when some invalid params are used.

#3371

Enhanced Lucene Indexing failed when indexing contained resources. Contained resources are not indexed in Lucene/Elasticsearch, but this no longer causes an exception.

#3374

Chained searches will handle common search parameters correctly when the Index Contained Resources configuration parameter is enabled.

#3392

When cross-partition reference Mode is used, the rest-hook subscriptions on a partition enabled server would cause a NPE. Cause of this is from the reloading of the subscription when the server is restarted. This issue has been fixed. Also fixed issue with revinclude for rest-hook subscription not working.

#3394

Bulk export permissions were over-permissive in RuleBulkExportImpl. This has been corrected.

#1892

In the JPA server, searching using the token :text modifier will no longer index and match values in Identifier.type.text. Previously we indexed this element, but the FHIR specification does not actually show this field as being indexed for this modifier, and intuitively it doesn't make sense to do so.

1.1.13HAPI FHIR 5.6.4 (Raccoon)

 

Release Information

Released: 2022-07-07

Codename: (Raccoon)

Changes

#3256

An occasional concurrency failure in AuthorizationInterceptor has been resolved. Thanks to Martin Visser for reporting and providing a reproducible test case!

1.1.14HAPI FHIR 5.6.3 (Raccoon)

 

Release Information

Released: 2022-03-31

Codename: (Raccoon)

Changes

#3514

Bump Spring Core dependency to remove Spring4Shell vulnerability.

1.1.15HAPI FHIR 5.5.7 (Quasar)

 

Release Information

Released: 2022-03-31

Codename: (Quasar)

Changes

Bump Spring Core dependency to 5.3.18 to remove vulnerability.

1.1.16HAPI FHIR 5.5.6 (Quasar)

 

Release Information

Released: 2022-02-11

Codename: (Quasar)

Changes

#3374

Chained searches will handle common search parameters correctly when the Index Contained Resources configuration parameter is enabled.

1.1.17HAPI FHIR 5.5.5 (Quasar)

 

Release Information

Released: 2022-01-22

Codename: (Quasar)

Changes

#3312

Improves the performance of the query for searching by chained search parameter when the Index Contained Resources feature is enabled.

1.1.18HAPI FHIR 5.5.0 (Prerelease)

 

Release 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.

Changes

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 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

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

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

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.

#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.

#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.

#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.

#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: