Skip to content
Snippets Groups Projects
Unverified Commit e46a5d8e authored by BMItter's avatar BMItter Committed by GitHub
Browse files

ENFv2 - Adjustments for new tech spec (EXPOSUREAPP-3853) (#1647)


* Added numberOfDaysWithHighRisk and numberOfDaysWithLowRisk

according to new tech spec

* Transformed minimumDistinctEncountersForRisk and mostRecentDateForRisk into extension fun

* typealias for ProtobufRiskLevels

Signed-off-by: default avatarKolya Opahle <k.opahle@sap.com>

Co-authored-by: default avatarKolya Opahle <k.opahle@sap.com>
parent 02e1b5aa
No related branches found
No related tags found
No related merge requests found
......@@ -28,6 +28,7 @@ import org.joda.time.Instant
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton
typealias ProtoRiskLevel = RiskCalculationParametersOuterClass.NormalizedTimeToRiskLevelMapping.RiskLevel
@Singleton
class DefaultRiskLevels @Inject constructor(
......@@ -106,8 +107,7 @@ class DefaultRiskLevels @Inject constructor(
val aggregatedResult = aggregateResults(riskResultsPerWindow)
return aggregatedResult.totalRiskLevel ==
RiskCalculationParametersOuterClass.NormalizedTimeToRiskLevelMapping.RiskLevel.HIGH
return aggregatedResult.totalRiskLevel == ProtoRiskLevel.HIGH
}
override fun isActiveTracingTimeAboveThreshold(): Boolean {
......@@ -345,18 +345,14 @@ class DefaultRiskLevels @Inject constructor(
Timber.d("totalRiskLevel: ${totalRiskLevel.name} (${totalRiskLevel.ordinal})")
// 7. Determine `Date of Most Recent Date with Low Risk`
val mostRecentDateWithLowRisk = mostRecentDateForRisk(
exposureHistory,
RiskCalculationParametersOuterClass.NormalizedTimeToRiskLevelMapping.RiskLevel.LOW
)
val mostRecentDateWithLowRisk =
exposureHistory.mostRecentDateForRisk(ProtoRiskLevel.LOW)
Timber.d("mostRecentDateWithLowRisk: $mostRecentDateWithLowRisk")
// 8. Determine `Date of Most Recent Date with High Risk`
val mostRecentDateWithHighRisk = mostRecentDateForRisk(
exposureHistory,
RiskCalculationParametersOuterClass.NormalizedTimeToRiskLevelMapping.RiskLevel.HIGH
)
val mostRecentDateWithHighRisk =
exposureHistory.mostRecentDateForRisk(ProtoRiskLevel.HIGH)
Timber.d("mostRecentDateWithHighRisk: $mostRecentDateWithHighRisk")
......@@ -372,22 +368,37 @@ class DefaultRiskLevels @Inject constructor(
Timber.d("totalMinimumDistinctEncountersWithHighRisk: $totalMinimumDistinctEncountersWithHighRisk")
// 11. Determine `Number of Days With Low Risk`
val numberOfDaysWithLowRisk =
exposureHistory.numberOfDaysForRisk(ProtoRiskLevel.LOW)
Timber.d("numberOfDaysWithLowRisk: $numberOfDaysWithLowRisk")
// 12. Determine `Number of Days With High Risk`
val numberOfDaysWithHighRisk =
exposureHistory.numberOfDaysForRisk(ProtoRiskLevel.HIGH)
Timber.d("numberOfDaysWithHighRisk: $numberOfDaysWithHighRisk")
return AggregatedRiskResult(
totalRiskLevel,
totalMinimumDistinctEncountersWithLowRisk,
totalMinimumDistinctEncountersWithHighRisk,
mostRecentDateWithLowRisk,
mostRecentDateWithHighRisk
mostRecentDateWithHighRisk,
numberOfDaysWithLowRisk,
numberOfDaysWithHighRisk
)
}
private fun mostRecentDateForRisk(
exposureHistory: List<AggregatedRiskPerDateResult>,
riskLevel: RiskCalculationParametersOuterClass.NormalizedTimeToRiskLevelMapping.RiskLevel
): Instant? = exposureHistory
.filter { it.riskLevel == riskLevel }
.maxOfOrNull { it.dateMillisSinceEpoch }
?.let { Instant.ofEpochMilli(it) }
private fun List<AggregatedRiskPerDateResult>.mostRecentDateForRisk(riskLevel: ProtoRiskLevel): Instant? =
filter { it.riskLevel == riskLevel }
.maxOfOrNull { it.dateMillisSinceEpoch }
?.let { Instant.ofEpochMilli(it) }
private fun List<AggregatedRiskPerDateResult>.numberOfDaysForRisk(riskLevel: ProtoRiskLevel): Int =
filter { it.riskLevel == riskLevel }
.size
private fun aggregateRiskPerDate(
dateMillisSinceEpoch: Long,
......@@ -419,18 +430,14 @@ class DefaultRiskLevels @Inject constructor(
Timber.d("riskLevel: ${riskLevel.name} (${riskLevel.ordinal})")
// 4. Determine `Minimum Distinct Encounters With Low Risk per Date`
val minimumDistinctEncountersWithLowRisk = minimumDistinctEncountersForRisk(
exposureWindowsAndResultForDate,
RiskCalculationParametersOuterClass.NormalizedTimeToRiskLevelMapping.RiskLevel.LOW
)
val minimumDistinctEncountersWithLowRisk =
exposureWindowsAndResultForDate.minimumDistinctEncountersForRisk(ProtoRiskLevel.LOW)
Timber.d("minimumDistinctEncountersWithLowRisk: $minimumDistinctEncountersWithLowRisk")
// 5. Determine `Minimum Distinct Encounters With High Risk per Date`
val minimumDistinctEncountersWithHighRisk = minimumDistinctEncountersForRisk(
exposureWindowsAndResultForDate,
RiskCalculationParametersOuterClass.NormalizedTimeToRiskLevelMapping.RiskLevel.HIGH
)
val minimumDistinctEncountersWithHighRisk =
exposureWindowsAndResultForDate.minimumDistinctEncountersForRisk(ProtoRiskLevel.HIGH)
Timber.d("minimumDistinctEncountersWithHighRisk: $minimumDistinctEncountersWithHighRisk")
......@@ -442,12 +449,8 @@ class DefaultRiskLevels @Inject constructor(
)
}
private fun minimumDistinctEncountersForRisk(
exposureWindowsAndResultForDate: Map<ExposureWindow, RiskResult>,
riskLevel: RiskCalculationParametersOuterClass.NormalizedTimeToRiskLevelMapping.RiskLevel
): Int =
exposureWindowsAndResultForDate
.filter { it.value.riskLevel == riskLevel }
private fun Map<ExposureWindow, RiskResult>.minimumDistinctEncountersForRisk(riskLevel: ProtoRiskLevel): Int =
filter { it.value.riskLevel == riskLevel }
.map { "${it.value.transmissionRiskLevel}_${it.key.calibrationConfidence}" }
.distinct()
.size
......
......@@ -8,5 +8,7 @@ data class AggregatedRiskResult(
val totalMinimumDistinctEncountersWithLowRisk: Int,
val totalMinimumDistinctEncountersWithHighRisk: Int,
val mostRecentDateWithLowRisk: Instant?,
val mostRecentDateWithHighRisk: Instant?
val mostRecentDateWithHighRisk: Instant?,
val numberOfDaysWithLowRisk: Int,
val numberOfDaysWithHighRisk: Int
)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment