cql-execution
Version:
An execution framework for the Clinical Quality Language (CQL)
248 lines (225 loc) • 7.43 kB
JavaScript
// Generated by CoffeeScript 1.12.7
(function() {
var DateTime, Uncertainty, areDateTimesOrQuantities, areNumbers, classesEqual, codesAreEquivalent, compareEveryItemInArrays, compareObjects, deepCompareKeysAndValues, equals, equivalent, getClassOfObjects, getKeysFromObject, isCode, isFunction, isUncertainty;
DateTime = require('../datatypes/datetime').DateTime;
Uncertainty = require('../datatypes/uncertainty').Uncertainty;
areNumbers = function(a, b) {
return typeof a === 'number' && typeof b === 'number';
};
areDateTimesOrQuantities = function(a, b) {
return (a != null ? a.isDateTime : void 0) && (b != null ? b.isDateTime : void 0) || (a != null ? a.isDate : void 0) && (b != null ? b.isDate : void 0) || (a != null ? a.isTime : void 0) && (b != null ? b.isTime : void 0) || (a != null ? a.isQuantity : void 0) && (b != null ? b.isQuantity : void 0);
};
isUncertainty = function(x) {
return x instanceof Uncertainty;
};
module.exports.lessThan = function(a, b, precision) {
switch (false) {
case !areNumbers(a, b):
return a < b;
case !areDateTimesOrQuantities(a, b):
return a.before(b, precision);
case !isUncertainty(a):
return a.lessThan(b);
case !isUncertainty(b):
return Uncertainty.from(a).lessThan(b);
default:
return null;
}
};
module.exports.lessThanOrEquals = function(a, b, precision) {
switch (false) {
case !areNumbers(a, b):
return a <= b;
case !areDateTimesOrQuantities(a, b):
return a.sameOrBefore(b, precision);
case !isUncertainty(a):
return a.lessThanOrEquals(b);
case !isUncertainty(b):
return Uncertainty.from(a).lessThanOrEquals(b);
default:
return null;
}
};
module.exports.greaterThan = function(a, b, precision) {
switch (false) {
case !areNumbers(a, b):
return a > b;
case !areDateTimesOrQuantities(a, b):
return a.after(b, precision);
case !isUncertainty(a):
return a.greaterThan(b);
case !isUncertainty(b):
return Uncertainty.from(a).greaterThan(b);
default:
return null;
}
};
module.exports.greaterThanOrEquals = function(a, b, precision) {
switch (false) {
case !areNumbers(a, b):
return a >= b;
case !areDateTimesOrQuantities(a, b):
return a.sameOrAfter(b, precision);
case !isUncertainty(a):
return a.greaterThanOrEquals(b);
case !isUncertainty(b):
return Uncertainty.from(a).greaterThanOrEquals(b);
default:
return null;
}
};
module.exports.equivalent = equivalent = function(a, b) {
var aClass, bClass, ref;
if ((a == null) && (b == null)) {
return true;
}
if (!((a != null) && (b != null))) {
return false;
}
if (isCode(a)) {
return codesAreEquivalent(a, b);
}
if (a != null ? a.isRatio : void 0) {
return a.equivalent(b);
}
ref = getClassOfObjects(a, b), aClass = ref[0], bClass = ref[1];
switch (aClass) {
case '[object Array]':
return compareEveryItemInArrays(a, b, equivalent);
case '[object Object]':
return compareObjects(a, b, equivalent);
case '[object String]':
if (bClass === '[object String]') {
return (a.localeCompare(b, 'en', {
sensitivity: 'base'
})) === 0;
}
}
return equals(a, b);
};
isCode = function(object) {
return object.hasMatch && typeof object.hasMatch === 'function';
};
codesAreEquivalent = function(code1, code2) {
return code1.hasMatch(code2);
};
getClassOfObjects = function(object1, object2) {
var obj;
return (function() {
var j, len, ref, results;
ref = [object1, object2];
results = [];
for (j = 0, len = ref.length; j < len; j++) {
obj = ref[j];
results.push({}.toString.call(obj));
}
return results;
})();
};
compareEveryItemInArrays = function(array1, array2, comparisonFunction) {
return array1.length === array2.length && array1.every(function(item, i) {
return comparisonFunction(item, array2[i]);
});
};
compareObjects = function(a, b, comparisonFunction) {
if (!classesEqual(a, b)) {
return false;
}
return deepCompareKeysAndValues(a, b, comparisonFunction);
};
classesEqual = function(object1, object2) {
return object2 instanceof object1.constructor && object1 instanceof object2.constructor;
};
deepCompareKeysAndValues = function(a, b, comparisonFunction) {
var aKeys, bKeys, finalComparisonResult, shouldReturnNull;
aKeys = getKeysFromObject(a).sort();
bKeys = getKeysFromObject(b).sort();
shouldReturnNull = false;
if (aKeys.length === bKeys.length && aKeys.every((function(_this) {
return function(value, index) {
return value === bKeys[index];
};
})(this))) {
finalComparisonResult = aKeys.every(function(key) {
var comparisonResult;
if ((a[key] == null) && (b[key] == null)) {
return true;
}
comparisonResult = comparisonFunction(a[key], b[key]);
if (comparisonResult === null) {
shouldReturnNull = true;
}
return comparisonResult;
});
} else {
finalComparisonResult = false;
}
if (shouldReturnNull) {
return null;
}
return finalComparisonResult;
};
getKeysFromObject = function(object) {
var key, objectClass;
objectClass = {}.toString.call(object);
return ((function() {
var results;
if (!isFunction(key)) {
results = [];
for (key in object) {
results.push(key);
}
return results;
}
})());
};
isFunction = function(input) {
return input instanceof Function || {}.toString.call(input) === '[object Function]';
};
module.exports.equals = equals = function(a, b) {
var aClass, bClass, ref;
if (!((a != null) && (b != null))) {
return null;
}
if (a != null ? a.isQuantity : void 0) {
return a.equals(b);
}
if (a != null ? a.isRatio : void 0) {
return a.equals(b);
}
if (a instanceof Uncertainty) {
b = Uncertainty.from(b);
} else if (b instanceof Uncertainty) {
a = Uncertainty.from(a);
}
if (typeof a.equals === 'function') {
return a.equals(b);
}
if (typeof a === typeof b && typeof a === 'string' || typeof a === 'number' || typeof a === 'boolean') {
return a === b;
}
ref = getClassOfObjects(a, b), aClass = ref[0], bClass = ref[1];
if (aClass !== bClass) {
return false;
}
switch (aClass) {
case '[object Date]':
return a.getTime() === b.getTime();
case '[object RegExp]':
return ['source', 'global', 'ignoreCase', 'multiline'].every(function(p) {
return a[p] === b[p];
});
case '[object Array]':
if (a.indexOf(null) >= 0 || a.indexOf(void 0) >= 0 || b.indexOf(null) >= 0 || b.indexOf(void 0) >= 0) {
return null;
}
return compareEveryItemInArrays(a, b, equals);
case '[object Object]':
return compareObjects(a, b, equals);
case '[object Function]':
return a.toString() === b.toString();
}
return false;
};
}).call(this);
//# sourceMappingURL=comparison.js.map