Add flag to DaoConfig controlling behaviour
This commit is contained in:
parent
97c98254d0
commit
f56e38148b
|
@ -3,6 +3,7 @@ package ca.uhn.fhir.jpa.dao;
|
||||||
import ca.uhn.fhir.jpa.interceptor.CascadingDeleteInterceptor;
|
import ca.uhn.fhir.jpa.interceptor.CascadingDeleteInterceptor;
|
||||||
import ca.uhn.fhir.jpa.model.entity.ModelConfig;
|
import ca.uhn.fhir.jpa.model.entity.ModelConfig;
|
||||||
import ca.uhn.fhir.jpa.model.entity.ResourceEncodingEnum;
|
import ca.uhn.fhir.jpa.model.entity.ResourceEncodingEnum;
|
||||||
|
import ca.uhn.fhir.jpa.model.entity.ResourceIndexedSearchParamDate;
|
||||||
import ca.uhn.fhir.jpa.search.warm.WarmCacheEntry;
|
import ca.uhn.fhir.jpa.search.warm.WarmCacheEntry;
|
||||||
import ca.uhn.fhir.jpa.searchparam.SearchParamConstants;
|
import ca.uhn.fhir.jpa.searchparam.SearchParamConstants;
|
||||||
import ca.uhn.fhir.rest.api.SearchTotalModeEnum;
|
import ca.uhn.fhir.rest.api.SearchTotalModeEnum;
|
||||||
|
@ -99,6 +100,10 @@ public class DaoConfig {
|
||||||
*/
|
*/
|
||||||
private boolean myAllowInlineMatchUrlReferences = true;
|
private boolean myAllowInlineMatchUrlReferences = true;
|
||||||
private boolean myAllowMultipleDelete;
|
private boolean myAllowMultipleDelete;
|
||||||
|
/**
|
||||||
|
* Update setter javadoc if default changes.
|
||||||
|
*/
|
||||||
|
private boolean myUseOrdinalDatesForDayPrecisionSearches = true;
|
||||||
/**
|
/**
|
||||||
* update setter javadoc if default changes
|
* update setter javadoc if default changes
|
||||||
*/
|
*/
|
||||||
|
@ -1907,6 +1912,44 @@ public class DaoConfig {
|
||||||
setPreExpandValueSetsDefaultCount(Math.min(getPreExpandValueSetsDefaultCount(), getPreExpandValueSetsMaxCount()));
|
setPreExpandValueSetsDefaultCount(Math.min(getPreExpandValueSetsDefaultCount(), getPreExpandValueSetsMaxCount()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Should searches use the integer field {@code SP_VALUE_LOW_DATE_ORDINAL} and {@code SP_VALUE_HIGH_DATE_ORDINAL} in
|
||||||
|
* {@link ca.uhn.fhir.jpa.model.entity.ResourceIndexedSearchParamDate} when resolving searches where all predicates are using
|
||||||
|
* precision of {@link ca.uhn.fhir.model.api.TemporalPrecisionEnum#DAY}.
|
||||||
|
*
|
||||||
|
* For example, if enabled, the search of {@code Observation?date=2020-02-25} will cause the date to be collapsed down to an
|
||||||
|
* ordinal {@code 20200225}. It would then be compared against {@link ResourceIndexedSearchParamDate#getValueLowDateOrdinal()}
|
||||||
|
* and {@link ResourceIndexedSearchParamDate#getValueHighDateOrdinal()}
|
||||||
|
* </p>
|
||||||
|
* Default is {@literal true} beginning in HAPI FHIR 4.3.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @since 4.3
|
||||||
|
*/
|
||||||
|
public void setUseOrdinalDatesForDayPrecisionSearches(boolean theUseOrdinalDates) {
|
||||||
|
myUseOrdinalDatesForDayPrecisionSearches = theUseOrdinalDates;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Should searches use the integer field {@code SP_VALUE_LOW_DATE_ORDINAL} and {@code SP_VALUE_HIGH_DATE_ORDINAL} in
|
||||||
|
* {@link ca.uhn.fhir.jpa.model.entity.ResourceIndexedSearchParamDate} when resolving searches where all predicates are using
|
||||||
|
* precision of {@link ca.uhn.fhir.model.api.TemporalPrecisionEnum#DAY}.
|
||||||
|
*
|
||||||
|
* For example, if enabled, the search of {@code Observation?date=2020-02-25} will cause the date to be collapsed down to an
|
||||||
|
* integer representing the ordinal date {@code 20200225}. It would then be compared against {@link ResourceIndexedSearchParamDate#getValueLowDateOrdinal()}
|
||||||
|
* and {@link ResourceIndexedSearchParamDate#getValueHighDateOrdinal()}
|
||||||
|
* </p>
|
||||||
|
* Default is {@literal true} beginning in HAPI FHIR 4.3.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @since 4.3
|
||||||
|
*/
|
||||||
|
public boolean getUseOrdinalDatesForDayPrecisionSearches() {
|
||||||
|
return myUseOrdinalDatesForDayPrecisionSearches;
|
||||||
|
}
|
||||||
|
|
||||||
public enum StoreMetaSourceInformationEnum {
|
public enum StoreMetaSourceInformationEnum {
|
||||||
NONE(false, false),
|
NONE(false, false),
|
||||||
SOURCE_URI(true, false),
|
SOURCE_URI(true, false),
|
||||||
|
|
|
@ -140,7 +140,9 @@ public class PredicateBuilderDate extends BasePredicateBuilder implements IPredi
|
||||||
|
|
||||||
DateParam lowerBound = theRange.getLowerBound();
|
DateParam lowerBound = theRange.getLowerBound();
|
||||||
DateParam upperBound = theRange.getUpperBound();
|
DateParam upperBound = theRange.getUpperBound();
|
||||||
boolean isOrdinalComparison = isNullOrDayPrecision(lowerBound) && isNullOrDayPrecision(upperBound);
|
Integer lowerBoundAsOrdinal = theRange.getLowerBoundAsDateInteger();
|
||||||
|
Integer upperBoundAsOrdinal = theRange.getUpperBoundAsDateInteger();
|
||||||
|
boolean isOrdinalComparison = isNullOrDayPrecision(lowerBound) && isNullOrDayPrecision(upperBound) && myDaoConfig.getUseOrdinalDatesForDayPrecisionSearches();
|
||||||
Predicate lt = null;
|
Predicate lt = null;
|
||||||
Predicate gt = null;
|
Predicate gt = null;
|
||||||
Predicate lb = null;
|
Predicate lb = null;
|
||||||
|
@ -152,7 +154,7 @@ public class PredicateBuilderDate extends BasePredicateBuilder implements IPredi
|
||||||
}
|
}
|
||||||
//im like 80% sure this should be ub and not lb, as it is an UPPER bound.
|
//im like 80% sure this should be ub and not lb, as it is an UPPER bound.
|
||||||
if (isOrdinalComparison) {
|
if (isOrdinalComparison) {
|
||||||
lb = theBuilder.lessThan(theFrom.get("myValueLowDateOrdinal"), theRange.getLowerBoundAsDateInteger());
|
lb = theBuilder.lessThan(theFrom.get("myValueLowDateOrdinal"), lowerBoundAsOrdinal);
|
||||||
} else {
|
} else {
|
||||||
lb = theBuilder.lessThan(theFrom.get("myValueLow"), lowerBoundInstant);
|
lb = theBuilder.lessThan(theFrom.get("myValueLow"), lowerBoundInstant);
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,10 +64,11 @@ public class HapiFhirJpaMigrationTasks extends BaseMigrationTasks<VersionEnum> {
|
||||||
version.onTable("HFJ_RES_VER").modifyColumn("20200220.1", "RES_ID").nonNullable().failureAllowed().withType(BaseTableColumnTypeTask.ColumnTypeEnum.LONG);
|
version.onTable("HFJ_RES_VER").modifyColumn("20200220.1", "RES_ID").nonNullable().failureAllowed().withType(BaseTableColumnTypeTask.ColumnTypeEnum.LONG);
|
||||||
//
|
//
|
||||||
|
|
||||||
// Add support for integer comparisons during day-granularity date search.
|
// Add support for integer comparisons during day-precision date search.
|
||||||
Builder.BuilderWithTableName spidxDate = version.onTable("HFJ_SPIDX_DATE");
|
Builder.BuilderWithTableName spidxDate = version.onTable("HFJ_SPIDX_DATE");
|
||||||
spidxDate.addColumn("20200225.1", "SP_VALUE_LOW_DATE_ORDINAL").nullable().type(BaseTableColumnTypeTask.ColumnTypeEnum.INT);
|
spidxDate.addColumn("20200225.1", "SP_VALUE_LOW_DATE_ORDINAL").nullable().type(BaseTableColumnTypeTask.ColumnTypeEnum.INT);
|
||||||
spidxDate.addColumn("20200225.2", "SP_VALUE_HIGH_DATE_ORDINAL").nullable().type(BaseTableColumnTypeTask.ColumnTypeEnum.INT);
|
spidxDate.addColumn("20200225.2", "SP_VALUE_HIGH_DATE_ORDINAL").nullable().type(BaseTableColumnTypeTask.ColumnTypeEnum.INT);
|
||||||
|
|
||||||
spidxDate.addTask(new CalculateOrdinalDatesTask(VersionEnum.V4_3_0, "20200225.3")
|
spidxDate.addTask(new CalculateOrdinalDatesTask(VersionEnum.V4_3_0, "20200225.3")
|
||||||
.setColumnName("SP_VALUE_LOW_DATE_ORDINAL") //It doesn't matter which of the two we choose as they will both be null.
|
.setColumnName("SP_VALUE_LOW_DATE_ORDINAL") //It doesn't matter which of the two we choose as they will both be null.
|
||||||
.addCalculator("SP_VALUE_LOW_DATE_ORDINAL", t -> ResourceIndexedSearchParamDate.calculateOrdinalValue(t.getDate("SP_VALUE_LOW")))
|
.addCalculator("SP_VALUE_LOW_DATE_ORDINAL", t -> ResourceIndexedSearchParamDate.calculateOrdinalValue(t.getDate("SP_VALUE_LOW")))
|
||||||
|
|
|
@ -111,6 +111,14 @@ public class ResourceIndexedSearchParamDate extends BaseResourceIndexedSearchPar
|
||||||
this.myValueLowDateOrdinal = generateOrdinalDateInteger(theLow);
|
this.myValueLowDateOrdinal = generateOrdinalDateInteger(theLow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getValueLowDateOrdinal() {
|
||||||
|
return myValueLowDateOrdinal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getValueHighDateOrdinal() {
|
||||||
|
return myValueHighDateOrdinal;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@PrePersist
|
@PrePersist
|
||||||
public void calculateHashes() {
|
public void calculateHashes() {
|
||||||
|
|
Loading…
Reference in New Issue