mirror of
https://github.com/nasa/openmct.git
synced 2025-05-02 16:53:24 +00:00
Stop evaluation of conditions when one evaluates to true (#3276)
* Stop evaluation of conditions when one evaluates to true * Fix broken test * Fixes broken tests * Addresses review comments - Rename getResult to updateResult * Rename condition getResult to updateResult * Renames condition getResult to updateResult
This commit is contained in:
parent
891fe0a36b
commit
37debefadc
@ -68,7 +68,7 @@ export default class Condition extends EventEmitter {
|
|||||||
this.description = '';
|
this.description = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
getResult(datum) {
|
updateResult(datum) {
|
||||||
if (!datum || !datum.id) {
|
if (!datum || !datum.id) {
|
||||||
console.log('no data received');
|
console.log('no data received');
|
||||||
|
|
||||||
@ -79,9 +79,9 @@ export default class Condition extends EventEmitter {
|
|||||||
|
|
||||||
this.criteria.forEach(criterion => {
|
this.criteria.forEach(criterion => {
|
||||||
if (this.isAnyOrAllTelemetry(criterion)) {
|
if (this.isAnyOrAllTelemetry(criterion)) {
|
||||||
criterion.getResult(datum, this.conditionManager.telemetryObjects);
|
criterion.updateResult(datum, this.conditionManager.telemetryObjects);
|
||||||
} else {
|
} else {
|
||||||
criterion.getResult(datum);
|
criterion.updateResult(datum);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -57,7 +57,9 @@ export default class ConditionManager extends EventEmitter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.telemetryObjects[id] = Object.assign({}, endpoint, {telemetryMetaData: this.openmct.telemetry.getMetadata(endpoint).valueMetadatas});
|
const metadata = this.openmct.telemetry.getMetadata(endpoint);
|
||||||
|
|
||||||
|
this.telemetryObjects[id] = Object.assign({}, endpoint, {telemetryMetaData: metadata ? metadata.valueMetadatas : []});
|
||||||
this.subscriptions[id] = this.openmct.telemetry.subscribe(
|
this.subscriptions[id] = this.openmct.telemetry.subscribe(
|
||||||
endpoint,
|
endpoint,
|
||||||
this.telemetryReceived.bind(this, endpoint)
|
this.telemetryReceived.bind(this, endpoint)
|
||||||
@ -322,8 +324,11 @@ export default class ConditionManager extends EventEmitter {
|
|||||||
let timestamp = {};
|
let timestamp = {};
|
||||||
timestamp[timeSystemKey] = normalizedDatum[timeSystemKey];
|
timestamp[timeSystemKey] = normalizedDatum[timeSystemKey];
|
||||||
|
|
||||||
this.conditions.forEach(condition => {
|
//We want to stop when the first condition evaluates to true.
|
||||||
condition.getResult(normalizedDatum);
|
this.conditions.some((condition) => {
|
||||||
|
condition.updateResult(normalizedDatum);
|
||||||
|
|
||||||
|
return condition.result === true;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.updateCurrentCondition(timestamp);
|
this.updateCurrentCondition(timestamp);
|
||||||
|
@ -149,7 +149,7 @@ describe("The condition", function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("gets the result of a condition when new telemetry data is received", function () {
|
it("gets the result of a condition when new telemetry data is received", function () {
|
||||||
conditionObj.getResult({
|
conditionObj.updateResult({
|
||||||
value: '0',
|
value: '0',
|
||||||
utc: 'Hi',
|
utc: 'Hi',
|
||||||
id: testTelemetryObject.identifier.key
|
id: testTelemetryObject.identifier.key
|
||||||
@ -158,7 +158,7 @@ describe("The condition", function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("gets the result of a condition when new telemetry data is received", function () {
|
it("gets the result of a condition when new telemetry data is received", function () {
|
||||||
conditionObj.getResult({
|
conditionObj.updateResult({
|
||||||
value: '1',
|
value: '1',
|
||||||
utc: 'Hi',
|
utc: 'Hi',
|
||||||
id: testTelemetryObject.identifier.key
|
id: testTelemetryObject.identifier.key
|
||||||
@ -167,14 +167,14 @@ describe("The condition", function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("keeps the old result new telemetry data is not used by it", function () {
|
it("keeps the old result new telemetry data is not used by it", function () {
|
||||||
conditionObj.getResult({
|
conditionObj.updateResult({
|
||||||
value: '0',
|
value: '0',
|
||||||
utc: 'Hi',
|
utc: 'Hi',
|
||||||
id: testTelemetryObject.identifier.key
|
id: testTelemetryObject.identifier.key
|
||||||
});
|
});
|
||||||
expect(conditionObj.result).toBeTrue();
|
expect(conditionObj.result).toBeTrue();
|
||||||
|
|
||||||
conditionObj.getResult({
|
conditionObj.updateResult({
|
||||||
value: '1',
|
value: '1',
|
||||||
utc: 'Hi',
|
utc: 'Hi',
|
||||||
id: '1234'
|
id: '1234'
|
||||||
|
@ -122,7 +122,7 @@ export default class AllTelemetryCriterion extends TelemetryCriterion {
|
|||||||
return datum;
|
return datum;
|
||||||
}
|
}
|
||||||
|
|
||||||
getResult(data, telemetryObjects) {
|
updateResult(data, telemetryObjects) {
|
||||||
const validatedData = this.isValid() ? data : {};
|
const validatedData = this.isValid() ? data : {};
|
||||||
|
|
||||||
if (validatedData) {
|
if (validatedData) {
|
||||||
|
@ -120,7 +120,7 @@ export default class TelemetryCriterion extends EventEmitter {
|
|||||||
return datum;
|
return datum;
|
||||||
}
|
}
|
||||||
|
|
||||||
getResult(data) {
|
updateResult(data) {
|
||||||
const validatedData = this.isValid() ? data : {};
|
const validatedData = this.isValid() ? data : {};
|
||||||
if (this.isStalenessCheck()) {
|
if (this.isStalenessCheck()) {
|
||||||
if (this.stalenessSubscription) {
|
if (this.stalenessSubscription) {
|
||||||
@ -201,7 +201,9 @@ export default class TelemetryCriterion extends EventEmitter {
|
|||||||
let metadataObject;
|
let metadataObject;
|
||||||
if (metadata) {
|
if (metadata) {
|
||||||
const telemetryMetadata = this.openmct.telemetry.getMetadata(telemetryObject);
|
const telemetryMetadata = this.openmct.telemetry.getMetadata(telemetryObject);
|
||||||
metadataObject = telemetryMetadata.valueMetadatas.find((valueMetadata) => valueMetadata.key === metadata);
|
if (telemetryMetadata) {
|
||||||
|
metadataObject = telemetryMetadata.valueMetadatas.find((valueMetadata) => valueMetadata.key === metadata);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return metadataObject;
|
return metadataObject;
|
||||||
|
@ -110,7 +110,7 @@ describe("The telemetry criterion", function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("returns a result on new data from relevant telemetry providers", function () {
|
it("returns a result on new data from relevant telemetry providers", function () {
|
||||||
telemetryCriterion.getResult({
|
telemetryCriterion.updateResult({
|
||||||
value: 'Hello',
|
value: 'Hello',
|
||||||
utc: 'Hi',
|
utc: 'Hi',
|
||||||
id: testTelemetryObject.identifier.key
|
id: testTelemetryObject.identifier.key
|
||||||
|
@ -45,8 +45,9 @@ describe('the plugin', function () {
|
|||||||
type: "test-object",
|
type: "test-object",
|
||||||
name: "Test Object",
|
name: "Test Object",
|
||||||
telemetry: {
|
telemetry: {
|
||||||
valueMetadatas: [{
|
values: [{
|
||||||
key: "some-key",
|
key: "some-key2",
|
||||||
|
source: "some-key2",
|
||||||
name: "Some attribute",
|
name: "Some attribute",
|
||||||
hints: {
|
hints: {
|
||||||
range: 2
|
range: 2
|
||||||
@ -64,6 +65,13 @@ describe('the plugin', function () {
|
|||||||
source: "value",
|
source: "value",
|
||||||
name: "Test",
|
name: "Test",
|
||||||
format: "string"
|
format: "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "some-key",
|
||||||
|
source: "some-key",
|
||||||
|
hints: {
|
||||||
|
domain: 1
|
||||||
|
}
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -458,7 +466,7 @@ describe('the plugin', function () {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
xit('should evaluate as stale when telemetry is not received in the allotted time', (done) => {
|
it('should evaluate as stale when telemetry is not received in the allotted time', (done) => {
|
||||||
|
|
||||||
let conditionMgr = new ConditionManager(conditionSetDomainObject, openmct);
|
let conditionMgr = new ConditionManager(conditionSetDomainObject, openmct);
|
||||||
conditionMgr.on('conditionSetResultUpdated', mockListener);
|
conditionMgr.on('conditionSetResultUpdated', mockListener);
|
||||||
@ -480,7 +488,7 @@ describe('the plugin', function () {
|
|||||||
}, 400);
|
}, 400);
|
||||||
});
|
});
|
||||||
|
|
||||||
xit('should not evaluate as stale when telemetry is received in the allotted time', (done) => {
|
it('should not evaluate as stale when telemetry is received in the allotted time', (done) => {
|
||||||
const date = Date.now();
|
const date = Date.now();
|
||||||
conditionSetDomainObject.configuration.conditionCollection[0].configuration.criteria[0].input = ["0.4"];
|
conditionSetDomainObject.configuration.conditionCollection[0].configuration.criteria[0].input = ["0.4"];
|
||||||
let conditionMgr = new ConditionManager(conditionSetDomainObject, openmct);
|
let conditionMgr = new ConditionManager(conditionSetDomainObject, openmct);
|
||||||
@ -500,10 +508,133 @@ describe('the plugin', function () {
|
|||||||
key: 'cf4456a9-296a-4e6b-b182-62ed29cd15b9'
|
key: 'cf4456a9-296a-4e6b-b182-62ed29cd15b9'
|
||||||
},
|
},
|
||||||
conditionId: '2532d90a-e0d6-4935-b546-3123522da2de',
|
conditionId: '2532d90a-e0d6-4935-b546-3123522da2de',
|
||||||
utc: undefined
|
utc: date
|
||||||
});
|
});
|
||||||
done();
|
done();
|
||||||
}, 300);
|
}, 300);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('the condition evaluation', () => {
|
||||||
|
let conditionSetDomainObject;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
conditionSetDomainObject = {
|
||||||
|
"configuration": {
|
||||||
|
"conditionTestData": [
|
||||||
|
{
|
||||||
|
"telemetry": "",
|
||||||
|
"metadata": "",
|
||||||
|
"input": ""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conditionCollection": [
|
||||||
|
{
|
||||||
|
"id": "39584410-cbf9-499e-96dc-76f27e69885f",
|
||||||
|
"configuration": {
|
||||||
|
"name": "Unnamed Condition0",
|
||||||
|
"output": "Any telemetry less than 0",
|
||||||
|
"trigger": "all",
|
||||||
|
"criteria": [
|
||||||
|
{
|
||||||
|
"id": "35400132-63b0-425c-ac30-8197df7d5864",
|
||||||
|
"telemetry": "any",
|
||||||
|
"operation": "lessThan",
|
||||||
|
"input": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"metadata": "some-key"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"summary": "Match if all criteria are met: Any telemetry value is less than 0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "39584410-cbf9-499e-96dc-76f27e69885d",
|
||||||
|
"configuration": {
|
||||||
|
"name": "Unnamed Condition",
|
||||||
|
"output": "Any telemetry greater than 0",
|
||||||
|
"trigger": "all",
|
||||||
|
"criteria": [
|
||||||
|
{
|
||||||
|
"id": "35400132-63b0-425c-ac30-8197df7d5862",
|
||||||
|
"telemetry": "any",
|
||||||
|
"operation": "greaterThan",
|
||||||
|
"input": [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"metadata": "some-key"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"summary": "Match if all criteria are met: Any telemetry value is greater than 0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "39584410-cbf9-499e-96dc-76f27e69885e",
|
||||||
|
"configuration": {
|
||||||
|
"name": "Unnamed Condition1",
|
||||||
|
"output": "Any telemetry greater than 1",
|
||||||
|
"trigger": "all",
|
||||||
|
"criteria": [
|
||||||
|
{
|
||||||
|
"id": "35400132-63b0-425c-ac30-8197df7d5863",
|
||||||
|
"telemetry": "any",
|
||||||
|
"operation": "greaterThan",
|
||||||
|
"input": [
|
||||||
|
"1"
|
||||||
|
],
|
||||||
|
"metadata": "some-key"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"summary": "Match if all criteria are met: Any telemetry value is greater than 1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isDefault": true,
|
||||||
|
"id": "2532d90a-e0d6-4935-b546-3123522da2de",
|
||||||
|
"configuration": {
|
||||||
|
"name": "Default",
|
||||||
|
"output": "Default",
|
||||||
|
"trigger": "all",
|
||||||
|
"criteria": [
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"summary": ""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"composition": [
|
||||||
|
{
|
||||||
|
"namespace": "",
|
||||||
|
"key": "test-object"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"telemetry": {
|
||||||
|
},
|
||||||
|
"name": "Condition Set",
|
||||||
|
"type": "conditionSet",
|
||||||
|
"identifier": {
|
||||||
|
"namespace": "",
|
||||||
|
"key": "cf4456a9-296a-4e6b-b182-62ed29cd15b9"
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should stop evaluating conditions when a condition evaluates to true', () => {
|
||||||
|
const date = Date.now();
|
||||||
|
let conditionMgr = new ConditionManager(conditionSetDomainObject, openmct);
|
||||||
|
conditionMgr.on('conditionSetResultUpdated', mockListener);
|
||||||
|
conditionMgr.telemetryObjects = {
|
||||||
|
"test-object": testTelemetryObject
|
||||||
|
};
|
||||||
|
conditionMgr.updateConditionTelemetryObjects();
|
||||||
|
conditionMgr.telemetryReceived(testTelemetryObject, {
|
||||||
|
"some-key": 2,
|
||||||
|
utc: date
|
||||||
|
});
|
||||||
|
let result = conditionMgr.conditions.map(condition => condition.result);
|
||||||
|
expect(result[2]).toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user