From c8d9bc6dec1d7aff1eba226f5ff4ba8d91e9ea33 Mon Sep 17 00:00:00 2001 From: Andrew Henry Date: Wed, 12 Feb 2025 14:50:22 -0800 Subject: [PATCH] Added timestamp checking for individual criteria --- src/plugins/condition/Condition.js | 6 ++++-- .../condition/criterion/TelemetryCriterion.js | 19 +++++++++++++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/plugins/condition/Condition.js b/src/plugins/condition/Condition.js index a9f6e1828a..3fc3e7fa84 100644 --- a/src/plugins/condition/Condition.js +++ b/src/plugins/condition/Condition.js @@ -87,14 +87,16 @@ export default class Condition extends EventEmitter { // if all the criteria in this condition have no telemetry, we want to force the condition result to evaluate if (this.hasNoTelemetry() || this.isTelemetryUsed(telemetryIdThatChanged)) { + const currentTimeSystemKey = this.openmct.time.getTimeSystem().key; + this.criteria.forEach((criterion) => { if (this.isAnyOrAllTelemetry(criterion)) { criterion.updateResult(latestDataTable, this.conditionManager.telemetryObjects); } else { const relevantDatum = latestDataTable.get(criterion.telemetryObjectIdAsString); - if (relevantDatum !== undefined) { - criterion.updateResult(relevantDatum); + if (criterion.shouldUpdateResult(relevantDatum, currentTimeSystemKey)) { + criterion.updateResult(relevantDatum, currentTimeSystemKey); } } }); diff --git a/src/plugins/condition/criterion/TelemetryCriterion.js b/src/plugins/condition/criterion/TelemetryCriterion.js index ae377f4da5..477a920456 100644 --- a/src/plugins/condition/criterion/TelemetryCriterion.js +++ b/src/plugins/condition/criterion/TelemetryCriterion.js @@ -29,16 +29,22 @@ import { getOperatorText, OPERATIONS } from '../utils/operations.js'; import { checkIfOld } from '../utils/time.js'; export default class TelemetryCriterion extends EventEmitter { + #lastUpdated; + #lastTimeSystem; + /** * Subscribes/Unsubscribes to telemetry and emits the result * of operations performed on the telemetry data returned and a given input value. * @constructor * @param telemetryDomainObjectDefinition {id: uuid, operation: enum, input: Array, metadata: string, key: {domainObject.identifier} } - * @param openmct + * @param {import('../../../MCT.js').OpenMCT} openmct */ constructor(telemetryDomainObjectDefinition, openmct) { super(); + /** + * @type {import('../../../MCT.js').MCT} + */ this.openmct = openmct; this.telemetryDomainObjectDefinition = telemetryDomainObjectDefinition; this.id = telemetryDomainObjectDefinition.id; @@ -179,8 +185,15 @@ export default class TelemetryCriterion extends EventEmitter { return datum; } + shouldUpdateResult(datum, timesystem) { + const dataIsDefined = datum !== undefined; + const hasTimeSystemChanged = + this.#lastTimeSystem === undefined || this.#lastTimeSystem !== timesystem; + const isCacheStale = this.#lastUpdated === undefined || datum[timesystem] > this.#lastUpdated; - updateResult(data) { + return dataIsDefined && (hasTimeSystemChanged || isCacheStale); + } + updateResult(data, currentTimeSystemKey) { const validatedData = this.isValid() ? data : {}; if (!this.isStalenessCheck()) { @@ -193,6 +206,8 @@ export default class TelemetryCriterion extends EventEmitter { } else { this.result = this.computeResult(validatedData); } + this.#lastUpdated = data[currentTimeSystemKey]; + this.#lastTimeSystem = currentTimeSystemKey; } }