diff --git a/Packages/ohif-measurements/client/conformance/CriteriaEvaluator.js b/Packages/ohif-measurements/client/conformance/CriteriaEvaluator.js index 24e6f5085..e2a21eba1 100644 --- a/Packages/ohif-measurements/client/conformance/CriteriaEvaluator.js +++ b/Packages/ohif-measurements/client/conformance/CriteriaEvaluator.js @@ -6,30 +6,12 @@ import Ajv from 'ajv'; export class CriteriaEvaluator { constructor(criteriaObject) { + const criteriaValidator = this.getCriteriaValidator(); this.criteria = []; - const schema = { - properties: {}, - definitions: { - simpleArray: { type: 'array' } - } - }; - _.each(Criteria, (Criterion, key) => { - if (Criterion.prototype instanceof BaseCriterion) { - const criterionkey = key.replace(/Criterion$/, ''); - schema.definitions[criterionkey] = Criteria[`${criterionkey}Schema`]; - schema.properties[criterionkey] = { - oneOf: [ - { $ref: '#/definitions/simpleArray' }, - { $ref: `#/definitions/${criterionkey}` } - ] - }; - } - }); - const validator = new Ajv().compile(schema); - if (!validator(criteriaObject)) { + if (!criteriaValidator(criteriaObject)) { let message = ''; - _.each(validator.errors, error => { + _.each(criteriaValidator.errors, error => { message += `\noptions${error.dataPath} ${error.message}`; }); throw new Error(message); @@ -42,6 +24,39 @@ export class CriteriaEvaluator { }); } + getCriteriaValidator() { + if (CriteriaEvaluator.validator) { + return CriteriaEvaluator.validator; + } + + const schema = { + properties: {}, + definitions: {} + }; + + _.each(Criteria, (Criterion, key) => { + if (Criterion.prototype instanceof BaseCriterion) { + const criterionkey = key.replace(/Criterion$/, ''); + const criterionDefinition = `#/definitions/${criterionkey}`; + + schema.definitions[criterionkey] = Criteria[`${criterionkey}Schema`]; + schema.properties[criterionkey] = { + oneOf: [ + { $ref: criterionDefinition }, + { + type: 'array', + items: { + $ref: criterionDefinition + } + } + ] + }; + } + }); + + return CriteriaEvaluator.validator = new Ajv().compile(schema); + } + evaluate(data) { const nonconformity = []; this.criteria.forEach(criterion => { diff --git a/Packages/ohif-measurements/client/conformance/criteria/MaxTargets.js b/Packages/ohif-measurements/client/conformance/criteria/MaxTargets.js index 42617f297..1e26e5a79 100644 --- a/Packages/ohif-measurements/client/conformance/criteria/MaxTargets.js +++ b/Packages/ohif-measurements/client/conformance/criteria/MaxTargets.js @@ -2,6 +2,7 @@ import { BaseCriterion } from './BaseCriterion'; import { _ } from 'meteor/underscore'; export const MaxTargetsSchema = { + type: 'object', properties: { limit: { label: 'Max targets allowed in study', diff --git a/Packages/ohif-measurements/client/conformance/criteria/MaxTargetsPerOrgan.js b/Packages/ohif-measurements/client/conformance/criteria/MaxTargetsPerOrgan.js index b05e82078..311acdfac 100644 --- a/Packages/ohif-measurements/client/conformance/criteria/MaxTargetsPerOrgan.js +++ b/Packages/ohif-measurements/client/conformance/criteria/MaxTargetsPerOrgan.js @@ -1,6 +1,7 @@ import { BaseCriterion } from './BaseCriterion'; export const MaxTargetsPerOrganSchema = { + type: 'object', properties: { limit: { label: 'Max targets allowed per organ', diff --git a/Packages/ohif-measurements/client/conformance/criteria/MeasurementsLength.js b/Packages/ohif-measurements/client/conformance/criteria/MeasurementsLength.js index 5ef7af86f..50bd716f8 100644 --- a/Packages/ohif-measurements/client/conformance/criteria/MeasurementsLength.js +++ b/Packages/ohif-measurements/client/conformance/criteria/MeasurementsLength.js @@ -1,6 +1,7 @@ import { BaseCriterion } from './BaseCriterion'; export const MeasurementsLengthSchema = { + type: 'object', properties: { longAxis: { label: 'Minimum length of long axis', diff --git a/Packages/ohif-measurements/client/conformance/criteria/Modality.js b/Packages/ohif-measurements/client/conformance/criteria/Modality.js index 960c8cca3..c605072e4 100644 --- a/Packages/ohif-measurements/client/conformance/criteria/Modality.js +++ b/Packages/ohif-measurements/client/conformance/criteria/Modality.js @@ -2,6 +2,7 @@ import { BaseCriterion } from './BaseCriterion'; import { _ } from 'meteor/underscore'; export const ModalitySchema = { + type: 'object', properties: { method: { label: 'Specify if it\'s goinig to "allow" or "deny" the modalities', diff --git a/Packages/ohif-measurements/client/conformance/criteria/NonTargetResponse.js b/Packages/ohif-measurements/client/conformance/criteria/NonTargetResponse.js index 29378de90..fcd67ba70 100644 --- a/Packages/ohif-measurements/client/conformance/criteria/NonTargetResponse.js +++ b/Packages/ohif-measurements/client/conformance/criteria/NonTargetResponse.js @@ -1,6 +1,7 @@ import { BaseCriterion } from './BaseCriterion'; export const NonTargetResponseSchema = { + type: 'object' }; /* NonTargetResponseCriterion diff --git a/Packages/ohif-measurements/client/conformance/criteria/TargetType.js b/Packages/ohif-measurements/client/conformance/criteria/TargetType.js index 40f227572..49cd7e022 100644 --- a/Packages/ohif-measurements/client/conformance/criteria/TargetType.js +++ b/Packages/ohif-measurements/client/conformance/criteria/TargetType.js @@ -1,6 +1,7 @@ import { BaseCriterion } from './BaseCriterion'; export const TargetTypeSchema = { + type: 'object' }; /* TargetTypeCriterion