Skip to content

Commit

Permalink
Merge pull request #439 from epicadk/ak/date_index_fix
Browse files Browse the repository at this point in the history
Bug : Fix date indexing
  • Loading branch information
jingtang10 committed Apr 19, 2021
2 parents 1e9fe1c + 268b78c commit 1992c7a
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import org.hl7.fhir.r4.model.ResourceType
@Entity(
indices =
[
Index(value = ["resourceType", "index_name", "index_tsHigh", "index_tsLow"]),
Index(value = ["resourceType", "index_name", "index_from", "index_to"]),
Index(
// keep this index for faster foreign lookup
value = ["resourceId", "resourceType"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,8 @@ internal object ResourceIndexer {
DateIndex(
name = "_lastUpdated",
path = arrayOf(resource.fhirType(), "meta", "lastUpdated").joinToString(separator = "."),
tsHigh = lastUpdatedElement.value.time,
tsLow = lastUpdatedElement.value.time,
temporalPrecision = lastUpdatedElement.precision
from = lastUpdatedElement.value.time,
to = lastUpdatedElement.precision.add(lastUpdatedElement.value, 1).time
)
)
}
Expand All @@ -124,8 +123,7 @@ internal object ResourceIndexer {
searchParam.name,
searchParam.path,
date.value.time,
date.value.time,
date.precision
date.precision.add(date.value, 1).time
)
}
"dateTime" -> {
Expand All @@ -134,44 +132,31 @@ internal object ResourceIndexer {
searchParam.name,
searchParam.path,
dateTime.value.time,
dateTime.value.time,
dateTime.precision
dateTime.precision.add(dateTime.value, 1).time
)
}
// No need to add precision because an instant is meant to have zero width
"instant" -> {
val instant = value as InstantType
DateIndex(
searchParam.name,
searchParam.path,
instant.value.time,
instant.value.time,
instant.precision
)
DateIndex(searchParam.name, searchParam.path, instant.value.time, instant.value.time)
}
"Period" -> {
val period = value as Period
DateIndex(
searchParam.name,
searchParam.path,
if (period.hasEnd()) period.end.time else Long.MAX_VALUE,
if (period.hasStart()) period.start.time else Long.MIN_VALUE,
when {
(period.hasEnd() and period.hasStart()) ->
maxOf(period.startElement.precision, period.endElement.precision)
(period.hasEnd()) -> period.endElement.precision
(period.hasStart()) -> period.startElement.precision
else -> DateTimeType.DEFAULT_PRECISION
}
if (period.hasStart()) period.start.time else 0,
if (period.hasEnd()) period.endElement.precision.add(period.end, 1).time
else Long.MAX_VALUE
)
}
"Timing" -> {
val timing = value as Timing
DateIndex(
searchParam.name,
searchParam.path,
timing.event.maxOf { it.value.time },
timing.event.minOf { it.value.time },
timing.event.maxOf { it.precision }
timing.event.maxOf { it.precision.add(it.value, 1).time }
)
}
else -> null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@

package com.google.android.fhir.index.entities

import ca.uhn.fhir.model.api.TemporalPrecisionEnum

/**
* An index record for a date value in a resource.
*
Expand All @@ -28,13 +26,14 @@ internal data class DateIndex(
val name: String,
/** The path of the date index, e.g. "Patient.birthdate". */
val path: String,
/** The high timestamp. */
val tsHigh: Long,
/** The low timestamp. */
val tsLow: Long,
/**
* The smallest value we can unambiguously resolve the date to. This is an indication to clients
* that any part of the timestamp smaller than the [temporalPrecision] should be ignored.
* The lower bound or start time of the date value. This is a closed interval and the value is
* included
*/
val from: Long,
/**
* The upper bound or end time of the date value. This is an open interval and the value is
* excluded
*/
val temporalPrecision: TemporalPrecisionEnum
val to: Long
)
Original file line number Diff line number Diff line change
Expand Up @@ -218,9 +218,8 @@ class ResourceIndexerTest {
DateIndex(
"date",
"Observation.effective",
periodElement.end.time,
periodElement.start.time,
periodElement.startElement.precision
periodElement.endElement.precision.add(periodElement.end, 1).time
)
)
}
Expand All @@ -235,8 +234,7 @@ class ResourceIndexerTest {
"date",
"Observation.effective",
dateTimeTypeElement.value.time,
dateTimeTypeElement.value.time,
dateTimeTypeElement.precision
dateTimeTypeElement.precision.add(dateTimeTypeElement.value, 1).time
)
)
}
Expand All @@ -250,9 +248,8 @@ class ResourceIndexerTest {
DateIndex(
"date",
"Observation.effective",
timingElement.event.maxOf { it.value.time },
timingElement.event.minOf { it.value.time },
timingElement.event.maxOf { it.precision }
timingElement.event.maxOf { it.precision.add(it.value, 1).time }
)
)
}
Expand All @@ -266,8 +263,7 @@ class ResourceIndexerTest {
"date",
"Observation.effective",
instantElement.value.time,
instantElement.value.time,
instantElement.precision
instantElement.value.time
)
)
}
Expand Down Expand Up @@ -333,9 +329,8 @@ class ResourceIndexerTest {
DateIndex(
"birthdate",
"Patient.birthDate",
birthDateElement.getValue().getTime(),
birthDateElement.getValue().getTime(),
birthDateElement.getPrecision()
birthDateElement.value.time,
birthDateElement.precision.add(birthDateElement.value, 1).time
)
)
}
Expand All @@ -350,8 +345,7 @@ class ResourceIndexerTest {
"_lastUpdated",
"Patient.meta.lastUpdated",
lastUpdatedElement.getValue().getTime(),
lastUpdatedElement.getValue().getTime(),
lastUpdatedElement.getPrecision()
lastUpdatedElement.precision.add(lastUpdatedElement.getValue(), 1).time
)
)
}
Expand Down

0 comments on commit 1992c7a

Please sign in to comment.