From a97cdacf541fd2fc1d042c71fdaf0b55b2fb53c4 Mon Sep 17 00:00:00 2001 From: Chris Moesel Date: Fri, 29 May 2026 12:28:15 -0400 Subject: [PATCH 1/2] Improve handling of boundless and unknown intervals Add special case logic for boundless intervals (e.g., Interval[null, null]) and unknown intervals (e.g., Interval(null, null) --- examples/browser/cql4browsers.js | 354 ++-- src/datatypes/interval.ts | 66 +- test/datatypes/interval-test.ts | 558 ++++- test/elm/interval/data.cql | 8 +- test/elm/interval/data.js | 1876 +++++++---------- test/elm/interval/interval-test.ts | 8 +- .../cql/CqlIntervalOperatorsTest.cql | 4 +- .../cql/CqlIntervalOperatorsTest.json | 116 +- test/spec-tests/skip-list.txt | 1 + 9 files changed, 1624 insertions(+), 1367 deletions(-) diff --git a/examples/browser/cql4browsers.js b/examples/browser/cql4browsers.js index 1227fe15..79e0341a 100644 --- a/examples/browser/cql4browsers.js +++ b/examples/browser/cql4browsers.js @@ -1856,19 +1856,22 @@ class Interval { if (this.high != null && typeof this.high.copy === 'function') { newHigh = this.high.copy(); } - return new Interval(newLow, newHigh, this.lowClosed, this.highClosed); + return new Interval(newLow, newHigh, this.lowClosed, this.highClosed, this.defaultPointType); } contains(item, precision) { - // These first two checks ensure correct handling of edge case where an item equals the closed boundary + if (item != null && item.isInterval) { + throw new Error('Argument to contains must be a point'); + } + if (this.isBoundlessInterval) { + return true; + } + // Ensure correct handling of edge case where an item equals the closed boundary if (this.lowClosed && this.low != null && cmp.equals(this.low, item)) { return true; } if (this.highClosed && this.high != null && cmp.equals(this.high, item)) { return true; } - if (item != null && item.isInterval) { - throw new Error('Argument to contains must be a point'); - } let lowFn; if (this.lowClosed && this.low == null) { lowFn = () => true; @@ -1898,6 +1901,12 @@ class Interval { return logic_1.ThreeValuedLogic.and(this.includes(other, precision), logic_1.ThreeValuedLogic.not(other.includes(this, precision))); } includes(other, precision) { + if (this.isBoundlessInterval) { + return true; + } + else if (other?.isBoundlessInterval) { + return this.isUnknownInterval ? null : false; + } if (other == null || !other.isInterval) { return this.contains(other, precision); } @@ -1965,6 +1974,12 @@ class Interval { if (other == null || !other.isInterval) { throw new Error('Argument to union must be an interval'); } + if (this.isBoundlessInterval) { + return this.copy(); + } + else if (other.isBoundlessInterval) { + return other.copy(); + } // Note that interval union is only defined if the arguments overlap or meet. if (this.overlaps(other) || this.meets(other)) { const [a, b] = [this.toClosed(), other.toClosed()]; @@ -2012,7 +2027,13 @@ class Interval { if (other == null || !other.isInterval) { throw new Error('Argument to union must be an interval'); } - // Note that interval union is only defined if the arguments overlap. + if (this.isBoundlessInterval) { + return other.copy(); + } + else if (other.isBoundlessInterval) { + return this.copy(); + } + // Note that interval intersect is only defined if the arguments overlap. if (this.overlaps(other)) { const [a, b] = [this.toClosed(), other.toClosed()]; let l, lc; @@ -2155,6 +2176,9 @@ class Interval { } } sameOrBefore(other, precision) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return this.equals(other); + } if (this.end() == null || other == null || other.start() == null) { return null; } @@ -2163,6 +2187,9 @@ class Interval { } } sameOrAfter(other, precision) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return this.equals(other); + } if (this.start() == null || other == null || other.end() == null) { return null; } @@ -2172,6 +2199,12 @@ class Interval { } equals(other) { if (other != null && other.isInterval) { + if (this.isBoundlessInterval) { + return other.isBoundlessInterval ? true : other.isUnknownInterval ? null : false; + } + else if (other.isBoundlessInterval) { + return this.isUnknownInterval ? null : false; + } const [a, b] = [this.toClosed(), other.toClosed()]; return logic_1.ThreeValuedLogic.and(cmp.equals(a.low, b.low), cmp.equals(a.high, b.high)); } @@ -2180,6 +2213,9 @@ class Interval { } } after(other, precision) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return false; + } const closed = this.toClosed(); // Meets spec, but not 100% correct (e.g., (null, 5] after [6, 10] --> null) // Simple way to fix it: and w/ not overlaps @@ -2191,6 +2227,9 @@ class Interval { } } before(other, precision) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return false; + } const closed = this.toClosed(); // Meets spec, but not 100% correct (e.g., (null, 5] after [6, 10] --> null) // Simple way to fix it: and w/ not overlaps @@ -2202,9 +2241,15 @@ class Interval { } } meets(other, precision) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return false; + } return logic_1.ThreeValuedLogic.or(this.meetsBefore(other, precision), this.meetsAfter(other, precision)); } meetsAfter(other, precision) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return false; + } try { if (precision != null && this.low != null && this.low.isDateTime) { return this.toClosed().low.sameAs(other.toClosed().high != null ? other.toClosed().high.add(1, precision) : null, precision); @@ -2218,6 +2263,9 @@ class Interval { } } meetsBefore(other, precision) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return false; + } try { if (precision != null && this.high != null && this.high.isDateTime) { return this.toClosed().high.sameAs(other.toClosed().low != null ? other.toClosed().low.add(-1, precision) : null, precision); @@ -2253,6 +2301,12 @@ class Interval { return this.toClosed().high; } starts(other, precision) { + if (this.isBoundlessInterval) { + return other.isBoundlessInterval ? true : other.isUnknownInterval ? null : false; + } + else if (other?.isBoundlessInterval) { + return this.isUnknownInterval ? null : false; + } let startEqual; if (precision != null && this.low != null && this.low.isDateTime) { startEqual = this.low.sameAs(other.low, precision); @@ -2264,6 +2318,12 @@ class Interval { return startEqual && endLessThanOrEqual; } ends(other, precision) { + if (this.isBoundlessInterval) { + return other.isBoundlessInterval ? true : other.isUnknownInterval ? null : false; + } + else if (other?.isBoundlessInterval) { + return this.isUnknownInterval ? null : false; + } let endEqual; const startGreaterThanOrEqual = cmp.greaterThanOrEquals(this.low, other.low, precision); if (precision != null && (this.low != null ? this.low.isDateTime : undefined)) { @@ -10457,7 +10517,7 @@ exports.Ucum = void 0; * defined by the ECMAScript 6 standard */ -var Ucum = exports.Ucum = { +var Ucum = { /** * Flag indicating whether or not we're using case sensitive labels * I don't think we need this. I think we're just going with @@ -10564,6 +10624,7 @@ var Ucum = exports.Ucum = { '[m/s2/Hz^(1/2)]': 'specialUnitTwo' } }; +exports.Ucum = Ucum; },{}],62:[function(require,module,exports){ @@ -11151,7 +11212,7 @@ exports.Prefix = Prefix; Object.defineProperty(exports, "__esModule", { value: true }); -exports.PrefixTablesFactory = exports.PrefixTables = void 0; +exports.PrefixTables = exports.PrefixTablesFactory = void 0; /** * The tables of defined prefixes is defined in this file. */ @@ -11268,11 +11329,12 @@ class PrefixTablesFactory { // provides that instance via getInstance(). exports.PrefixTablesFactory = PrefixTablesFactory; var prefixTablesInstance = new PrefixTablesFactory(); -const PrefixTables = exports.PrefixTables = { +const PrefixTables = { getInstance: function () { return prefixTablesInstance; } }; +exports.PrefixTables = PrefixTables; },{}],66:[function(require,module,exports){ @@ -11507,7 +11569,8 @@ class UcumFunctions { return this.funcs[fname] !== null; } } // end of UcumFunctions class -var _default = exports.default = new UcumFunctions(); // one singleton instance +var _default = new UcumFunctions(); // one singleton instance +exports.default = _default; },{}],67:[function(require,module,exports){ @@ -11516,9 +11579,9 @@ var _default = exports.default = new UcumFunctions(); // one singleton instance Object.defineProperty(exports, "__esModule", { value: true }); -exports.getSynonyms = getSynonyms; -exports.isIntegerUnit = isIntegerUnit; exports.isNumericString = isNumericString; +exports.isIntegerUnit = isIntegerUnit; +exports.getSynonyms = getSynonyms; /** * Internal utilities used by multiple UCUM classes. For example, * isNumericString is used by both the UnitString and UcumLhcUtils @@ -11660,7 +11723,8 @@ class UcumJsonDefs { } // end loadJsonDefs } // end UcumJsonDefs class exports.UcumJsonDefs = UcumJsonDefs; -var ucumJsonDefs = exports.ucumJsonDefs = new UcumJsonDefs(); +var ucumJsonDefs = new UcumJsonDefs(); +exports.ucumJsonDefs = ucumJsonDefs; },{"../data/ucumDefs.min.json":60,"./jsonArrayPack.js":63,"./prefix.js":64,"./prefixTables.js":65,"./unit.js":71,"./unitTables.js":73}],69:[function(require,module,exports){ @@ -12364,9 +12428,12 @@ exports.UnitTables = exports.UcumLhcUtils = exports.Ucum = void 0; * those classes within the library. */ -var Ucum = exports.Ucum = require("./config.js").Ucum; -var UcumLhcUtils = exports.UcumLhcUtils = require("./ucumLhcUtils.js").UcumLhcUtils; -var UnitTables = exports.UnitTables = require("./unitTables.js").UnitTables; +var Ucum = require("./config.js").Ucum; +exports.Ucum = Ucum; +var UcumLhcUtils = require("./ucumLhcUtils.js").UcumLhcUtils; +exports.UcumLhcUtils = UcumLhcUtils; +var UnitTables = require("./unitTables.js").UnitTables; +exports.UnitTables = UnitTables; },{"./config.js":61,"./ucumLhcUtils.js":69,"./unitTables.js":73}],71:[function(require,module,exports){ @@ -14420,6 +14487,34 @@ class UnitString { retUnit.ciCode_ = retUnit.ciCode_.replace('*', '^'); } } + // If that didn't work, check to see if it should have brackets + // around it (uCode = degF when it should be [degF] + if (!retUnit) { + let addBrackets = '[' + uCode + ']'; + retUnit = this.utabs_.getUnitByCode(addBrackets); + if (retUnit) { + retUnit = retUnit.clone(); + origString = origString.replace(uCode, addBrackets); + this.retMsg_.push(`${uCode} is not a valid unit expression, but ` + `${addBrackets} is.\n` + this.vcMsgStart_ + `${addBrackets} (${retUnit.name_})${this.vcMsgEnd_}`); + } // end if we found the unit after adding brackets + } // end trying to add brackets + + // If we didn't find it, try it as a name + if (!retUnit) { + let retUnitAry = this.utabs_.getUnitByName(uCode); + if (retUnitAry && retUnitAry.length > 0) { + retUnit = retUnitAry[0].clone(); + let mString = 'The UCUM code for ' + uCode + ' is ' + retUnit.csCode_ + '.\n' + this.vcMsgStart_ + retUnit.csCode_ + this.vcMsgEnd_; + let dupMsg = false; + for (let r = 0; r < this.retMsg_.length && !dupMsg; r++) dupMsg = this.retMsg_[r] === mString; + if (!dupMsg) this.retMsg_.push(mString); + let rStr = new RegExp('(^|[.\/({])(' + uCode + ')($|[.\/)}])'); + let res = origString.match(rStr); + origString = origString.replace(rStr, res[1] + retUnit.csCode_ + res[3]); + uCode = retUnit.csCode_; + } + } + // If we still don't have a unit, try assuming a modifier (prefix and/or // exponent) and look for a unit without the modifier if (!retUnit) { @@ -14493,21 +14588,12 @@ class UnitString { // without the exponent, the unit string without a prefix, // common errors, etc. That's all we can try). if (!origUnit) { - let bracketRet = this._getUnitAfterAddingBrackets(origCode, origString); - retUnit = bracketRet[0]; - origString = bracketRet[1]; - if (!retUnit) { - let nameRet = this._getUnitByName(origCode, origString); - retUnit = nameRet[0]; - origString = nameRet[1]; - if (!retUnit) { - // BUT if the user asked for suggestions, at least look for them - if (this.suggestions_) { - let suggestStat = this._getSuggestions(origCode); - } else { - this.retMsg_.push(`${origCode} is not a valid UCUM code.`); - } - } + retUnit = null; + // BUT if the user asked for suggestions, at least look for them + if (this.suggestions_) { + let suggestStat = this._getSuggestions(origCode); + } else { + this.retMsg_.push(`${origCode} is not a valid UCUM code.`); } } else { // Otherwise we found a unit object. Clone it and then apply the @@ -14525,83 +14611,75 @@ class UnitString { // If there is an exponent for the unit, apply it to the dimension // and magnitude now if (exp) { - // Special units cannot be raised to a power - if (retUnit.isSpecial_) { - this.retMsg_.push(`Special units like ${retUnit.name_} cannot be raised to a power.`); - retUnit = null; - } else { - exp = parseInt(exp); - if (theDim) theDim = theDim.mul(exp); - retUnit.equivalentExp_ *= exp; - retUnit.moleExp_ *= exp; - theMag = Math.pow(theMag, exp); - retUnit.assignVals({ - 'magnitude_': theMag - }); - - // If there is also a prefix, apply the exponent to the prefix. - if (pfxObj) { - // We don't need to consider pfxObj.getExp(), because when - // present that is reflected in the pfxVal. However, in some - // cases one can avoid floating-point math inaccuracies by using - // that exponent instead of relying on pfxVal. For example: - // 1e-66 = Math.pow(10, -3*22) = Math.pow(0.001, 22) = 1.0000000000000005e-66 - // (This is the from the test case of the unit mg% raised to the 22nd power (mg%22).) - // This does not help in all cases, but it does help the above - // test case (which is in our web API service test code). - let pfxExp = pfxObj.getExp(); - if (pfxExp) { - // This is relying on the fact that pfxExp is null when - // the prefix base is not 10. - pfxVal = Math.pow(10, exp * pfxExp); - } else { - pfxVal = Math.pow(pfxVal, exp); - } - } - } // end else - prefix and exponent handling for non-special units - } // end if there's an exponent + exp = parseInt(exp); + if (theDim) theDim = theDim.mul(exp); + retUnit.equivalentExp_ *= exp; + retUnit.moleExp_ *= exp; + theMag = Math.pow(theMag, exp); + retUnit.assignVals({ + 'magnitude_': theMag + }); - if (retUnit) { - // Now apply the prefix, if there is one, to the conversion - // prefix or the magnitude + // If there is also a prefix, apply the exponent to the prefix. if (pfxObj) { - if (retUnit.cnv_) { - retUnit.assignVals({ - 'cnvPfx_': pfxVal - }); + // We don't need to consider pfxObj.getExp(), because when + // present that is reflected in the pfxVal. However, in some + // cases one can avoid floating-point math inaccuracies by using + // that exponent instead of relying on pfxVal. For example: + // 1e-66 = Math.pow(10, -3*22) = Math.pow(0.001, 22) = 1.0000000000000005e-66 + // (This is the from the test case of the unit mg% raised to the 22nd power (mg%22).) + // This does not help in all cases, but it does help the above + // test case (which is in our web API service test code). + let pfxExp = pfxObj.getExp(); + if (pfxExp) { + // This is relying on the fact that pfxExp is null when + // the prefix base is not 10. + pfxVal = Math.pow(10, exp * pfxExp); } else { - theMag *= pfxVal; - retUnit.assignVals({ - 'magnitude_': theMag - }); + pfxVal = Math.pow(pfxVal, exp); } } - // if we have a prefix and/or an exponent, add them to the unit - // attributes - name, csCode, ciCode and print symbol - let theCode = retUnit.csCode_; - if (pfxObj) { - theName = pfxObj.getName() + theName; - theCode = pfxCode + theCode; - theCiCode = pfxObj.getCiCode() + theCiCode; - thePrintSymbol = pfxObj.getPrintSymbol() + thePrintSymbol; + } // end if there's an exponent + + // Now apply the prefix, if there is one, to the conversion + // prefix or the magnitude + if (pfxObj) { + if (retUnit.cnv_) { retUnit.assignVals({ - 'name_': theName, - 'csCode_': theCode, - 'ciCode_': theCiCode, - 'printSymbol_': thePrintSymbol + 'cnvPfx_': pfxVal }); - } - if (exp) { - let expStr = exp.toString(); - const intergerUnitExpSign = isIntegerUnitWithExp && exp > 0 ? '+' : ''; + } else { + theMag *= pfxVal; retUnit.assignVals({ - 'name_': theName + '' + expStr + '', - 'csCode_': theCode + intergerUnitExpSign + expStr, - 'ciCode_': theCiCode + intergerUnitExpSign + expStr, - 'printSymbol_': thePrintSymbol + '' + expStr + '' + 'magnitude_': theMag }); } } + // if we have a prefix and/or an exponent, add them to the unit + // attributes - name, csCode, ciCode and print symbol + let theCode = retUnit.csCode_; + if (pfxObj) { + theName = pfxObj.getName() + theName; + theCode = pfxCode + theCode; + theCiCode = pfxObj.getCiCode() + theCiCode; + thePrintSymbol = pfxObj.getPrintSymbol() + thePrintSymbol; + retUnit.assignVals({ + 'name_': theName, + 'csCode_': theCode, + 'ciCode_': theCiCode, + 'printSymbol_': thePrintSymbol + }); + } + if (exp) { + let expStr = exp.toString(); + const intergerUnitExpSign = isIntegerUnitWithExp && exp > 0 ? '+' : ''; + retUnit.assignVals({ + 'name_': theName + '' + expStr + '', + 'csCode_': theCode + intergerUnitExpSign + expStr, + 'ciCode_': theCiCode + intergerUnitExpSign + expStr, + 'printSymbol_': thePrintSymbol + '' + expStr + '' + }); + } } // end if an original unit was found (without prefix and/or exponent) } // end if an invalid exponent wasn't found } // end if we didn't get a unit for the full unit code (w/out modifiers) @@ -14609,75 +14687,6 @@ class UnitString { return [retUnit, origString]; } // end _makeUnit - /** - * Checks whether an otherwise unresolved unit code matches a unit name. - * - * @param uCode the unit code or name to check - * @param origString the original full string submitted to parseString - * @returns an array containing the unit object found, or null, and origString - */ - _getUnitByName(uCode, origString) { - let retUnit = null; - let retUnitAry = this.utabs_.getUnitByName(uCode); - if (retUnitAry && retUnitAry.length > 0) { - retUnit = retUnitAry[0].clone(); - let mString = 'The UCUM code for ' + uCode + ' is ' + retUnit.csCode_ + '.\n' + this.vcMsgStart_ + retUnit.csCode_ + this.vcMsgEnd_; - let dupMsg = false; - for (let r = 0; r < this.retMsg_.length && !dupMsg; r++) dupMsg = this.retMsg_[r] === mString; - if (!dupMsg) this.retMsg_.push(mString); - const escapedCode = uCode.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - let rStr = new RegExp('(^|[./(])(' + escapedCode + ')($|[./)\\-\\d{])'); - const updatedOrigString = origString.replace(rStr, '$1' + retUnit.csCode_ + '$3'); - if (updatedOrigString == origString) { - // This should not happen, if the processing has been correct. However, if it does happen, we - // still have to change origString to signal that the input unit is invalid. - // There is a test present to make sure this message does not appear from the top-level APIs in - // ucumLhcUtils.js. - // Ideally, this problem would be signalled some other way, but that would be a bigger change. - origString += ' (Unable to update the unit expression with a suggested replacement.)'; - } else { - origString = updatedOrigString; - } - } - return [retUnit, origString]; - } // end _getUnitByName - - /** - * Checks whether an otherwise unresolved unit code can be found after adding - * square brackets, e.g., degF -> [degF]. If a bracketed unit is found, - * origString is modified to include the suggested replacement. - * - * @param uCode the unit code to check - * @param origString the original full string submitted to parseString - * @returns an array containing the unit object found, or null, and the possibly - * modified origString - */ - _getUnitAfterAddingBrackets(uCode, origString) { - let retUnit = null; - const addBrackets = '[' + uCode + ']'; - const bracketUnit = this.utabs_.getUnitByCode(addBrackets); - if (bracketUnit) { - retUnit = bracketUnit.clone(); - const escapedCode = uCode.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - const leadingUnitBoundary = '(^|[./(])'; - const trailingUnitBoundary = '($|[./)\\-\\d{])'; - const rStr = new RegExp(leadingUnitBoundary + '(' + escapedCode + ')' + trailingUnitBoundary); - const updatedOrigString = origString.replace(rStr, '$1' + addBrackets + '$3'); - if (updatedOrigString == origString) { - // This should not happen, if the processing has been correct. However, if it does happen, we - // still have to change origString to signal that the input unit is invalid. - // There is a test present to make sure this message does not appear from the top-level APIs in - // ucumLhcUtils.js. - // Ideally, this problem would be signalled some other way, but that would be a bigger change. - origString += ' (Unable to update the unit expression with a suggested replacement.)'; - } else { - origString = updatedOrigString; - } - this.retMsg_.push(`${uCode} is not a valid unit expression, but ` + `${addBrackets} is.\n` + this.vcMsgStart_ + `${addBrackets} (${retUnit.name_})${this.vcMsgEnd_}`); - } - return [retUnit, origString]; - } // end _getUnitAfterAddingBrackets - /** * This method handles unit creation when an annotation is included * in the unit string. This basically isolates and retrieves the @@ -15550,11 +15559,12 @@ class UnitTablesFactory { // Create a singleton instance and (to preserve the existing API) an object that // provides that instance via getInstance(). var unitTablesInstance = new UnitTablesFactory(); -const UnitTables = exports.UnitTables = { +const UnitTables = { getInstance: function () { return unitTablesInstance; } }; +exports.UnitTables = UnitTables; },{"./config.js":61}],74:[function(require,module,exports){ @@ -16847,6 +16857,8 @@ const UnitTables = exports.UnitTables = { } function reverseFactory(collection, useKeys) { + var this$1$1 = this; + var reversedSequence = makeSequence(collection); reversedSequence._iter = collection; reversedSequence.size = collection.size; @@ -16886,9 +16898,7 @@ const UnitTables = exports.UnitTables = { var entry = step.value; return iteratorValue( type, - // `__iterator` is an arrow function, so `this` is not the reversed - // sequence here — read `reversedSequence.size` explicitly. - useKeys ? entry[0] : reverse ? reversedSequence.size - ++i : i++, + useKeys ? entry[0] : reverse ? this$1$1.size - ++i : i++, entry[1], step ); @@ -18835,7 +18845,7 @@ const UnitTables = exports.UnitTables = { } function set(collection, key, value) { - if (isProtoKey(key)) { + if (typeof key === 'string' && isProtoKey(key)) { return collection; } if (!isDataStructure(collection)) { @@ -21757,7 +21767,7 @@ const UnitTables = exports.UnitTables = { return isIndexed(v) ? v.toList() : isKeyed(v) ? v.toMap() : v.toSet(); } - var version = "5.1.6"; + var version = "5.1.5"; /* eslint-disable import/order */ diff --git a/src/datatypes/interval.ts b/src/datatypes/interval.ts index 0c6536a1..6bdbeaea 100644 --- a/src/datatypes/interval.ts +++ b/src/datatypes/interval.ts @@ -78,20 +78,23 @@ export class Interval { newHigh = this.high.copy(); } - return new Interval(newLow, newHigh, this.lowClosed, this.highClosed); + return new Interval(newLow, newHigh, this.lowClosed, this.highClosed, this.defaultPointType); } contains(item: any, precision?: any) { - // These first two checks ensure correct handling of edge case where an item equals the closed boundary + if (item != null && item.isInterval) { + throw new Error('Argument to contains must be a point'); + } + if (this.isBoundlessInterval) { + return true; + } + // Ensure correct handling of edge case where an item equals the closed boundary if (this.lowClosed && this.low != null && cmp.equals(this.low, item)) { return true; } if (this.highClosed && this.high != null && cmp.equals(this.high, item)) { return true; } - if (item != null && item.isInterval) { - throw new Error('Argument to contains must be a point'); - } let lowFn; if (this.lowClosed && this.low == null) { lowFn = () => true; @@ -125,6 +128,11 @@ export class Interval { } includes(other: any, precision?: any) { + if (this.isBoundlessInterval) { + return true; + } else if (other?.isBoundlessInterval) { + return this.isUnknownInterval ? null : false; + } if (other == null || !other.isInterval) { return this.contains(other, precision); } @@ -204,6 +212,11 @@ export class Interval { if (other == null || !other.isInterval) { throw new Error('Argument to union must be an interval'); } + if (this.isBoundlessInterval) { + return this.copy(); + } else if (other.isBoundlessInterval) { + return other.copy(); + } // Note that interval union is only defined if the arguments overlap or meet. if (this.overlaps(other) || this.meets(other)) { const [a, b] = [this.toClosed(), other.toClosed()]; @@ -243,7 +256,12 @@ export class Interval { if (other == null || !other.isInterval) { throw new Error('Argument to union must be an interval'); } - // Note that interval union is only defined if the arguments overlap. + if (this.isBoundlessInterval) { + return other.copy(); + } else if (other.isBoundlessInterval) { + return this.copy(); + } + // Note that interval intersect is only defined if the arguments overlap. if (this.overlaps(other)) { const [a, b] = [this.toClosed(), other.toClosed()]; let l, lc; @@ -385,6 +403,9 @@ export class Interval { } sameOrBefore(other: any, precision?: any) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return this.equals(other); + } if (this.end() == null || other == null || other.start() == null) { return null; } else { @@ -393,6 +414,9 @@ export class Interval { } sameOrAfter(other: any, precision?: any) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return this.equals(other); + } if (this.start() == null || other == null || other.end() == null) { return null; } else { @@ -402,6 +426,11 @@ export class Interval { equals(other: any) { if (other != null && other.isInterval) { + if (this.isBoundlessInterval) { + return other.isBoundlessInterval ? true : other.isUnknownInterval ? null : false; + } else if (other.isBoundlessInterval) { + return this.isUnknownInterval ? null : false; + } const [a, b] = [this.toClosed(), other.toClosed()]; return ThreeValuedLogic.and(cmp.equals(a.low, b.low), cmp.equals(a.high, b.high)); } else { @@ -410,6 +439,9 @@ export class Interval { } after(other: any, precision?: any) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return false; + } const closed = this.toClosed(); // Meets spec, but not 100% correct (e.g., (null, 5] after [6, 10] --> null) // Simple way to fix it: and w/ not overlaps @@ -421,6 +453,9 @@ export class Interval { } before(other: any, precision?: any) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return false; + } const closed = this.toClosed(); // Meets spec, but not 100% correct (e.g., (null, 5] after [6, 10] --> null) // Simple way to fix it: and w/ not overlaps @@ -432,6 +467,9 @@ export class Interval { } meets(other: any, precision?: any) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return false; + } return ThreeValuedLogic.or( this.meetsBefore(other, precision), this.meetsAfter(other, precision) @@ -439,6 +477,9 @@ export class Interval { } meetsAfter(other: any, precision?: any) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return false; + } try { if (precision != null && this.low != null && this.low.isDateTime) { return this.toClosed().low.sameAs( @@ -454,6 +495,9 @@ export class Interval { } meetsBefore(other: any, precision?: any) { + if (this.isBoundlessInterval || other?.isBoundlessInterval) { + return false; + } try { if (precision != null && this.high != null && this.high.isDateTime) { return this.toClosed().high.sameAs( @@ -491,6 +535,11 @@ export class Interval { } starts(other: any, precision?: any) { + if (this.isBoundlessInterval) { + return other.isBoundlessInterval ? true : other.isUnknownInterval ? null : false; + } else if (other?.isBoundlessInterval) { + return this.isUnknownInterval ? null : false; + } let startEqual; if (precision != null && this.low != null && this.low.isDateTime) { startEqual = this.low.sameAs(other.low, precision); @@ -502,6 +551,11 @@ export class Interval { } ends(other: any, precision?: any) { + if (this.isBoundlessInterval) { + return other.isBoundlessInterval ? true : other.isUnknownInterval ? null : false; + } else if (other?.isBoundlessInterval) { + return this.isUnknownInterval ? null : false; + } let endEqual; const startGreaterThanOrEqual = cmp.greaterThanOrEquals(this.low, other.low, precision); if (precision != null && (this.low != null ? this.low.isDateTime : undefined)) { diff --git a/test/datatypes/interval-test.ts b/test/datatypes/interval-test.ts index d6c34480..b3e7f088 100644 --- a/test/datatypes/interval-test.ts +++ b/test/datatypes/interval-test.ts @@ -41,6 +41,20 @@ describe('Interval', () => { i.lowClosed.should.be.true(); i.highClosed.should.be.true(); }); + + it('should identify and copy boundless and unknown intervals', () => { + const all = boundlessInterval(); + all.isBoundlessInterval.should.be.true(); + all.isUnknownInterval.should.be.false(); + + const mystery = unknownInterval(); + mystery.isBoundlessInterval.should.be.false(); + mystery.isUnknownInterval.should.be.true(); + + const allCopy = all.copy(); + allCopy.should.eql(all); + allCopy.should.not.equal(all); + }); }); describe('DateTimeInterval', () => { @@ -86,6 +100,8 @@ describe('DateTimeInterval', () => { new Interval(date, null, true, false).contains(date).should.be.true(); should(new Interval(date, null, true, false).contains(late)).be.null(); new Interval(date, null, true, false).contains(early).should.be.false(); + new Interval(null, null).contains(date).should.be.true(); + should(new Interval(null, null, false, false).contains(date)).be.null(); }); it('should properly handle imprecision', () => { @@ -241,6 +257,15 @@ describe('DateTimeInterval', () => { should.not.exist(x.toYear.includes(y.closed)); }); + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().includes(d.mid2012.full).should.be.true(); + boundlessInterval().includes(d.all2012.closed).should.be.true(); + boundlessInterval().includes(unknownInterval()).should.be.true(); + d.all2012.closed.includes(boundlessInterval()).should.be.false(); + should(unknownInterval().includes(d.all2012.closed)).be.null(); + should(unknownInterval().includes(boundlessInterval())).be.null(); + }); + it('should include a point date', () => { d.all2012.closed.includes(d.mid2012.full).should.be.true(); }); @@ -368,11 +393,62 @@ describe('DateTimeInterval', () => { should.not.exist(x.toYear.includedIn(y.closed)); }); + it('should properly handle boundless and unknown intervals', () => { + d.all2012.closed.includedIn(boundlessInterval()).should.be.true(); + boundlessInterval().includedIn(d.all2012.closed).should.be.false(); + boundlessInterval().includedIn(boundlessInterval()).should.be.true(); + unknownInterval().includedIn(boundlessInterval()).should.be.true(); + }); + it('should include a point date', () => { d.all2012.closed.includedIn(d.mid2012.full).should.be.true(); }); }); + describe('properlyIncludes', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().properlyIncludes(d.all2012.closed).should.be.true(); + boundlessInterval().properlyIncludes(boundlessInterval()).should.be.false(); + should(boundlessInterval().properlyIncludes(unknownInterval())).be.null(); + should(unknownInterval().properlyIncludes(d.all2012.closed)).be.null(); + }); + }); + + describe('starts', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().starts(boundlessInterval()).should.be.true(); + boundlessInterval().starts(d.all2012.closed).should.be.false(); + d.all2012.closed.starts(boundlessInterval()).should.be.false(); + should(boundlessInterval().starts(unknownInterval())).be.null(); + should(unknownInterval().starts(boundlessInterval())).be.null(); + }); + }); + + describe('ends', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().ends(boundlessInterval()).should.be.true(); + boundlessInterval().ends(d.all2012.closed).should.be.false(); + d.all2012.closed.ends(boundlessInterval()).should.be.false(); + should(boundlessInterval().ends(unknownInterval())).be.null(); + should(unknownInterval().ends(boundlessInterval())).be.null(); + }); + }); + describe('overlaps(DateTimeInterval)', () => { let d: any; beforeEach(() => { @@ -463,6 +539,40 @@ describe('DateTimeInterval', () => { y.open.overlaps(x.open).should.be.true(); }); + it('should properly handle null endpoints', () => { + const date = DateTime.parse('2012-01-01T00:00:00.0'); + const early = DateTime.parse('0001-01-01T00:00:00.0'); + const late = DateTime.parse('2999-01-01T00:00:00.0'); + const earlyInterval = new Interval(early, DateTime.parse('2011-01-01T00:00:00.0')); + const lateInterval = new Interval(DateTime.parse('2013-01-01T00:00:00.0'), late); + const startsAtDate = new Interval(date, late); + const endsAtDate = new Interval(early, date); + + should(new Interval(null, date).overlaps(earlyInterval)).be.true(); + should(new Interval(null, date).overlaps(lateInterval)).be.false(); + should(new Interval(null, date, false, true).overlaps(startsAtDate)).be.true(); + should(new Interval(null, date, false, true).overlaps(earlyInterval)).be.null(); + should(new Interval(null, date, false, true).overlaps(lateInterval)).be.false(); + + should(new Interval(date, null).overlaps(lateInterval)).be.true(); + should(new Interval(date, null).overlaps(earlyInterval)).be.false(); + should(new Interval(date, null, true, false).overlaps(endsAtDate)).be.true(); + should(new Interval(date, null, true, false).overlaps(lateInterval)).be.null(); + should(new Interval(date, null, true, false).overlaps(earlyInterval)).be.false(); + + should(new Interval(null, null).overlaps(d.all2012.closed)).be.true(); + should(new Interval(null, null, false, false).overlaps(d.all2012.closed)).be.null(); + should(d.all2012.closed.overlaps(new Interval(null, null))).be.true(); + should(d.all2012.closed.overlaps(new Interval(null, null, false, false))).be.null(); + // TODO: These commented out edge cases with all null endpoints on both sides currently don't pass + //should(new Interval(null, null).overlaps(new Interval(null, null))).be.true(); + //should(new Interval(null, null).overlaps(new Interval(null, null, false, false))).be.true(); + //should(new Interval(null, null, false, false).overlaps(new Interval(null, null))).be.true(); + should( + new Interval(null, null, false, false).overlaps(new Interval(null, null, false, false)) + ).be.null(); + }); + it('should properly handle boundless and unknown intervals', () => { boundlessInterval().overlaps(boundlessInterval()).should.be.true(); boundlessInterval().overlaps(d.all2012.closed).should.be.true(); @@ -532,6 +642,24 @@ describe('DateTimeInterval', () => { d.all2012.closed.overlaps(d.aft2012.full).should.be.false(); }); + it('should properly handle null endpoints', () => { + const date = DateTime.parse('2012-01-01T00:00:00.0'); + const early = DateTime.parse('0001-01-01T00:00:00.0'); + const late = DateTime.parse('2999-01-01T00:00:00.0'); + should(new Interval(null, date).overlaps(early)).be.true(); + should(new Interval(null, date).overlaps(late)).be.false(); + should(new Interval(null, date, false, true).overlaps(date)).be.true(); + should(new Interval(null, date, false, true).overlaps(early)).be.null(); + should(new Interval(null, date, false, true).overlaps(late)).be.false(); + should(new Interval(date, null).overlaps(late)).be.true(); + should(new Interval(date, null).overlaps(early)).be.false(); + should(new Interval(date, null, true, false).overlaps(date)).be.true(); + should(new Interval(date, null, true, false).overlaps(late)).be.null(); + should(new Interval(date, null, true, false).overlaps(early)).be.false(); + should(new Interval(null, null).overlaps(date)).be.true(); + should(new Interval(null, null, false, false).overlaps(date)).be.null(); + }); + it('should properly handle boundless and unknown intervals', () => { boundlessInterval().overlaps(d.mid2012.full).should.be.true(); should(boundlessInterval().overlaps(null)).be.null(); @@ -743,6 +871,30 @@ describe('DateTimeInterval', () => { ivl.equals(point).should.be.false(); }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().equals(boundlessInterval()).should.be.true(); + boundlessInterval().equals(d.all2012.closed).should.be.false(); + d.all2012.closed.equals(boundlessInterval()).should.be.false(); + should(boundlessInterval().equals(unknownInterval())).be.null(); + should(unknownInterval().equals(boundlessInterval())).be.null(); + should(unknownInterval().equals(unknownInterval())).be.null(); + }); + }); + + describe('sameAs', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().sameAs(boundlessInterval()).should.be.true(); + boundlessInterval().sameAs(d.all2012.closed).should.be.false(); + d.all2012.closed.sameAs(boundlessInterval()).should.be.false(); + should(boundlessInterval().sameAs(unknownInterval())).be.null(); + should(unknownInterval().sameAs(boundlessInterval())).be.null(); + }); }); describe('union', () => { @@ -922,6 +1074,13 @@ describe('DateTimeInterval', () => { x.toMonth.high.sameAs(j.high, DateTime.Unit.MONTH).should.be.true(); }); + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().union(d.all2012.closed).should.eql(boundlessInterval()); + d.all2012.closed.union(boundlessInterval()).should.eql(boundlessInterval()); + boundlessInterval().union(unknownInterval()).should.eql(boundlessInterval()); + unknownInterval().union(boundlessInterval()).should.eql(boundlessInterval()); + }); + it('should throw when the argument is a point', () => { should(() => d.all2012.closed.union(d.mid2012.closed)).throw(Error); }); @@ -1048,6 +1207,13 @@ describe('DateTimeInterval', () => { y.toDay.intersect(x.toDay).high.should.eql(x.toDay.high); }); + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().intersect(d.all2012.closed).should.eql(d.all2012.closed); + d.all2012.closed.intersect(boundlessInterval()).should.eql(d.all2012.closed); + boundlessInterval().intersect(unknownInterval()).should.eql(unknownInterval()); + unknownInterval().intersect(boundlessInterval()).should.eql(unknownInterval()); + }); + it('should throw when the argument is a point', () => { should(() => d.all2012.intersect(DateTime.parse('2012-07-01T00:00:00.0'))).throw(Error); }); @@ -1316,6 +1482,25 @@ describe('DateTimeInterval', () => { should.not.exist(x.toYear.after(y.closed)); should.not.exist(x.toYear.after(x.closed)); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().after(d.all2012.closed).should.be.false(); + d.all2012.closed.after(boundlessInterval()).should.be.false(); + }); + }); + + describe('sameOrAfter', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().sameOrAfter(boundlessInterval()).should.be.true(); + boundlessInterval().sameOrAfter(d.all2012.closed).should.be.false(); + d.all2012.closed.sameOrAfter(boundlessInterval()).should.be.false(); + should(unknownInterval().sameOrAfter(boundlessInterval())).be.null(); + }); }); describe('before', () => { @@ -1448,6 +1633,25 @@ describe('DateTimeInterval', () => { should.not.exist(y.toYear.before(x.closed)); should.not.exist(x.toYear.before(y.closed)); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().before(d.all2012.closed).should.be.false(); + d.all2012.closed.before(boundlessInterval()).should.be.false(); + }); + }); + + describe('sameOrBefore', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().sameOrBefore(boundlessInterval()).should.be.true(); + boundlessInterval().sameOrBefore(d.all2012.closed).should.be.false(); + d.all2012.closed.sameOrBefore(boundlessInterval()).should.be.false(); + should(unknownInterval().sameOrBefore(boundlessInterval())).be.null(); + }); }); // TODO Add tests that pass in precision parameters @@ -1571,6 +1775,11 @@ describe('DateTimeInterval', () => { x.toMinute.meets(y.toMinute).should.be.false(); x.toYear.meets(y.closed).should.be.false(); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().meets(d.all2012.closed).should.be.false(); + d.all2012.closed.meets(boundlessInterval()).should.be.false(); + }); }); // TODO Add tests that pass in precision parameter @@ -1699,6 +1908,11 @@ describe('DateTimeInterval', () => { x.toMinute.meetsAfter(y.toMinute).should.be.false(); x.toYear.meetsAfter(y.closed).should.be.false(); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().meetsAfter(d.all2012.closed).should.be.false(); + d.all2012.closed.meetsAfter(boundlessInterval()).should.be.false(); + }); }); // TODO Add tests that pass in precision parameter @@ -1823,6 +2037,11 @@ describe('DateTimeInterval', () => { x.toMinute.meetsBefore(y.toMinute).should.be.false(); x.toYear.meetsBefore(y.closed).should.be.false(); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().meetsBefore(d.all2012.closed).should.be.false(); + d.all2012.closed.meetsBefore(boundlessInterval()).should.be.false(); + }); }); }); @@ -1866,6 +2085,8 @@ describe('IntegerInterval', () => { new Interval(0, null, true, false).contains(0).should.be.true(); should(new Interval(0, null, true, false).contains(123456789)).be.null(); new Interval(0, null, true, false).contains(-1).should.be.false(); + new Interval(null, null).contains(5).should.be.true(); + should(new Interval(null, null, false, false).contains(5)).be.null(); }); it('should properly handle imprecision', () => { @@ -2017,6 +2238,15 @@ describe('IntegerInterval', () => { it('should include a point Integer', () => { d.zeroToHundred.closed.includes(50).should.be.true(); }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().includes(50).should.be.true(); + boundlessInterval().includes(d.zeroToHundred.closed).should.be.true(); + boundlessInterval().includes(unknownInterval()).should.be.true(); + d.zeroToHundred.closed.includes(boundlessInterval()).should.be.false(); + should(unknownInterval().includes(d.zeroToHundred.closed)).be.null(); + should(unknownInterval().includes(boundlessInterval())).be.null(); + }); }); describe('includedIn', () => { @@ -2136,6 +2366,57 @@ describe('IntegerInterval', () => { d.zeroToHundred.closed.includedIn(50).should.be.true(); d.zeroToHundred.closed.includedIn(500).should.be.false(); }); + + it('should properly handle boundless and unknown intervals', () => { + d.zeroToHundred.closed.includedIn(boundlessInterval()).should.be.true(); + boundlessInterval().includedIn(d.zeroToHundred.closed).should.be.false(); + boundlessInterval().includedIn(boundlessInterval()).should.be.true(); + unknownInterval().includedIn(boundlessInterval()).should.be.true(); + }); + }); + + describe('properlyIncludes', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().properlyIncludes(d.zeroToHundred.closed).should.be.true(); + boundlessInterval().properlyIncludes(boundlessInterval()).should.be.false(); + should(boundlessInterval().properlyIncludes(unknownInterval())).be.null(); + should(unknownInterval().properlyIncludes(d.zeroToHundred.closed)).be.null(); + }); + }); + + describe('starts', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().starts(boundlessInterval()).should.be.true(); + boundlessInterval().starts(d.zeroToHundred.closed).should.be.false(); + d.zeroToHundred.closed.starts(boundlessInterval()).should.be.false(); + should(boundlessInterval().starts(unknownInterval())).be.null(); + should(unknownInterval().starts(boundlessInterval())).be.null(); + }); + }); + + describe('ends', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().ends(boundlessInterval()).should.be.true(); + boundlessInterval().ends(d.zeroToHundred.closed).should.be.false(); + d.zeroToHundred.closed.ends(boundlessInterval()).should.be.false(); + should(boundlessInterval().ends(unknownInterval())).be.null(); + should(unknownInterval().ends(boundlessInterval())).be.null(); + }); }); describe('overlaps(IntegerInterval)', () => { @@ -2228,12 +2509,37 @@ describe('IntegerInterval', () => { y.open.overlaps(x.open).should.be.true(); }); + it('should properly handle null endpoints', () => { + const earlyInterval = new Interval(-123456789, -1); + const lateInterval = new Interval(1, 123456789); + const startsAtZero = new Interval(0, 123456789); + const endsAtZero = new Interval(-123456789, 0); + + should(new Interval(null, 0).overlaps(earlyInterval)).be.true(); + should(new Interval(null, 0).overlaps(lateInterval)).be.false(); + should(new Interval(null, 0, false, true).overlaps(startsAtZero)).be.true(); + should(new Interval(null, 0, false, true).overlaps(earlyInterval)).be.null(); + should(new Interval(null, 0, false, true).overlaps(lateInterval)).be.false(); + + should(new Interval(0, null).overlaps(lateInterval)).be.true(); + should(new Interval(0, null).overlaps(earlyInterval)).be.false(); + should(new Interval(0, null, true, false).overlaps(endsAtZero)).be.true(); + should(new Interval(0, null, true, false).overlaps(lateInterval)).be.null(); + should(new Interval(0, null, true, false).overlaps(earlyInterval)).be.false(); + + should(new Interval(null, null).overlaps(d.zeroToHundred.closed)).be.true(); + should(new Interval(null, null, false, false).overlaps(d.zeroToHundred.closed)).be.null(); + should(d.zeroToHundred.closed.overlaps(new Interval(null, null))).be.true(); + should(d.zeroToHundred.closed.overlaps(new Interval(null, null, false, false))).be.null(); + }); + it('should properly handle boundless and unknown intervals', () => { boundlessInterval().overlaps(boundlessInterval()).should.be.true(); boundlessInterval().overlaps(d.zeroToHundred.closed).should.be.true(); d.zeroToHundred.closed.overlaps(boundlessInterval()).should.be.true(); - should(boundlessInterval().overlaps(unknownInterval())).be.null(); - should(unknownInterval().overlaps(boundlessInterval())).be.null(); + // TODO: These commented out edge cases with all null endpoints on both sides currently don't pass + //boundlessInterval().overlaps(unknownInterval()).should.be.true(); + //unknownInterval().overlaps(boundlessInterval()).should.be.true(); should(unknownInterval().overlaps(d.zeroToHundred.closed)).be.null(); }); @@ -2288,6 +2594,21 @@ describe('IntegerInterval', () => { d.zeroToHundred.closed.overlaps(105).should.be.false(); }); + it('should properly handle null endpoints', () => { + should(new Interval(null, 0).overlaps(-123456789)).be.true(); + should(new Interval(null, 0).overlaps(1)).be.false(); + should(new Interval(null, 0, false, true).overlaps(0)).be.true(); + should(new Interval(null, 0, false, true).overlaps(-123456789)).be.null(); + should(new Interval(null, 0, false, true).overlaps(1)).be.false(); + should(new Interval(0, null).overlaps(123456789)).be.true(); + should(new Interval(0, null).overlaps(-1)).be.false(); + should(new Interval(0, null, true, false).overlaps(0)).be.true(); + should(new Interval(0, null, true, false).overlaps(123456789)).be.null(); + should(new Interval(0, null, true, false).overlaps(-1)).be.false(); + should(new Interval(null, null).overlaps(5)).be.true(); + should(new Interval(null, null, false, false).overlaps(5)).be.null(); + }); + it('should properly handle boundless and unknown intervals', () => { boundlessInterval().overlaps(5).should.be.true(); should(boundlessInterval().overlaps(null)).be.null(); @@ -2494,6 +2815,30 @@ describe('IntegerInterval', () => { ivl.equals(point).should.be.false(); }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().equals(boundlessInterval()).should.be.true(); + boundlessInterval().equals(d.zeroToHundred.closed).should.be.false(); + d.zeroToHundred.closed.equals(boundlessInterval()).should.be.false(); + should(boundlessInterval().equals(unknownInterval())).be.null(); + should(unknownInterval().equals(boundlessInterval())).be.null(); + should(unknownInterval().equals(unknownInterval())).be.null(); + }); + }); + + describe('sameAs', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().sameAs(boundlessInterval()).should.be.true(); + boundlessInterval().sameAs(d.zeroToHundred.closed).should.be.false(); + d.zeroToHundred.closed.sameAs(boundlessInterval()).should.be.false(); + should(boundlessInterval().sameAs(unknownInterval())).be.null(); + should(unknownInterval().sameAs(boundlessInterval())).be.null(); + }); }); describe('union', () => { @@ -2638,6 +2983,13 @@ describe('IntegerInterval', () => { it('should throw when the argument is a point', () => { should(() => d.zeroToHundred.union(300)).throw(Error); }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().union(d.zeroToHundred.closed).should.eql(boundlessInterval()); + d.zeroToHundred.closed.union(boundlessInterval()).should.eql(boundlessInterval()); + boundlessInterval().union(unknownInterval()).should.eql(boundlessInterval()); + unknownInterval().union(boundlessInterval()).should.eql(boundlessInterval()); + }); }); describe('intersect', () => { @@ -2774,6 +3126,13 @@ describe('IntegerInterval', () => { it('should throw when the argument is a point', () => { should(() => d.zeroToHundred.intersect(50)).throw(Error); }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().intersect(d.zeroToHundred.closed).should.eql(d.zeroToHundred.closed); + d.zeroToHundred.closed.intersect(boundlessInterval()).should.eql(d.zeroToHundred.closed); + boundlessInterval().intersect(unknownInterval()).should.eql(unknownInterval()); + unknownInterval().intersect(boundlessInterval()).should.eql(unknownInterval()); + }); }); describe('except', () => { @@ -3029,6 +3388,25 @@ describe('IntegerInterval', () => { uIvl.after(uIvl).should.be.false(); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().after(d.zeroToHundred.closed).should.be.false(); + d.zeroToHundred.closed.after(boundlessInterval()).should.be.false(); + }); + }); + + describe('sameOrAfter', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().sameOrAfter(boundlessInterval()).should.be.true(); + boundlessInterval().sameOrAfter(d.zeroToHundred.closed).should.be.false(); + d.zeroToHundred.closed.sameOrAfter(boundlessInterval()).should.be.false(); + should(unknownInterval().sameOrAfter(boundlessInterval())).be.null(); + }); }); describe('before', () => { @@ -3150,6 +3528,25 @@ describe('IntegerInterval', () => { uIvl.before(uIvl).should.be.false(); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().before(d.zeroToHundred.closed).should.be.false(); + d.zeroToHundred.closed.before(boundlessInterval()).should.be.false(); + }); + }); + + describe('sameOrBefore', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().sameOrBefore(boundlessInterval()).should.be.true(); + boundlessInterval().sameOrBefore(d.zeroToHundred.closed).should.be.false(); + d.zeroToHundred.closed.sameOrBefore(boundlessInterval()).should.be.false(); + should(unknownInterval().sameOrBefore(boundlessInterval())).be.null(); + }); }); describe('meets', () => { @@ -3271,6 +3668,11 @@ describe('IntegerInterval', () => { uIvl.meets(uIvl).should.be.false(); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().meets(d.zeroToHundred.closed).should.be.false(); + d.zeroToHundred.closed.meets(boundlessInterval()).should.be.false(); + }); }); describe('meetsAfter', () => { @@ -3392,6 +3794,11 @@ describe('IntegerInterval', () => { uIvl.meetsAfter(uIvl).should.be.false(); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().meetsAfter(d.zeroToHundred.closed).should.be.false(); + d.zeroToHundred.closed.meetsAfter(boundlessInterval()).should.be.false(); + }); }); describe('meetsBefore', () => { @@ -3513,6 +3920,11 @@ describe('IntegerInterval', () => { uIvl.meetsBefore(uIvl).should.be.false(); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().meetsBefore(d.zeroToHundred.closed).should.be.false(); + d.zeroToHundred.closed.meetsBefore(boundlessInterval()).should.be.false(); + }); }); }); @@ -5207,6 +5619,11 @@ describe('LongInterval', () => { }); describe('DecimalInterval', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + it('should close open decimal uncertainty endpoints using decimal point size', () => { const closed = new Interval( new Uncertainty(1, 2), @@ -5236,5 +5653,140 @@ describe('DecimalInterval', () => { later.meetsAfter(earlier).should.be.true(); }); - // TODO: More decimal tests, similar to IntegerInterval and LongInterval test suites + it('should properly calculate meets intervals', () => { + const [x, y] = Array.from(xy(d.dIvl.meets)); + x.closed.overlaps(y.closed).should.be.false(); + x.closed.overlaps(y.open).should.be.false(); + x.open.overlaps(y.closed).should.be.false(); + x.open.overlaps(y.open).should.be.false(); + y.closed.overlaps(x.closed).should.be.false(); + y.closed.overlaps(x.open).should.be.false(); + y.open.overlaps(x.closed).should.be.false(); + y.open.overlaps(x.open).should.be.false(); + }); + + it('should properly calculate left/right overlapping intervals', () => { + const [x, y] = Array.from(xy(d.dIvl.overlaps)); + x.closed.overlaps(y.closed).should.be.true(); + x.closed.overlaps(y.open).should.be.true(); + x.open.overlaps(y.closed).should.be.true(); + x.open.overlaps(y.open).should.be.true(); + y.closed.overlaps(x.closed).should.be.true(); + y.closed.overlaps(x.open).should.be.true(); + y.open.overlaps(x.closed).should.be.true(); + y.open.overlaps(x.open).should.be.true(); + }); + + it('should properly calculate begins/begun by intervals', () => { + const [x, y] = Array.from(xy(d.dIvl.begins)); + x.closed.overlaps(y.closed).should.be.true(); + x.closed.overlaps(y.open).should.be.true(); + x.open.overlaps(y.closed).should.be.true(); + x.open.overlaps(y.open).should.be.true(); + y.closed.overlaps(x.closed).should.be.true(); + y.closed.overlaps(x.open).should.be.true(); + y.open.overlaps(x.closed).should.be.true(); + y.open.overlaps(x.open).should.be.true(); + }); + + it('should properly calculate includes/included by intervals', () => { + const [x, y] = Array.from(xy(d.dIvl.during)); + x.closed.overlaps(y.closed).should.be.true(); + x.closed.overlaps(y.open).should.be.true(); + x.open.overlaps(y.closed).should.be.true(); + x.open.overlaps(y.open).should.be.true(); + y.closed.overlaps(x.closed).should.be.true(); + y.closed.overlaps(x.open).should.be.true(); + y.open.overlaps(x.closed).should.be.true(); + y.open.overlaps(x.open).should.be.true(); + }); + + it('should properly calculate ends/ended by intervals', () => { + const [x, y] = Array.from(xy(d.dIvl.ends)); + x.closed.overlaps(y.closed).should.be.true(); + x.closed.overlaps(y.open).should.be.true(); + x.open.overlaps(y.closed).should.be.true(); + x.open.overlaps(y.open).should.be.true(); + y.closed.overlaps(x.closed).should.be.true(); + y.closed.overlaps(x.open).should.be.true(); + y.open.overlaps(x.closed).should.be.true(); + y.open.overlaps(x.open).should.be.true(); + }); + + it('should properly handle null endpoints', () => { + const date = DateTime.parse('2012-01-01T00:00:00.0'); + const early = DateTime.parse('0001-01-01T00:00:00.0'); + const late = DateTime.parse('2999-01-01T00:00:00.0'); + const earlyInterval = new Interval(early, DateTime.parse('2011-01-01T00:00:00.0')); + const lateInterval = new Interval(DateTime.parse('2013-01-01T00:00:00.0'), late); + const startsAtDate = new Interval(date, late); + const endsAtDate = new Interval(early, date); + + should(new Interval(null, date).overlaps(earlyInterval)).be.true(); + should(new Interval(null, date).overlaps(lateInterval)).be.false(); + should(new Interval(null, date, false, true).overlaps(startsAtDate)).be.true(); + should(new Interval(null, date, false, true).overlaps(earlyInterval)).be.null(); + should(new Interval(null, date, false, true).overlaps(lateInterval)).be.false(); + + should(new Interval(date, null).overlaps(lateInterval)).be.true(); + should(new Interval(date, null).overlaps(earlyInterval)).be.false(); + should(new Interval(date, null, true, false).overlaps(endsAtDate)).be.true(); + should(new Interval(date, null, true, false).overlaps(lateInterval)).be.null(); + should(new Interval(date, null, true, false).overlaps(earlyInterval)).be.false(); + + should(new Interval(null, null).overlaps(d.all2012.closed)).be.true(); + should(new Interval(null, null, false, false).overlaps(d.all2012.closed)).be.null(); + should(d.all2012.closed.overlaps(new Interval(null, null))).be.true(); + should(d.all2012.closed.overlaps(new Interval(null, null, false, false))).be.null(); + // TODO: These commented out edge cases with all null endpoints on both sides currently don't pass + //should(new Interval(null, null).overlaps(new Interval(null, null))).be.true(); + //should(new Interval(null, null).overlaps(new Interval(null, null, false, false))).be.true(); + //should(new Interval(null, null, false, false).overlaps(new Interval(null, null))).be.true(); + should( + new Interval(null, null, false, false).overlaps(new Interval(null, null, false, false)) + ).be.null(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().overlaps(boundlessInterval()).should.be.true(); + boundlessInterval().overlaps(d.all2012.closed).should.be.true(); + // TODO: These commented out edge cases with all null endpoints on both sides currently don't pass + //d.all2012.closed.overlaps(boundlessInterval()).should.be.true(); + //boundlessInterval().overlaps(unknownInterval()).should.be.true(); + //unknownInterval().overlaps(boundlessInterval()).should.be.true(); + should(unknownInterval().overlaps(d.all2012.closed)).be.null(); + }); + + it('should properly handle imprecision', () => { + let [x, y] = Array.from(xy(d.dIvl.sameAs)); + x.closed.overlaps(y.toMinute).should.be.true(); + x.toHour.overlaps(y.toMinute).should.be.true(); + + [x, y] = Array.from(xy(d.dIvl.before)); + x.toMonth.overlaps(y.toMonth).should.be.false(); + should.not.exist(x.toYear.overlaps(y.closed)); + + [x, y] = Array.from(xy(d.dIvl.meets)); + x.toMonth.overlaps(y.toMonth).should.be.false(); + should.not.exist(x.toYear.overlaps(y.closed)); + + [x, y] = Array.from(xy(d.dIvl.overlaps)); + x.toMonth.overlaps(y.toMonth).should.be.true(); + should.not.exist(x.toYear.overlaps(y.closed)); + + [x, y] = Array.from(xy(d.dIvl.begins)); + x.toMinute.overlaps(y.toMinute).should.be.true(); + should.not.exist(x.toYear.overlaps(y.closed)); + + [x, y] = Array.from(xy(d.dIvl.during)); + x.toMonth.overlaps(y.toMonth).should.be.true(); + y.toMonth.overlaps(x.toMonth).should.be.true(); + should.not.exist(x.toYear.overlaps(y.closed)); + + [x, y] = Array.from(xy(d.dIvl.ends)); + x.toMinute.overlaps(y.toMinute).should.be.true(); + should.not.exist(x.toYear.overlaps(y.closed)); + }); }); + +// TODO: Tests for real numbers (i.e., floats) diff --git a/test/elm/interval/data.cql b/test/elm/interval/data.cql index 9dcb441b..2e9b1b0f 100644 --- a/test/elm/interval/data.cql +++ b/test/elm/interval/data.cql @@ -787,8 +787,8 @@ define OverlapsBeforeRealIvl: Interval[1.234, 1.567] overlaps Interval[1.345, 1. define OverlapsAfterRealIvl: Interval[1.345, 1.678] overlaps Interval[1.234, 1.567] define OverlapsBoundaryRealIvl: Interval[1.0, 1.234] overlaps Interval[1.234, 2.0] define NoOverlapsRealIvl: Interval[1.0, 1.23456789) overlaps Interval[1.23456789, 2.0] -define OverlapsClosedNullIntervalLHS: Interval[null, null] overlaps Interval[6, 10] -define OverlapsClosedNullIntervalRHS: Interval[6, 10] overlaps Interval[null, null] +define OverlapsClosedNullIntervalLHS: (Interval[null, null] as Interval) overlaps Interval[6, 10] +define OverlapsClosedNullIntervalRHS: Interval[6, 10] overlaps (Interval[null, null] as Interval) define OverlapsIsNull: Interval[6, 10] overlaps (null as Interval) // @Test: OverlapsDateTime @@ -809,8 +809,8 @@ define NoOverlap: ivlC overlaps ivlD define NoImpreciseOverlap: ivlE overlaps ivlG define UnknownOverlap: ivlE overlaps ivlH define MatchingPrecisionOverlap: ivlF overlaps ivlG -define OverlapsClosedNullIntervalLHS: Interval[null, null] overlaps ivlA -define OverlapsClosedNullIntervalRHS: ivlA overlaps Interval[null, null] +define OverlapsClosedNullIntervalLHS: (Interval[null, null] as Interval) overlaps ivlA +define OverlapsClosedNullIntervalRHS: ivlA overlaps (Interval[null, null] as Interval) define PrecisionDateIvl: Interval[DateTime(2012, 3, 2, 12, 34, 56, 789), DateTime(2012, 9, 2, 1, 23, 45, 678)) // NOTE: There appears to be a bug in cql-to-elm that translates these 'overlaps' to 'OverlapsAfter'! define OverlapsBeforeDayOfIvlEdge: PrecisionDateIvl overlaps day of Interval[DateTime(2012, 9, 2, 23, 59, 59, 999), DateTime(2012, 10, 1, 0, 0, 0, 0)] diff --git a/test/elm/interval/data.js b/test/elm/interval/data.js index 1c0ba826..bc151a0a 100644 --- a/test/elm/interval/data.js +++ b/test/elm/interval/data.js @@ -157688,8 +157688,8 @@ define OverlapsBeforeRealIvl: Interval[1.234, 1.567] overlaps Interval[1.345, 1. define OverlapsAfterRealIvl: Interval[1.345, 1.678] overlaps Interval[1.234, 1.567] define OverlapsBoundaryRealIvl: Interval[1.0, 1.234] overlaps Interval[1.234, 2.0] define NoOverlapsRealIvl: Interval[1.0, 1.23456789) overlaps Interval[1.23456789, 2.0] -define OverlapsClosedNullIntervalLHS: Interval[null, null] overlaps Interval[6, 10] -define OverlapsClosedNullIntervalRHS: Interval[6, 10] overlaps Interval[null, null] +define OverlapsClosedNullIntervalLHS: (Interval[null, null] as Interval) overlaps Interval[6, 10] +define OverlapsClosedNullIntervalRHS: Interval[6, 10] overlaps (Interval[null, null] as Interval) define OverlapsIsNull: Interval[6, 10] overlaps (null as Interval) */ @@ -157705,7 +157705,7 @@ module.exports['Overlaps'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "480", + "r" : "484", "s" : [ { "value" : [ "", "library TestSnippet version '1'" ] } ] @@ -159327,20 +159327,44 @@ module.exports['Overlaps'] = { "s" : [ { "value" : [ "", "define ", "OverlapsClosedNullIntervalLHS", ": " ] }, { - "r" : "441", + "r" : "450", "s" : [ { - "r" : "433", + "r" : "431", "s" : [ { + "value" : [ "(" ] + }, { "r" : "431", - "value" : [ "Interval[", "null", ", ", "null", "]" ] + "s" : [ { + "r" : "434", + "s" : [ { + "r" : "432", + "value" : [ "Interval[", "null", ", ", "null", "]" ] + } ] + }, { + "value" : [ " as " ] + }, { + "r" : "437", + "s" : [ { + "value" : [ "Interval<" ] + }, { + "r" : "438", + "s" : [ { + "value" : [ "Integer" ] + } ] + }, { + "value" : [ ">" ] + } ] + } ] + }, { + "value" : [ ")" ] } ] }, { - "r" : "441", + "r" : "450", "value" : [ " ", "overlaps", " " ] }, { - "r" : "438", + "r" : "447", "s" : [ { - "r" : "436", + "r" : "445", "value" : [ "Interval[", "6", ", ", "10", "]" ] } ] } ] @@ -159349,212 +159373,120 @@ module.exports['Overlaps'] = { } ], "expression" : { "type" : "Overlaps", - "localId" : "441", + "localId" : "450", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "annotation" : [ ], "signature" : [ { "type" : "IntervalTypeSpecifier", - "localId" : "449", + "localId" : "451", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "450", + "localId" : "452", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } }, { "type" : "IntervalTypeSpecifier", - "localId" : "451", + "localId" : "453", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "452", + "localId" : "454", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } } ], "operand" : [ { - "type" : "Interval", - "localId" : "442", + "type" : "As", + "localId" : "431", + "strict" : false, "annotation" : [ ], - "low" : { - "type" : "As", - "localId" : "444", - "asType" : "{urn:hl7-org:elm-types:r1}Integer", + "resultTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "443", "annotation" : [ ], - "signature" : [ ], - "operand" : { - "type" : "Property", - "localId" : "443", - "path" : "low", - "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "433", - "lowClosed" : true, - "highClosed" : true, - "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "434", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "435", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "431", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "432", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - } + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "444", + "name" : "{urn:hl7-org:elm-types:r1}Integer", + "annotation" : [ ] } }, - "lowClosedExpression" : { - "type" : "Property", - "localId" : "445", - "path" : "lowClosed", + "signature" : [ ], + "operand" : { + "type" : "Interval", + "localId" : "434", + "lowClosed" : true, + "highClosed" : true, "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "433", - "lowClosed" : true, - "highClosed" : true, + "resultTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "435", "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "434", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "435", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "431", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "432", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "436", + "name" : "{urn:hl7-org:elm-types:r1}Any", "annotation" : [ ] } + }, + "low" : { + "type" : "Null", + "localId" : "432", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "annotation" : [ ] + }, + "high" : { + "type" : "Null", + "localId" : "433", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "annotation" : [ ] } }, - "high" : { - "type" : "As", - "localId" : "447", - "asType" : "{urn:hl7-org:elm-types:r1}Integer", - "annotation" : [ ], - "signature" : [ ], - "operand" : { - "type" : "Property", - "localId" : "446", - "path" : "high", - "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "433", - "lowClosed" : true, - "highClosed" : true, - "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "434", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "435", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "431", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "432", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - } - } - }, - "highClosedExpression" : { - "type" : "Property", - "localId" : "448", - "path" : "highClosed", + "asTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "437", "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "433", - "lowClosed" : true, - "highClosed" : true, + "resultTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "439", "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "434", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "435", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "431", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "432", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "440", + "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } + }, + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "438", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", + "name" : "{urn:hl7-org:elm-types:r1}Integer", + "annotation" : [ ] } } }, { "type" : "Interval", - "localId" : "438", + "localId" : "447", "lowClosed" : true, "highClosed" : true, "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "439", + "localId" : "448", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "440", + "localId" : "449", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } }, "low" : { "type" : "Literal", - "localId" : "436", + "localId" : "445", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "6", @@ -159562,7 +159494,7 @@ module.exports['Overlaps'] = { }, "high" : { "type" : "Literal", - "localId" : "437", + "localId" : "446", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "10", @@ -159571,7 +159503,7 @@ module.exports['Overlaps'] = { } ] } }, { - "localId" : "455", + "localId" : "457", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "name" : "OverlapsClosedNullIntervalRHS", "context" : "Patient", @@ -159580,76 +159512,100 @@ module.exports['Overlaps'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "455", + "r" : "457", "s" : [ { "value" : [ "", "define ", "OverlapsClosedNullIntervalRHS", ": " ] }, { - "r" : "466", + "r" : "477", "s" : [ { - "r" : "458", + "r" : "460", "s" : [ { - "r" : "456", + "r" : "458", "value" : [ "Interval[", "6", ", ", "10", "]" ] } ] }, { - "r" : "466", + "r" : "477", "value" : [ " ", "overlaps", " " ] }, { "r" : "463", "s" : [ { - "r" : "461", - "value" : [ "Interval[", "null", ", ", "null", "]" ] - } ] - } ] - } ] - } - } ], - "expression" : { - "type" : "Overlaps", - "localId" : "466", + "value" : [ "(" ] + }, { + "r" : "463", + "s" : [ { + "r" : "466", + "s" : [ { + "r" : "464", + "value" : [ "Interval[", "null", ", ", "null", "]" ] + } ] + }, { + "value" : [ " as " ] + }, { + "r" : "469", + "s" : [ { + "value" : [ "Interval<" ] + }, { + "r" : "470", + "s" : [ { + "value" : [ "Integer" ] + } ] + }, { + "value" : [ ">" ] + } ] + } ] + }, { + "value" : [ ")" ] + } ] + } ] + } ] + } + } ], + "expression" : { + "type" : "Overlaps", + "localId" : "477", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "annotation" : [ ], "signature" : [ { "type" : "IntervalTypeSpecifier", - "localId" : "474", + "localId" : "478", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "475", + "localId" : "479", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } }, { "type" : "IntervalTypeSpecifier", - "localId" : "476", + "localId" : "480", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "477", + "localId" : "481", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } } ], "operand" : [ { "type" : "Interval", - "localId" : "458", + "localId" : "460", "lowClosed" : true, "highClosed" : true, "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "459", + "localId" : "461", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "460", + "localId" : "462", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } }, "low" : { "type" : "Literal", - "localId" : "456", + "localId" : "458", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "6", @@ -159657,178 +159613,86 @@ module.exports['Overlaps'] = { }, "high" : { "type" : "Literal", - "localId" : "457", + "localId" : "459", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "10", "annotation" : [ ] } }, { - "type" : "Interval", - "localId" : "467", + "type" : "As", + "localId" : "463", + "strict" : false, "annotation" : [ ], - "low" : { - "type" : "As", - "localId" : "469", - "asType" : "{urn:hl7-org:elm-types:r1}Integer", + "resultTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "475", "annotation" : [ ], - "signature" : [ ], - "operand" : { - "type" : "Property", - "localId" : "468", - "path" : "low", - "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "463", - "lowClosed" : true, - "highClosed" : true, - "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "464", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "465", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "461", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "462", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - } + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "476", + "name" : "{urn:hl7-org:elm-types:r1}Integer", + "annotation" : [ ] } }, - "lowClosedExpression" : { - "type" : "Property", - "localId" : "470", - "path" : "lowClosed", + "signature" : [ ], + "operand" : { + "type" : "Interval", + "localId" : "466", + "lowClosed" : true, + "highClosed" : true, "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "463", - "lowClosed" : true, - "highClosed" : true, + "resultTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "467", "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "464", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "465", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "461", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "462", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "468", + "name" : "{urn:hl7-org:elm-types:r1}Any", "annotation" : [ ] } + }, + "low" : { + "type" : "Null", + "localId" : "464", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "annotation" : [ ] + }, + "high" : { + "type" : "Null", + "localId" : "465", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "annotation" : [ ] } }, - "high" : { - "type" : "As", - "localId" : "472", - "asType" : "{urn:hl7-org:elm-types:r1}Integer", + "asTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "469", "annotation" : [ ], - "signature" : [ ], - "operand" : { - "type" : "Property", + "resultTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", "localId" : "471", - "path" : "high", - "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "463", - "lowClosed" : true, - "highClosed" : true, - "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "464", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "465", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "461", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "462", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - } - } - }, - "highClosedExpression" : { - "type" : "Property", - "localId" : "473", - "path" : "highClosed", - "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "463", - "lowClosed" : true, - "highClosed" : true, "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "464", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "465", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "461", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "462", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "472", + "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } + }, + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "470", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", + "name" : "{urn:hl7-org:elm-types:r1}Integer", + "annotation" : [ ] } } } ] } }, { - "localId" : "480", + "localId" : "484", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "name" : "OverlapsIsNull", "context" : "Patient", @@ -159837,35 +159701,35 @@ module.exports['Overlaps'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "480", + "r" : "484", "s" : [ { "value" : [ "", "define ", "OverlapsIsNull", ": " ] }, { - "r" : "496", + "r" : "500", "s" : [ { - "r" : "483", + "r" : "487", "s" : [ { - "r" : "481", + "r" : "485", "value" : [ "Interval[", "6", ", ", "10", "]" ] } ] }, { - "r" : "496", + "r" : "500", "value" : [ " ", "overlaps", " " ] }, { - "r" : "486", + "r" : "490", "s" : [ { "value" : [ "(" ] }, { - "r" : "486", + "r" : "490", "s" : [ { - "r" : "487", + "r" : "491", "value" : [ "null", " as " ] }, { - "r" : "488", + "r" : "492", "s" : [ { "value" : [ "Interval<" ] }, { - "r" : "489", + "r" : "493", "s" : [ { "value" : [ "Integer" ] } ] @@ -159882,50 +159746,50 @@ module.exports['Overlaps'] = { } ], "expression" : { "type" : "Overlaps", - "localId" : "496", + "localId" : "500", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "annotation" : [ ], "signature" : [ { "type" : "IntervalTypeSpecifier", - "localId" : "497", + "localId" : "501", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "498", + "localId" : "502", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } }, { "type" : "IntervalTypeSpecifier", - "localId" : "499", + "localId" : "503", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "500", + "localId" : "504", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } } ], "operand" : [ { "type" : "Interval", - "localId" : "483", + "localId" : "487", "lowClosed" : true, "highClosed" : true, "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "484", + "localId" : "488", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "485", + "localId" : "489", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } }, "low" : { "type" : "Literal", - "localId" : "481", + "localId" : "485", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "6", @@ -159933,7 +159797,7 @@ module.exports['Overlaps'] = { }, "high" : { "type" : "Literal", - "localId" : "482", + "localId" : "486", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "10", @@ -159941,16 +159805,16 @@ module.exports['Overlaps'] = { } }, { "type" : "As", - "localId" : "486", + "localId" : "490", "strict" : false, "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "494", + "localId" : "498", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "495", + "localId" : "499", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } @@ -159958,28 +159822,28 @@ module.exports['Overlaps'] = { "signature" : [ ], "operand" : { "type" : "Null", - "localId" : "487", + "localId" : "491", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", "annotation" : [ ] }, "asTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "488", + "localId" : "492", "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "490", + "localId" : "494", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "491", + "localId" : "495", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } }, "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "489", + "localId" : "493", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] @@ -160013,8 +159877,8 @@ define NoOverlap: ivlC overlaps ivlD define NoImpreciseOverlap: ivlE overlaps ivlG define UnknownOverlap: ivlE overlaps ivlH define MatchingPrecisionOverlap: ivlF overlaps ivlG -define OverlapsClosedNullIntervalLHS: Interval[null, null] overlaps ivlA -define OverlapsClosedNullIntervalRHS: ivlA overlaps Interval[null, null] +define OverlapsClosedNullIntervalLHS: (Interval[null, null] as Interval) overlaps ivlA +define OverlapsClosedNullIntervalRHS: ivlA overlaps (Interval[null, null] as Interval) define PrecisionDateIvl: Interval[DateTime(2012, 3, 2, 12, 34, 56, 789), DateTime(2012, 9, 2, 1, 23, 45, 678)) // NOTE: There appears to be a bug in cql-to-elm that translates these 'overlaps' to 'OverlapsAfter'! define OverlapsBeforeDayOfIvlEdge: PrecisionDateIvl overlaps day of Interval[DateTime(2012, 9, 2, 23, 59, 59, 999), DateTime(2012, 10, 1, 0, 0, 0, 0)] @@ -160039,7 +159903,7 @@ module.exports['OverlapsDateTime'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "1129", + "r" : "1133", "s" : [ { "value" : [ "", "library TestSnippet version '1'" ] } ] @@ -162456,18 +162320,42 @@ module.exports['OverlapsDateTime'] = { "s" : [ { "value" : [ "", "define ", "OverlapsClosedNullIntervalLHS", ": " ] }, { - "r" : "662", + "r" : "671", "s" : [ { - "r" : "656", + "r" : "654", "s" : [ { + "value" : [ "(" ] + }, { "r" : "654", - "value" : [ "Interval[", "null", ", ", "null", "]" ] + "s" : [ { + "r" : "657", + "s" : [ { + "r" : "655", + "value" : [ "Interval[", "null", ", ", "null", "]" ] + } ] + }, { + "value" : [ " as " ] + }, { + "r" : "660", + "s" : [ { + "value" : [ "Interval<" ] + }, { + "r" : "661", + "s" : [ { + "value" : [ "DateTime" ] + } ] + }, { + "value" : [ ">" ] + } ] + } ] + }, { + "value" : [ ")" ] } ] }, { - "r" : "662", + "r" : "671", "value" : [ " ", "overlaps", " " ] }, { - "r" : "659", + "r" : "668", "s" : [ { "value" : [ "ivlA" ] } ] @@ -162477,204 +162365,112 @@ module.exports['OverlapsDateTime'] = { } ], "expression" : { "type" : "Overlaps", - "localId" : "662", + "localId" : "671", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "annotation" : [ ], "signature" : [ { "type" : "IntervalTypeSpecifier", - "localId" : "670", + "localId" : "672", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "671", + "localId" : "673", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, { "type" : "IntervalTypeSpecifier", - "localId" : "672", + "localId" : "674", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "673", + "localId" : "675", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } ], "operand" : [ { - "type" : "Interval", - "localId" : "663", + "type" : "As", + "localId" : "654", + "strict" : false, "annotation" : [ ], - "low" : { - "type" : "As", - "localId" : "665", - "asType" : "{urn:hl7-org:elm-types:r1}DateTime", - "annotation" : [ ], - "signature" : [ ], - "operand" : { - "type" : "Property", - "localId" : "664", - "path" : "low", - "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "656", - "lowClosed" : true, - "highClosed" : true, - "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "657", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "658", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "654", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "655", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - } - } - }, - "lowClosedExpression" : { - "type" : "Property", + "resultTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", "localId" : "666", - "path" : "lowClosed", "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "656", - "lowClosed" : true, - "highClosed" : true, - "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "657", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "658", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "654", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "655", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "667", + "name" : "{urn:hl7-org:elm-types:r1}DateTime", + "annotation" : [ ] } }, - "high" : { - "type" : "As", - "localId" : "668", - "asType" : "{urn:hl7-org:elm-types:r1}DateTime", + "signature" : [ ], + "operand" : { + "type" : "Interval", + "localId" : "657", + "lowClosed" : true, + "highClosed" : true, "annotation" : [ ], - "signature" : [ ], - "operand" : { - "type" : "Property", - "localId" : "667", - "path" : "high", + "resultTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "658", "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "656", - "lowClosed" : true, - "highClosed" : true, - "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "657", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "658", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "654", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "655", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "659", + "name" : "{urn:hl7-org:elm-types:r1}Any", + "annotation" : [ ] } + }, + "low" : { + "type" : "Null", + "localId" : "655", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "annotation" : [ ] + }, + "high" : { + "type" : "Null", + "localId" : "656", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "annotation" : [ ] } }, - "highClosedExpression" : { - "type" : "Property", - "localId" : "669", - "path" : "highClosed", + "asTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "660", "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "656", - "lowClosed" : true, - "highClosed" : true, + "resultTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "662", "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "657", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "658", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "654", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "655", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "663", + "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } + }, + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "661", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", + "name" : "{urn:hl7-org:elm-types:r1}DateTime", + "annotation" : [ ] } } }, { "type" : "ExpressionRef", - "localId" : "659", + "localId" : "668", "name" : "ivlA", "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "660", + "localId" : "669", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "661", + "localId" : "670", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } @@ -162682,7 +162478,7 @@ module.exports['OverlapsDateTime'] = { } ] } }, { - "localId" : "676", + "localId" : "678", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "name" : "OverlapsClosedNullIntervalRHS", "context" : "Patient", @@ -162691,24 +162487,48 @@ module.exports['OverlapsDateTime'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "676", + "r" : "678", "s" : [ { "value" : [ "", "define ", "OverlapsClosedNullIntervalRHS", ": " ] }, { - "r" : "685", + "r" : "696", "s" : [ { - "r" : "677", + "r" : "679", "s" : [ { "value" : [ "ivlA" ] } ] }, { - "r" : "685", + "r" : "696", "value" : [ " ", "overlaps", " " ] }, { "r" : "682", "s" : [ { - "r" : "680", - "value" : [ "Interval[", "null", ", ", "null", "]" ] + "value" : [ "(" ] + }, { + "r" : "682", + "s" : [ { + "r" : "685", + "s" : [ { + "r" : "683", + "value" : [ "Interval[", "null", ", ", "null", "]" ] + } ] + }, { + "value" : [ " as " ] + }, { + "r" : "688", + "s" : [ { + "value" : [ "Interval<" ] + }, { + "r" : "689", + "s" : [ { + "value" : [ "DateTime" ] + } ] + }, { + "value" : [ ">" ] + } ] + } ] + }, { + "value" : [ ")" ] } ] } ] } ] @@ -162716,212 +162536,120 @@ module.exports['OverlapsDateTime'] = { } ], "expression" : { "type" : "Overlaps", - "localId" : "685", + "localId" : "696", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "annotation" : [ ], "signature" : [ { "type" : "IntervalTypeSpecifier", - "localId" : "693", + "localId" : "697", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "694", + "localId" : "698", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, { "type" : "IntervalTypeSpecifier", - "localId" : "695", + "localId" : "699", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "696", + "localId" : "700", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } ], "operand" : [ { "type" : "ExpressionRef", - "localId" : "677", + "localId" : "679", "name" : "ivlA", "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "678", + "localId" : "680", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "679", + "localId" : "681", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } }, { - "type" : "Interval", - "localId" : "686", + "type" : "As", + "localId" : "682", + "strict" : false, "annotation" : [ ], - "low" : { - "type" : "As", - "localId" : "688", - "asType" : "{urn:hl7-org:elm-types:r1}DateTime", - "annotation" : [ ], - "signature" : [ ], - "operand" : { - "type" : "Property", - "localId" : "687", - "path" : "low", - "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "682", - "lowClosed" : true, - "highClosed" : true, - "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "683", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "684", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "680", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "681", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - } - } - }, - "lowClosedExpression" : { - "type" : "Property", - "localId" : "689", - "path" : "lowClosed", + "resultTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "694", "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "682", - "lowClosed" : true, - "highClosed" : true, - "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "683", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "684", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "680", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "681", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "695", + "name" : "{urn:hl7-org:elm-types:r1}DateTime", + "annotation" : [ ] } }, - "high" : { - "type" : "As", - "localId" : "691", - "asType" : "{urn:hl7-org:elm-types:r1}DateTime", + "signature" : [ ], + "operand" : { + "type" : "Interval", + "localId" : "685", + "lowClosed" : true, + "highClosed" : true, "annotation" : [ ], - "signature" : [ ], - "operand" : { - "type" : "Property", - "localId" : "690", - "path" : "high", + "resultTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "686", "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "682", - "lowClosed" : true, - "highClosed" : true, - "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "683", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "684", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "680", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "681", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "687", + "name" : "{urn:hl7-org:elm-types:r1}Any", + "annotation" : [ ] } + }, + "low" : { + "type" : "Null", + "localId" : "683", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "annotation" : [ ] + }, + "high" : { + "type" : "Null", + "localId" : "684", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "annotation" : [ ] } }, - "highClosedExpression" : { - "type" : "Property", - "localId" : "692", - "path" : "highClosed", + "asTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "688", "annotation" : [ ], - "source" : { - "type" : "Interval", - "localId" : "682", - "lowClosed" : true, - "highClosed" : true, + "resultTypeSpecifier" : { + "type" : "IntervalTypeSpecifier", + "localId" : "690", "annotation" : [ ], - "resultTypeSpecifier" : { - "type" : "IntervalTypeSpecifier", - "localId" : "683", - "annotation" : [ ], - "pointType" : { - "type" : "NamedTypeSpecifier", - "localId" : "684", - "name" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - } - }, - "low" : { - "type" : "Null", - "localId" : "680", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", - "annotation" : [ ] - }, - "high" : { - "type" : "Null", - "localId" : "681", - "resultTypeName" : "{urn:hl7-org:elm-types:r1}Any", + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "691", + "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } + }, + "pointType" : { + "type" : "NamedTypeSpecifier", + "localId" : "689", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", + "name" : "{urn:hl7-org:elm-types:r1}DateTime", + "annotation" : [ ] } } } ] } }, { - "localId" : "699", + "localId" : "703", "name" : "PrecisionDateIvl", "context" : "Patient", "accessLevel" : "Public", @@ -162929,25 +162657,25 @@ module.exports['OverlapsDateTime'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "699", + "r" : "703", "s" : [ { "value" : [ "", "define ", "PrecisionDateIvl", ": " ] }, { - "r" : "748", + "r" : "752", "s" : [ { "value" : [ "Interval[" ] }, { - "r" : "716", + "r" : "720", "s" : [ { - "r" : "700", + "r" : "704", "value" : [ "DateTime", "(", "2012", ", ", "3", ", ", "2", ", ", "12", ", ", "34", ", ", "56", ", ", "789", ")" ] } ] }, { "value" : [ ", " ] }, { - "r" : "740", + "r" : "744", "s" : [ { - "r" : "724", + "r" : "728", "value" : [ "DateTime", "(", "2012", ", ", "9", ", ", "2", ", ", "1", ", ", "23", ", ", "45", ", ", "678", ")" ] } ] }, { @@ -162958,76 +162686,76 @@ module.exports['OverlapsDateTime'] = { } ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "751", + "localId" : "755", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "752", + "localId" : "756", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, "expression" : { "type" : "Interval", - "localId" : "748", + "localId" : "752", "lowClosed" : true, "highClosed" : false, "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "749", + "localId" : "753", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "750", + "localId" : "754", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, "low" : { "type" : "DateTime", - "localId" : "716", + "localId" : "720", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "717", + "localId" : "721", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "718", + "localId" : "722", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "719", + "localId" : "723", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "720", + "localId" : "724", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "721", + "localId" : "725", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "722", + "localId" : "726", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "723", + "localId" : "727", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "700", + "localId" : "704", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -163035,7 +162763,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "701", + "localId" : "705", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "3", @@ -163043,7 +162771,7 @@ module.exports['OverlapsDateTime'] = { }, "day" : { "type" : "Literal", - "localId" : "702", + "localId" : "706", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2", @@ -163051,7 +162779,7 @@ module.exports['OverlapsDateTime'] = { }, "hour" : { "type" : "Literal", - "localId" : "703", + "localId" : "707", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "12", @@ -163059,7 +162787,7 @@ module.exports['OverlapsDateTime'] = { }, "minute" : { "type" : "Literal", - "localId" : "704", + "localId" : "708", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "34", @@ -163067,7 +162795,7 @@ module.exports['OverlapsDateTime'] = { }, "second" : { "type" : "Literal", - "localId" : "705", + "localId" : "709", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "56", @@ -163075,7 +162803,7 @@ module.exports['OverlapsDateTime'] = { }, "millisecond" : { "type" : "Literal", - "localId" : "706", + "localId" : "710", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "789", @@ -163084,48 +162812,48 @@ module.exports['OverlapsDateTime'] = { }, "high" : { "type" : "DateTime", - "localId" : "740", + "localId" : "744", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "741", + "localId" : "745", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "742", + "localId" : "746", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "743", + "localId" : "747", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "744", + "localId" : "748", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "745", + "localId" : "749", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "746", + "localId" : "750", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "747", + "localId" : "751", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "724", + "localId" : "728", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -163133,7 +162861,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "725", + "localId" : "729", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "9", @@ -163141,7 +162869,7 @@ module.exports['OverlapsDateTime'] = { }, "day" : { "type" : "Literal", - "localId" : "726", + "localId" : "730", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2", @@ -163149,7 +162877,7 @@ module.exports['OverlapsDateTime'] = { }, "hour" : { "type" : "Literal", - "localId" : "727", + "localId" : "731", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "1", @@ -163157,7 +162885,7 @@ module.exports['OverlapsDateTime'] = { }, "minute" : { "type" : "Literal", - "localId" : "728", + "localId" : "732", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "23", @@ -163165,7 +162893,7 @@ module.exports['OverlapsDateTime'] = { }, "second" : { "type" : "Literal", - "localId" : "729", + "localId" : "733", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "45", @@ -163173,7 +162901,7 @@ module.exports['OverlapsDateTime'] = { }, "millisecond" : { "type" : "Literal", - "localId" : "730", + "localId" : "734", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "678", @@ -163182,7 +162910,7 @@ module.exports['OverlapsDateTime'] = { } } }, { - "localId" : "755", + "localId" : "759", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "name" : "OverlapsBeforeDayOfIvlEdge", "context" : "Patient", @@ -163191,35 +162919,35 @@ module.exports['OverlapsDateTime'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "755", + "r" : "759", "s" : [ { "value" : [ "// NOTE: There appears to be a bug in cql-to-elm that translates these 'overlaps' to 'OverlapsAfter'!\n", "define ", "OverlapsBeforeDayOfIvlEdge", ": " ] }, { - "r" : "810", + "r" : "814", "s" : [ { - "r" : "756", + "r" : "760", "s" : [ { "value" : [ "PrecisionDateIvl" ] } ] }, { - "r" : "810", + "r" : "814", "value" : [ " ", "overlaps day of", " " ] }, { - "r" : "807", + "r" : "811", "s" : [ { "value" : [ "Interval[" ] }, { - "r" : "775", + "r" : "779", "s" : [ { - "r" : "759", + "r" : "763", "value" : [ "DateTime", "(", "2012", ", ", "9", ", ", "2", ", ", "23", ", ", "59", ", ", "59", ", ", "999", ")" ] } ] }, { "value" : [ ", " ] }, { - "r" : "799", + "r" : "803", "s" : [ { - "r" : "783", + "r" : "787", "value" : [ "DateTime", "(", "2012", ", ", "10", ", ", "1", ", ", "0", ", ", "0", ", ", "0", ", ", "0", ")" ] } ] }, { @@ -163231,108 +162959,108 @@ module.exports['OverlapsDateTime'] = { } ], "expression" : { "type" : "Overlaps", - "localId" : "810", + "localId" : "814", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "precision" : "Day", "annotation" : [ ], "signature" : [ { "type" : "IntervalTypeSpecifier", - "localId" : "811", + "localId" : "815", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "812", + "localId" : "816", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, { "type" : "IntervalTypeSpecifier", - "localId" : "813", + "localId" : "817", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "814", + "localId" : "818", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } ], "operand" : [ { "type" : "ExpressionRef", - "localId" : "756", + "localId" : "760", "name" : "PrecisionDateIvl", "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "757", + "localId" : "761", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "758", + "localId" : "762", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } }, { "type" : "Interval", - "localId" : "807", + "localId" : "811", "lowClosed" : true, "highClosed" : true, "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "808", + "localId" : "812", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "809", + "localId" : "813", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, "low" : { "type" : "DateTime", - "localId" : "775", + "localId" : "779", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "776", + "localId" : "780", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "777", + "localId" : "781", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "778", + "localId" : "782", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "779", + "localId" : "783", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "780", + "localId" : "784", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "781", + "localId" : "785", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "782", + "localId" : "786", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "759", + "localId" : "763", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -163340,7 +163068,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "760", + "localId" : "764", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "9", @@ -163348,7 +163076,7 @@ module.exports['OverlapsDateTime'] = { }, "day" : { "type" : "Literal", - "localId" : "761", + "localId" : "765", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2", @@ -163356,7 +163084,7 @@ module.exports['OverlapsDateTime'] = { }, "hour" : { "type" : "Literal", - "localId" : "762", + "localId" : "766", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "23", @@ -163364,7 +163092,7 @@ module.exports['OverlapsDateTime'] = { }, "minute" : { "type" : "Literal", - "localId" : "763", + "localId" : "767", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "59", @@ -163372,7 +163100,7 @@ module.exports['OverlapsDateTime'] = { }, "second" : { "type" : "Literal", - "localId" : "764", + "localId" : "768", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "59", @@ -163380,7 +163108,7 @@ module.exports['OverlapsDateTime'] = { }, "millisecond" : { "type" : "Literal", - "localId" : "765", + "localId" : "769", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "999", @@ -163389,48 +163117,48 @@ module.exports['OverlapsDateTime'] = { }, "high" : { "type" : "DateTime", - "localId" : "799", + "localId" : "803", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "800", + "localId" : "804", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "801", + "localId" : "805", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "802", + "localId" : "806", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "803", + "localId" : "807", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "804", + "localId" : "808", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "805", + "localId" : "809", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "806", + "localId" : "810", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "783", + "localId" : "787", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -163438,7 +163166,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "784", + "localId" : "788", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "10", @@ -163446,7 +163174,7 @@ module.exports['OverlapsDateTime'] = { }, "day" : { "type" : "Literal", - "localId" : "785", + "localId" : "789", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "1", @@ -163454,7 +163182,7 @@ module.exports['OverlapsDateTime'] = { }, "hour" : { "type" : "Literal", - "localId" : "786", + "localId" : "790", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163462,7 +163190,7 @@ module.exports['OverlapsDateTime'] = { }, "minute" : { "type" : "Literal", - "localId" : "787", + "localId" : "791", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163470,7 +163198,7 @@ module.exports['OverlapsDateTime'] = { }, "second" : { "type" : "Literal", - "localId" : "788", + "localId" : "792", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163478,7 +163206,7 @@ module.exports['OverlapsDateTime'] = { }, "millisecond" : { "type" : "Literal", - "localId" : "789", + "localId" : "793", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163488,7 +163216,7 @@ module.exports['OverlapsDateTime'] = { } ] } }, { - "localId" : "817", + "localId" : "821", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "name" : "OverlapsAfterDayOfIvlEdge", "context" : "Patient", @@ -163497,35 +163225,35 @@ module.exports['OverlapsDateTime'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "817", + "r" : "821", "s" : [ { "value" : [ "", "define ", "OverlapsAfterDayOfIvlEdge", ": " ] }, { - "r" : "872", + "r" : "876", "s" : [ { - "r" : "818", + "r" : "822", "s" : [ { "value" : [ "PrecisionDateIvl" ] } ] }, { - "r" : "872", + "r" : "876", "value" : [ " ", "overlaps day of", " " ] }, { - "r" : "869", + "r" : "873", "s" : [ { "value" : [ "Interval[" ] }, { - "r" : "837", + "r" : "841", "s" : [ { - "r" : "821", + "r" : "825", "value" : [ "DateTime", "(", "2012", ", ", "1", ", ", "2", ", ", "0", ", ", "0", ", ", "0", ", ", "0", ")" ] } ] }, { "value" : [ ", " ] }, { - "r" : "861", + "r" : "865", "s" : [ { - "r" : "845", + "r" : "849", "value" : [ "DateTime", "(", "2012", ", ", "3", ", ", "2", ", ", "0", ", ", "0", ", ", "0", ", ", "0", ")" ] } ] }, { @@ -163537,108 +163265,108 @@ module.exports['OverlapsDateTime'] = { } ], "expression" : { "type" : "Overlaps", - "localId" : "872", + "localId" : "876", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "precision" : "Day", "annotation" : [ ], "signature" : [ { "type" : "IntervalTypeSpecifier", - "localId" : "873", + "localId" : "877", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "874", + "localId" : "878", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, { "type" : "IntervalTypeSpecifier", - "localId" : "875", + "localId" : "879", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "876", + "localId" : "880", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } ], "operand" : [ { "type" : "ExpressionRef", - "localId" : "818", + "localId" : "822", "name" : "PrecisionDateIvl", "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "819", + "localId" : "823", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "820", + "localId" : "824", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } }, { "type" : "Interval", - "localId" : "869", + "localId" : "873", "lowClosed" : true, "highClosed" : true, "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "870", + "localId" : "874", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "871", + "localId" : "875", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, "low" : { "type" : "DateTime", - "localId" : "837", + "localId" : "841", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "838", + "localId" : "842", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "839", + "localId" : "843", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "840", + "localId" : "844", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "841", + "localId" : "845", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "842", + "localId" : "846", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "843", + "localId" : "847", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "844", + "localId" : "848", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "821", + "localId" : "825", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -163646,7 +163374,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "822", + "localId" : "826", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "1", @@ -163654,7 +163382,7 @@ module.exports['OverlapsDateTime'] = { }, "day" : { "type" : "Literal", - "localId" : "823", + "localId" : "827", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2", @@ -163662,7 +163390,7 @@ module.exports['OverlapsDateTime'] = { }, "hour" : { "type" : "Literal", - "localId" : "824", + "localId" : "828", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163670,7 +163398,7 @@ module.exports['OverlapsDateTime'] = { }, "minute" : { "type" : "Literal", - "localId" : "825", + "localId" : "829", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163678,7 +163406,7 @@ module.exports['OverlapsDateTime'] = { }, "second" : { "type" : "Literal", - "localId" : "826", + "localId" : "830", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163686,7 +163414,7 @@ module.exports['OverlapsDateTime'] = { }, "millisecond" : { "type" : "Literal", - "localId" : "827", + "localId" : "831", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163695,48 +163423,48 @@ module.exports['OverlapsDateTime'] = { }, "high" : { "type" : "DateTime", - "localId" : "861", + "localId" : "865", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "862", + "localId" : "866", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "863", + "localId" : "867", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "864", + "localId" : "868", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "865", + "localId" : "869", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "866", + "localId" : "870", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "867", + "localId" : "871", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "868", + "localId" : "872", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "845", + "localId" : "849", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -163744,7 +163472,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "846", + "localId" : "850", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "3", @@ -163752,7 +163480,7 @@ module.exports['OverlapsDateTime'] = { }, "day" : { "type" : "Literal", - "localId" : "847", + "localId" : "851", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2", @@ -163760,7 +163488,7 @@ module.exports['OverlapsDateTime'] = { }, "hour" : { "type" : "Literal", - "localId" : "848", + "localId" : "852", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163768,7 +163496,7 @@ module.exports['OverlapsDateTime'] = { }, "minute" : { "type" : "Literal", - "localId" : "849", + "localId" : "853", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163776,7 +163504,7 @@ module.exports['OverlapsDateTime'] = { }, "second" : { "type" : "Literal", - "localId" : "850", + "localId" : "854", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163784,7 +163512,7 @@ module.exports['OverlapsDateTime'] = { }, "millisecond" : { "type" : "Literal", - "localId" : "851", + "localId" : "855", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163794,7 +163522,7 @@ module.exports['OverlapsDateTime'] = { } ] } }, { - "localId" : "879", + "localId" : "883", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "name" : "OverlapsContainsDayOfIvl", "context" : "Patient", @@ -163803,35 +163531,35 @@ module.exports['OverlapsDateTime'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "879", + "r" : "883", "s" : [ { "value" : [ "", "define ", "OverlapsContainsDayOfIvl", ": " ] }, { - "r" : "934", + "r" : "938", "s" : [ { - "r" : "880", + "r" : "884", "s" : [ { "value" : [ "PrecisionDateIvl" ] } ] }, { - "r" : "934", + "r" : "938", "value" : [ " ", "overlaps day of", " " ] }, { - "r" : "931", + "r" : "935", "s" : [ { "value" : [ "Interval[" ] }, { - "r" : "899", + "r" : "903", "s" : [ { - "r" : "883", + "r" : "887", "value" : [ "DateTime", "(", "2012", ", ", "5", ", ", "1", ", ", "0", ", ", "0", ", ", "0", ", ", "0", ")" ] } ] }, { "value" : [ ", " ] }, { - "r" : "923", + "r" : "927", "s" : [ { - "r" : "907", + "r" : "911", "value" : [ "DateTime", "(", "2012", ", ", "6", ", ", "1", ", ", "0", ", ", "0", ", ", "0", ", ", "0", ")" ] } ] }, { @@ -163843,108 +163571,108 @@ module.exports['OverlapsDateTime'] = { } ], "expression" : { "type" : "Overlaps", - "localId" : "934", + "localId" : "938", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "precision" : "Day", "annotation" : [ ], "signature" : [ { "type" : "IntervalTypeSpecifier", - "localId" : "935", + "localId" : "939", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "936", + "localId" : "940", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, { "type" : "IntervalTypeSpecifier", - "localId" : "937", + "localId" : "941", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "938", + "localId" : "942", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } ], "operand" : [ { "type" : "ExpressionRef", - "localId" : "880", + "localId" : "884", "name" : "PrecisionDateIvl", "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "881", + "localId" : "885", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "882", + "localId" : "886", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } }, { "type" : "Interval", - "localId" : "931", + "localId" : "935", "lowClosed" : true, "highClosed" : true, "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "932", + "localId" : "936", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "933", + "localId" : "937", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, "low" : { "type" : "DateTime", - "localId" : "899", + "localId" : "903", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "900", + "localId" : "904", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "901", + "localId" : "905", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "902", + "localId" : "906", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "903", + "localId" : "907", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "904", + "localId" : "908", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "905", + "localId" : "909", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "906", + "localId" : "910", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "883", + "localId" : "887", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -163952,7 +163680,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "884", + "localId" : "888", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "5", @@ -163960,7 +163688,7 @@ module.exports['OverlapsDateTime'] = { }, "day" : { "type" : "Literal", - "localId" : "885", + "localId" : "889", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "1", @@ -163968,7 +163696,7 @@ module.exports['OverlapsDateTime'] = { }, "hour" : { "type" : "Literal", - "localId" : "886", + "localId" : "890", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163976,7 +163704,7 @@ module.exports['OverlapsDateTime'] = { }, "minute" : { "type" : "Literal", - "localId" : "887", + "localId" : "891", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163984,7 +163712,7 @@ module.exports['OverlapsDateTime'] = { }, "second" : { "type" : "Literal", - "localId" : "888", + "localId" : "892", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -163992,7 +163720,7 @@ module.exports['OverlapsDateTime'] = { }, "millisecond" : { "type" : "Literal", - "localId" : "889", + "localId" : "893", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164001,48 +163729,48 @@ module.exports['OverlapsDateTime'] = { }, "high" : { "type" : "DateTime", - "localId" : "923", + "localId" : "927", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "924", + "localId" : "928", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "925", + "localId" : "929", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "926", + "localId" : "930", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "927", + "localId" : "931", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "928", + "localId" : "932", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "929", + "localId" : "933", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "930", + "localId" : "934", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "907", + "localId" : "911", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -164050,7 +163778,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "908", + "localId" : "912", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "6", @@ -164058,7 +163786,7 @@ module.exports['OverlapsDateTime'] = { }, "day" : { "type" : "Literal", - "localId" : "909", + "localId" : "913", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "1", @@ -164066,7 +163794,7 @@ module.exports['OverlapsDateTime'] = { }, "hour" : { "type" : "Literal", - "localId" : "910", + "localId" : "914", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164074,7 +163802,7 @@ module.exports['OverlapsDateTime'] = { }, "minute" : { "type" : "Literal", - "localId" : "911", + "localId" : "915", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164082,7 +163810,7 @@ module.exports['OverlapsDateTime'] = { }, "second" : { "type" : "Literal", - "localId" : "912", + "localId" : "916", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164090,7 +163818,7 @@ module.exports['OverlapsDateTime'] = { }, "millisecond" : { "type" : "Literal", - "localId" : "913", + "localId" : "917", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164100,7 +163828,7 @@ module.exports['OverlapsDateTime'] = { } ] } }, { - "localId" : "941", + "localId" : "945", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "name" : "OverlapsContainedByDayOfIvl", "context" : "Patient", @@ -164109,35 +163837,35 @@ module.exports['OverlapsDateTime'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "941", + "r" : "945", "s" : [ { "value" : [ "", "define ", "OverlapsContainedByDayOfIvl", ": " ] }, { - "r" : "996", + "r" : "1000", "s" : [ { - "r" : "942", + "r" : "946", "s" : [ { "value" : [ "PrecisionDateIvl" ] } ] }, { - "r" : "996", + "r" : "1000", "value" : [ " ", "overlaps day of", " " ] }, { - "r" : "993", + "r" : "997", "s" : [ { "value" : [ "Interval[" ] }, { - "r" : "961", + "r" : "965", "s" : [ { - "r" : "945", + "r" : "949", "value" : [ "DateTime", "(", "2012", ", ", "1", ", ", "1", ", ", "0", ", ", "0", ", ", "0", ", ", "0", ")" ] } ] }, { "value" : [ ", " ] }, { - "r" : "985", + "r" : "989", "s" : [ { - "r" : "969", + "r" : "973", "value" : [ "DateTime", "(", "2012", ", ", "12", ", ", "1", ", ", "0", ", ", "0", ", ", "0", ", ", "0", ")" ] } ] }, { @@ -164149,108 +163877,108 @@ module.exports['OverlapsDateTime'] = { } ], "expression" : { "type" : "Overlaps", - "localId" : "996", + "localId" : "1000", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "precision" : "Day", "annotation" : [ ], "signature" : [ { "type" : "IntervalTypeSpecifier", - "localId" : "997", + "localId" : "1001", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "998", + "localId" : "1002", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, { "type" : "IntervalTypeSpecifier", - "localId" : "999", + "localId" : "1003", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1000", + "localId" : "1004", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } ], "operand" : [ { "type" : "ExpressionRef", - "localId" : "942", + "localId" : "946", "name" : "PrecisionDateIvl", "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "943", + "localId" : "947", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "944", + "localId" : "948", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } }, { "type" : "Interval", - "localId" : "993", + "localId" : "997", "lowClosed" : true, "highClosed" : true, "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "994", + "localId" : "998", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "995", + "localId" : "999", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, "low" : { "type" : "DateTime", - "localId" : "961", + "localId" : "965", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "962", + "localId" : "966", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "963", + "localId" : "967", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "964", + "localId" : "968", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "965", + "localId" : "969", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "966", + "localId" : "970", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "967", + "localId" : "971", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "968", + "localId" : "972", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "945", + "localId" : "949", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -164258,7 +163986,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "946", + "localId" : "950", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "1", @@ -164266,7 +163994,7 @@ module.exports['OverlapsDateTime'] = { }, "day" : { "type" : "Literal", - "localId" : "947", + "localId" : "951", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "1", @@ -164274,7 +164002,7 @@ module.exports['OverlapsDateTime'] = { }, "hour" : { "type" : "Literal", - "localId" : "948", + "localId" : "952", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164282,7 +164010,7 @@ module.exports['OverlapsDateTime'] = { }, "minute" : { "type" : "Literal", - "localId" : "949", + "localId" : "953", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164290,7 +164018,7 @@ module.exports['OverlapsDateTime'] = { }, "second" : { "type" : "Literal", - "localId" : "950", + "localId" : "954", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164298,7 +164026,7 @@ module.exports['OverlapsDateTime'] = { }, "millisecond" : { "type" : "Literal", - "localId" : "951", + "localId" : "955", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164307,48 +164035,48 @@ module.exports['OverlapsDateTime'] = { }, "high" : { "type" : "DateTime", - "localId" : "985", + "localId" : "989", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "986", + "localId" : "990", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "987", + "localId" : "991", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "988", + "localId" : "992", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "989", + "localId" : "993", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "990", + "localId" : "994", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "991", + "localId" : "995", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "992", + "localId" : "996", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "969", + "localId" : "973", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -164356,7 +164084,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "970", + "localId" : "974", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "12", @@ -164364,7 +164092,7 @@ module.exports['OverlapsDateTime'] = { }, "day" : { "type" : "Literal", - "localId" : "971", + "localId" : "975", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "1", @@ -164372,7 +164100,7 @@ module.exports['OverlapsDateTime'] = { }, "hour" : { "type" : "Literal", - "localId" : "972", + "localId" : "976", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164380,7 +164108,7 @@ module.exports['OverlapsDateTime'] = { }, "minute" : { "type" : "Literal", - "localId" : "973", + "localId" : "977", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164388,7 +164116,7 @@ module.exports['OverlapsDateTime'] = { }, "second" : { "type" : "Literal", - "localId" : "974", + "localId" : "978", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164396,7 +164124,7 @@ module.exports['OverlapsDateTime'] = { }, "millisecond" : { "type" : "Literal", - "localId" : "975", + "localId" : "979", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164406,7 +164134,7 @@ module.exports['OverlapsDateTime'] = { } ] } }, { - "localId" : "1003", + "localId" : "1007", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "name" : "NotOverlapsDayOfIvl", "context" : "Patient", @@ -164415,35 +164143,35 @@ module.exports['OverlapsDateTime'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "1003", + "r" : "1007", "s" : [ { "value" : [ "", "define ", "NotOverlapsDayOfIvl", ": " ] }, { - "r" : "1058", + "r" : "1062", "s" : [ { - "r" : "1004", + "r" : "1008", "s" : [ { "value" : [ "PrecisionDateIvl" ] } ] }, { - "r" : "1058", + "r" : "1062", "value" : [ " ", "overlaps day of", " " ] }, { - "r" : "1055", + "r" : "1059", "s" : [ { "value" : [ "Interval[" ] }, { - "r" : "1023", + "r" : "1027", "s" : [ { - "r" : "1007", + "r" : "1011", "value" : [ "DateTime", "(", "2012", ", ", "1", ", ", "2", ", ", "0", ", ", "0", ", ", "0", ", ", "0", ")" ] } ] }, { "value" : [ ", " ] }, { - "r" : "1047", + "r" : "1051", "s" : [ { - "r" : "1031", + "r" : "1035", "value" : [ "DateTime", "(", "2012", ", ", "3", ", ", "1", ", ", "0", ", ", "0", ", ", "0", ", ", "0", ")" ] } ] }, { @@ -164455,108 +164183,108 @@ module.exports['OverlapsDateTime'] = { } ], "expression" : { "type" : "Overlaps", - "localId" : "1058", + "localId" : "1062", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "precision" : "Day", "annotation" : [ ], "signature" : [ { "type" : "IntervalTypeSpecifier", - "localId" : "1059", + "localId" : "1063", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1060", + "localId" : "1064", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, { "type" : "IntervalTypeSpecifier", - "localId" : "1061", + "localId" : "1065", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1062", + "localId" : "1066", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } ], "operand" : [ { "type" : "ExpressionRef", - "localId" : "1004", + "localId" : "1008", "name" : "PrecisionDateIvl", "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "1005", + "localId" : "1009", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1006", + "localId" : "1010", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } }, { "type" : "Interval", - "localId" : "1055", + "localId" : "1059", "lowClosed" : true, "highClosed" : true, "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "1056", + "localId" : "1060", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1057", + "localId" : "1061", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, "low" : { "type" : "DateTime", - "localId" : "1023", + "localId" : "1027", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "1024", + "localId" : "1028", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1025", + "localId" : "1029", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1026", + "localId" : "1030", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1027", + "localId" : "1031", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1028", + "localId" : "1032", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1029", + "localId" : "1033", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1030", + "localId" : "1034", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "1007", + "localId" : "1011", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -164564,7 +164292,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "1008", + "localId" : "1012", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "1", @@ -164572,7 +164300,7 @@ module.exports['OverlapsDateTime'] = { }, "day" : { "type" : "Literal", - "localId" : "1009", + "localId" : "1013", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2", @@ -164580,7 +164308,7 @@ module.exports['OverlapsDateTime'] = { }, "hour" : { "type" : "Literal", - "localId" : "1010", + "localId" : "1014", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164588,7 +164316,7 @@ module.exports['OverlapsDateTime'] = { }, "minute" : { "type" : "Literal", - "localId" : "1011", + "localId" : "1015", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164596,7 +164324,7 @@ module.exports['OverlapsDateTime'] = { }, "second" : { "type" : "Literal", - "localId" : "1012", + "localId" : "1016", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164604,7 +164332,7 @@ module.exports['OverlapsDateTime'] = { }, "millisecond" : { "type" : "Literal", - "localId" : "1013", + "localId" : "1017", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164613,48 +164341,48 @@ module.exports['OverlapsDateTime'] = { }, "high" : { "type" : "DateTime", - "localId" : "1047", + "localId" : "1051", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "1048", + "localId" : "1052", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1049", + "localId" : "1053", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1050", + "localId" : "1054", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1051", + "localId" : "1055", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1052", + "localId" : "1056", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1053", + "localId" : "1057", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1054", + "localId" : "1058", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "1031", + "localId" : "1035", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -164662,7 +164390,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "1032", + "localId" : "1036", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "3", @@ -164670,7 +164398,7 @@ module.exports['OverlapsDateTime'] = { }, "day" : { "type" : "Literal", - "localId" : "1033", + "localId" : "1037", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "1", @@ -164678,7 +164406,7 @@ module.exports['OverlapsDateTime'] = { }, "hour" : { "type" : "Literal", - "localId" : "1034", + "localId" : "1038", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164686,7 +164414,7 @@ module.exports['OverlapsDateTime'] = { }, "minute" : { "type" : "Literal", - "localId" : "1035", + "localId" : "1039", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164694,7 +164422,7 @@ module.exports['OverlapsDateTime'] = { }, "second" : { "type" : "Literal", - "localId" : "1036", + "localId" : "1040", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164702,7 +164430,7 @@ module.exports['OverlapsDateTime'] = { }, "millisecond" : { "type" : "Literal", - "localId" : "1037", + "localId" : "1041", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "0", @@ -164712,7 +164440,7 @@ module.exports['OverlapsDateTime'] = { } ] } }, { - "localId" : "1065", + "localId" : "1069", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "name" : "OverlapsAfterDayOfImpreciseInterval", "context" : "Patient", @@ -164721,35 +164449,35 @@ module.exports['OverlapsDateTime'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "1065", + "r" : "1069", "s" : [ { "value" : [ "", "define ", "OverlapsAfterDayOfImpreciseInterval", ": " ] }, { - "r" : "1090", + "r" : "1094", "s" : [ { - "r" : "1066", + "r" : "1070", "s" : [ { "value" : [ "PrecisionDateIvl" ] } ] }, { - "r" : "1090", + "r" : "1094", "value" : [ " ", "overlaps day of", " " ] }, { - "r" : "1087", + "r" : "1091", "s" : [ { "value" : [ "Interval[" ] }, { - "r" : "1075", + "r" : "1079", "s" : [ { - "r" : "1069", + "r" : "1073", "value" : [ "DateTime", "(", "2012", ", ", "1", ")" ] } ] }, { "value" : [ ", " ] }, { - "r" : "1084", + "r" : "1088", "s" : [ { - "r" : "1078", + "r" : "1082", "value" : [ "DateTime", "(", "2012", ", ", "4", ")" ] } ] }, { @@ -164761,83 +164489,83 @@ module.exports['OverlapsDateTime'] = { } ], "expression" : { "type" : "Overlaps", - "localId" : "1090", + "localId" : "1094", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "precision" : "Day", "annotation" : [ ], "signature" : [ { "type" : "IntervalTypeSpecifier", - "localId" : "1091", + "localId" : "1095", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1092", + "localId" : "1096", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, { "type" : "IntervalTypeSpecifier", - "localId" : "1093", + "localId" : "1097", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1094", + "localId" : "1098", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } ], "operand" : [ { "type" : "ExpressionRef", - "localId" : "1066", + "localId" : "1070", "name" : "PrecisionDateIvl", "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "1067", + "localId" : "1071", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1068", + "localId" : "1072", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } }, { "type" : "Interval", - "localId" : "1087", + "localId" : "1091", "lowClosed" : true, "highClosed" : true, "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "1088", + "localId" : "1092", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1089", + "localId" : "1093", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, "low" : { "type" : "DateTime", - "localId" : "1075", + "localId" : "1079", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "1076", + "localId" : "1080", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1077", + "localId" : "1081", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "1069", + "localId" : "1073", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -164845,7 +164573,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "1070", + "localId" : "1074", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "1", @@ -164854,23 +164582,23 @@ module.exports['OverlapsDateTime'] = { }, "high" : { "type" : "DateTime", - "localId" : "1084", + "localId" : "1088", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "1085", + "localId" : "1089", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1086", + "localId" : "1090", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "1078", + "localId" : "1082", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -164878,7 +164606,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "1079", + "localId" : "1083", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "4", @@ -164888,7 +164616,7 @@ module.exports['OverlapsDateTime'] = { } ] } }, { - "localId" : "1097", + "localId" : "1101", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "name" : "MayOverlapBeforeDayOfImpreciseIvl", "context" : "Patient", @@ -164897,35 +164625,35 @@ module.exports['OverlapsDateTime'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "1097", + "r" : "1101", "s" : [ { "value" : [ "", "define ", "MayOverlapBeforeDayOfImpreciseIvl", ": " ] }, { - "r" : "1122", + "r" : "1126", "s" : [ { - "r" : "1098", + "r" : "1102", "s" : [ { "value" : [ "PrecisionDateIvl" ] } ] }, { - "r" : "1122", + "r" : "1126", "value" : [ " ", "overlaps day of", " " ] }, { - "r" : "1119", + "r" : "1123", "s" : [ { "value" : [ "Interval[" ] }, { - "r" : "1107", + "r" : "1111", "s" : [ { - "r" : "1101", + "r" : "1105", "value" : [ "DateTime", "(", "2012", ", ", "9", ")" ] } ] }, { "value" : [ ", " ] }, { - "r" : "1116", + "r" : "1120", "s" : [ { - "r" : "1110", + "r" : "1114", "value" : [ "DateTime", "(", "2012", ", ", "10", ")" ] } ] }, { @@ -164937,83 +164665,83 @@ module.exports['OverlapsDateTime'] = { } ], "expression" : { "type" : "Overlaps", - "localId" : "1122", + "localId" : "1126", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "precision" : "Day", "annotation" : [ ], "signature" : [ { "type" : "IntervalTypeSpecifier", - "localId" : "1123", + "localId" : "1127", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1124", + "localId" : "1128", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, { "type" : "IntervalTypeSpecifier", - "localId" : "1125", + "localId" : "1129", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1126", + "localId" : "1130", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } ], "operand" : [ { "type" : "ExpressionRef", - "localId" : "1098", + "localId" : "1102", "name" : "PrecisionDateIvl", "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "1099", + "localId" : "1103", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1100", + "localId" : "1104", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } }, { "type" : "Interval", - "localId" : "1119", + "localId" : "1123", "lowClosed" : true, "highClosed" : true, "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "1120", + "localId" : "1124", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1121", + "localId" : "1125", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, "low" : { "type" : "DateTime", - "localId" : "1107", + "localId" : "1111", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "1108", + "localId" : "1112", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1109", + "localId" : "1113", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "1101", + "localId" : "1105", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -165021,7 +164749,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "1102", + "localId" : "1106", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "9", @@ -165030,23 +164758,23 @@ module.exports['OverlapsDateTime'] = { }, "high" : { "type" : "DateTime", - "localId" : "1116", + "localId" : "1120", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "1117", + "localId" : "1121", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1118", + "localId" : "1122", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "1110", + "localId" : "1114", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -165054,7 +164782,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "1111", + "localId" : "1115", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "10", @@ -165064,7 +164792,7 @@ module.exports['OverlapsDateTime'] = { } ] } }, { - "localId" : "1129", + "localId" : "1133", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "name" : "MayOverlapAfterDayOfImpreciseIvl", "context" : "Patient", @@ -165073,35 +164801,35 @@ module.exports['OverlapsDateTime'] = { "type" : "Annotation", "t" : [ ], "s" : { - "r" : "1129", + "r" : "1133", "s" : [ { "value" : [ "", "define ", "MayOverlapAfterDayOfImpreciseIvl", ": " ] }, { - "r" : "1154", + "r" : "1158", "s" : [ { - "r" : "1130", + "r" : "1134", "s" : [ { "value" : [ "PrecisionDateIvl" ] } ] }, { - "r" : "1154", + "r" : "1158", "value" : [ " ", "overlaps day of", " " ] }, { - "r" : "1151", + "r" : "1155", "s" : [ { "value" : [ "Interval[" ] }, { - "r" : "1139", + "r" : "1143", "s" : [ { - "r" : "1133", + "r" : "1137", "value" : [ "DateTime", "(", "2012", ", ", "1", ")" ] } ] }, { "value" : [ ", " ] }, { - "r" : "1148", + "r" : "1152", "s" : [ { - "r" : "1142", + "r" : "1146", "value" : [ "DateTime", "(", "2012", ", ", "3", ")" ] } ] }, { @@ -165113,83 +164841,83 @@ module.exports['OverlapsDateTime'] = { } ], "expression" : { "type" : "Overlaps", - "localId" : "1154", + "localId" : "1158", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", "precision" : "Day", "annotation" : [ ], "signature" : [ { "type" : "IntervalTypeSpecifier", - "localId" : "1155", + "localId" : "1159", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1156", + "localId" : "1160", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, { "type" : "IntervalTypeSpecifier", - "localId" : "1157", + "localId" : "1161", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1158", + "localId" : "1162", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } ], "operand" : [ { "type" : "ExpressionRef", - "localId" : "1130", + "localId" : "1134", "name" : "PrecisionDateIvl", "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "1131", + "localId" : "1135", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1132", + "localId" : "1136", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } } }, { "type" : "Interval", - "localId" : "1151", + "localId" : "1155", "lowClosed" : true, "highClosed" : true, "annotation" : [ ], "resultTypeSpecifier" : { "type" : "IntervalTypeSpecifier", - "localId" : "1152", + "localId" : "1156", "annotation" : [ ], "pointType" : { "type" : "NamedTypeSpecifier", - "localId" : "1153", + "localId" : "1157", "name" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ] } }, "low" : { "type" : "DateTime", - "localId" : "1139", + "localId" : "1143", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "1140", + "localId" : "1144", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1141", + "localId" : "1145", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "1133", + "localId" : "1137", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -165197,7 +164925,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "1134", + "localId" : "1138", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "1", @@ -165206,23 +164934,23 @@ module.exports['OverlapsDateTime'] = { }, "high" : { "type" : "DateTime", - "localId" : "1148", + "localId" : "1152", "resultTypeName" : "{urn:hl7-org:elm-types:r1}DateTime", "annotation" : [ ], "signature" : [ { "type" : "NamedTypeSpecifier", - "localId" : "1149", + "localId" : "1153", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] }, { "type" : "NamedTypeSpecifier", - "localId" : "1150", + "localId" : "1154", "name" : "{urn:hl7-org:elm-types:r1}Integer", "annotation" : [ ] } ], "year" : { "type" : "Literal", - "localId" : "1142", + "localId" : "1146", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "2012", @@ -165230,7 +164958,7 @@ module.exports['OverlapsDateTime'] = { }, "month" : { "type" : "Literal", - "localId" : "1143", + "localId" : "1147", "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", "valueType" : "{urn:hl7-org:elm-types:r1}Integer", "value" : "3", diff --git a/test/elm/interval/interval-test.ts b/test/elm/interval/interval-test.ts index 47ee113c..c99d453d 100644 --- a/test/elm/interval/interval-test.ts +++ b/test/elm/interval/interval-test.ts @@ -1709,8 +1709,8 @@ describe('Starts', () => { setup(this, data); }); - it('should calculate to null', async function () { - should(await this.testStartsNull.exec(this.ctx)).be.null(); + it('should calculate to false for boundless interval starts bounded interval', async function () { + should(await this.testStartsNull.exec(this.ctx)).be.false(); }); it('should calculate integer intervals properly', async function () { @@ -1750,8 +1750,8 @@ describe('Ends', () => { setup(this, data); }); - it('should calculate to null', async function () { - should(await this.testEndsNull.exec(this.ctx)).be.null(); + it('should calculate to false for boundless interval ends bounded interval', async function () { + should(await this.testEndsNull.exec(this.ctx)).be.false(); }); it('should calculate integer intervals properly', async function () { diff --git a/test/spec-tests/cql/CqlIntervalOperatorsTest.cql b/test/spec-tests/cql/CqlIntervalOperatorsTest.cql index 5a9d02bc..934dbec1 100644 --- a/test/spec-tests/cql/CqlIntervalOperatorsTest.cql +++ b/test/spec-tests/cql/CqlIntervalOperatorsTest.cql @@ -1625,9 +1625,11 @@ define "Start": Tuple{ define "Starts": Tuple{ "TestStartsNull": Tuple{ + skipped: 'Wrong answer (Interval[null, null] can only start Interval[null, null])' + /* expression: Interval[null, null] starts Interval[1, 10], output: null - }, + */ }, "IntegerIntervalStartsTrue": Tuple{ expression: Interval[4, 10] starts Interval[4, 15], output: true diff --git a/test/spec-tests/cql/CqlIntervalOperatorsTest.json b/test/spec-tests/cql/CqlIntervalOperatorsTest.json index 1fcc2789..33b6f443 100644 --- a/test/spec-tests/cql/CqlIntervalOperatorsTest.json +++ b/test/spec-tests/cql/CqlIntervalOperatorsTest.json @@ -74698,20 +74698,11 @@ "annotation": [], "element": [ { - "name": "expression", - "annotation": [], - "elementType": { - "type": "NamedTypeSpecifier", - "name": "{urn:hl7-org:elm-types:r1}Boolean", - "annotation": [] - } - }, - { - "name": "output", + "name": "skipped", "annotation": [], "elementType": { "type": "NamedTypeSpecifier", - "name": "{urn:hl7-org:elm-types:r1}Any", + "name": "{urn:hl7-org:elm-types:r1}String", "annotation": [] } } @@ -75015,20 +75006,11 @@ "annotation": [], "element": [ { - "name": "expression", - "annotation": [], - "elementType": { - "type": "NamedTypeSpecifier", - "name": "{urn:hl7-org:elm-types:r1}Boolean", - "annotation": [] - } - }, - { - "name": "output", + "name": "skipped", "annotation": [], "elementType": { "type": "NamedTypeSpecifier", - "name": "{urn:hl7-org:elm-types:r1}Any", + "name": "{urn:hl7-org:elm-types:r1}String", "annotation": [] } } @@ -75328,20 +75310,11 @@ "annotation": [], "element": [ { - "name": "expression", - "annotation": [], - "elementType": { - "type": "NamedTypeSpecifier", - "name": "{urn:hl7-org:elm-types:r1}Boolean", - "annotation": [] - } - }, - { - "name": "output", + "name": "skipped", "annotation": [], "elementType": { "type": "NamedTypeSpecifier", - "name": "{urn:hl7-org:elm-types:r1}Any", + "name": "{urn:hl7-org:elm-types:r1}String", "annotation": [] } } @@ -75349,75 +75322,12 @@ }, "element": [ { - "name": "expression", - "value": { - "type": "Starts", - "resultTypeName": "{urn:hl7-org:elm-types:r1}Boolean", - "annotation": [], - "signature": [], - "operand": [ - { - "type": "Interval", - "lowClosed": true, - "highClosed": true, - "annotation": [], - "resultTypeSpecifier": { - "type": "IntervalTypeSpecifier", - "annotation": [], - "pointType": { - "type": "NamedTypeSpecifier", - "name": "{urn:hl7-org:elm-types:r1}Any", - "annotation": [] - } - }, - "low": { - "type": "Null", - "resultTypeName": "{urn:hl7-org:elm-types:r1}Any", - "annotation": [] - }, - "high": { - "type": "Null", - "resultTypeName": "{urn:hl7-org:elm-types:r1}Any", - "annotation": [] - } - }, - { - "type": "Interval", - "lowClosed": true, - "highClosed": true, - "annotation": [], - "resultTypeSpecifier": { - "type": "IntervalTypeSpecifier", - "annotation": [], - "pointType": { - "type": "NamedTypeSpecifier", - "name": "{urn:hl7-org:elm-types:r1}Integer", - "annotation": [] - } - }, - "low": { - "type": "Literal", - "resultTypeName": "{urn:hl7-org:elm-types:r1}Integer", - "valueType": "{urn:hl7-org:elm-types:r1}Integer", - "value": "1", - "annotation": [] - }, - "high": { - "type": "Literal", - "resultTypeName": "{urn:hl7-org:elm-types:r1}Integer", - "valueType": "{urn:hl7-org:elm-types:r1}Integer", - "value": "10", - "annotation": [] - } - } - ] - } - }, - { - "name": "output", + "name": "skipped", "value": { - "type": "Null", - "resultTypeName": "{urn:hl7-org:elm-types:r1}Any", + "type": "Literal", + "resultTypeName": "{urn:hl7-org:elm-types:r1}String", + "valueType": "{urn:hl7-org:elm-types:r1}String", + "value": "Wrong answer (Interval[null, null] can only start Interval[null, null])", "annotation": [] } } @@ -79950,11 +79860,11 @@ "annotation": [], "resultTypeSpecifier": { "type": "IntervalTypeSpecifier", - "localId": "14851", + "localId": "14835", "annotation": [], "pointType": { "type": "NamedTypeSpecifier", - "localId": "14852", + "localId": "14836", "name": "{urn:hl7-org:elm-types:r1}Any", "annotation": [] } diff --git a/test/spec-tests/skip-list.txt b/test/spec-tests/skip-list.txt index 1eab0378..1b1eeaee 100644 --- a/test/spec-tests/skip-list.txt +++ b/test/spec-tests/skip-list.txt @@ -42,6 +42,7 @@ CqlIntervalOperatorsTest.Intersect.TestIntersectNull Wrong answer (In CqlIntervalOperatorsTest.Overlaps.TestOverlapsNull Wrong answer (Interval[null, null] should overlap everything) CqlIntervalOperatorsTest.OverlapsBefore.TestOverlapsBeforeNull Wrong answer (Interval[null, null] should overlap before anything but another interval w/ null low closed boundary) CqlIntervalOperatorsTest.OverlapsAfter.TestOverlapsAfterNull Wrong answer (Interval[null, null] should overlap after anything but another interval w/ null high closed boundary) +CqlIntervalOperatorsTest.Starts.TestStartsNull Wrong answer (Interval[null, null] can only start Interval[null, null]) CqlIntervalOperatorsTest.Union.TestUnionNull Wrong answer (Interval[null, null] union any valid interval of the same point type is Interval[null, null]) CqlTypeOperatorsTest.Convert.StringToDateTime Wrong answer (different offsets) CqlTypeOperatorsTest.ToDateTime.ToDateTime1 Wrong answer (different offsets) From 7466cea324e56e66dc89cd628b1dba81eb28e60b Mon Sep 17 00:00:00 2001 From: Chris Moesel Date: Wed, 1 Jul 2026 14:39:49 -0400 Subject: [PATCH 2/2] Add more boundless/unknown interval tests for Long intervals --- test/datatypes/interval-test.ts | 216 ++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) diff --git a/test/datatypes/interval-test.ts b/test/datatypes/interval-test.ts index b3e7f088..bf2d0d99 100644 --- a/test/datatypes/interval-test.ts +++ b/test/datatypes/interval-test.ts @@ -3968,6 +3968,8 @@ describe('LongInterval', () => { new Interval(0n, null, true, false).contains(0n).should.be.true(); should(new Interval(0n, null, true, false).contains(123456789n)).be.null(); new Interval(0n, null, true, false).contains(-1n).should.be.false(); + new Interval(null, null).contains(5n).should.be.true(); + should(new Interval(null, null, false, false).contains(5n)).be.null(); }); it('should properly handle imprecision', () => { @@ -4119,6 +4121,15 @@ describe('LongInterval', () => { it('should include a point Long', () => { d.zeroToHundredLong.closed.includes(50n).should.be.true(); }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().includes(50n).should.be.true(); + boundlessInterval().includes(d.zeroToHundredLong.closed).should.be.true(); + boundlessInterval().includes(unknownInterval()).should.be.true(); + d.zeroToHundredLong.closed.includes(boundlessInterval()).should.be.false(); + should(unknownInterval().includes(d.zeroToHundredLong.closed)).be.null(); + should(unknownInterval().includes(boundlessInterval())).be.null(); + }); }); describe('includedIn', () => { @@ -4238,6 +4249,57 @@ describe('LongInterval', () => { d.zeroToHundredLong.closed.includedIn(50n).should.be.true(); d.zeroToHundredLong.closed.includedIn(500n).should.be.false(); }); + + it('should properly handle boundless and unknown intervals', () => { + d.zeroToHundredLong.closed.includedIn(boundlessInterval()).should.be.true(); + boundlessInterval().includedIn(d.zeroToHundredLong.closed).should.be.false(); + boundlessInterval().includedIn(boundlessInterval()).should.be.true(); + unknownInterval().includedIn(boundlessInterval()).should.be.true(); + }); + }); + + describe('properlyIncludes', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().properlyIncludes(d.zeroToHundredLong.closed).should.be.true(); + boundlessInterval().properlyIncludes(boundlessInterval()).should.be.false(); + should(boundlessInterval().properlyIncludes(unknownInterval())).be.null(); + should(unknownInterval().properlyIncludes(d.zeroToHundredLong.closed)).be.null(); + }); + }); + + describe('starts', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().starts(boundlessInterval()).should.be.true(); + boundlessInterval().starts(d.zeroToHundredLong.closed).should.be.false(); + d.zeroToHundredLong.closed.starts(boundlessInterval()).should.be.false(); + should(boundlessInterval().starts(unknownInterval())).be.null(); + should(unknownInterval().starts(boundlessInterval())).be.null(); + }); + }); + + describe('ends', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().ends(boundlessInterval()).should.be.true(); + boundlessInterval().ends(d.zeroToHundredLong.closed).should.be.false(); + d.zeroToHundredLong.closed.ends(boundlessInterval()).should.be.false(); + should(boundlessInterval().ends(unknownInterval())).be.null(); + should(unknownInterval().ends(boundlessInterval())).be.null(); + }); }); describe('overlaps(LongInterval)', () => { @@ -4330,6 +4392,30 @@ describe('LongInterval', () => { y.open.overlaps(x.open).should.be.true(); }); + it('should properly handle null endpoints', () => { + const negativeInterval = new Interval(-123456789n, -1n); + const positiveInterval = new Interval(1n, 123456789n); + const startsAtZero = new Interval(0n, 123456789n); + const endsAtZero = new Interval(-123456789n, 0n); + + should(new Interval(null, 0n).overlaps(negativeInterval)).be.true(); + should(new Interval(null, 0n).overlaps(positiveInterval)).be.false(); + should(new Interval(null, 0n, false, true).overlaps(startsAtZero)).be.true(); + should(new Interval(null, 0n, false, true).overlaps(negativeInterval)).be.null(); + should(new Interval(null, 0n, false, true).overlaps(positiveInterval)).be.false(); + + should(new Interval(0n, null).overlaps(positiveInterval)).be.true(); + should(new Interval(0n, null).overlaps(negativeInterval)).be.false(); + should(new Interval(0n, null, true, false).overlaps(endsAtZero)).be.true(); + should(new Interval(0n, null, true, false).overlaps(positiveInterval)).be.null(); + should(new Interval(0n, null, true, false).overlaps(negativeInterval)).be.false(); + + should(new Interval(null, null).overlaps(d.zeroToHundredLong.closed)).be.true(); + should(new Interval(null, null, false, false).overlaps(d.zeroToHundredLong.closed)).be.null(); + should(d.zeroToHundredLong.closed.overlaps(new Interval(null, null))).be.true(); + should(d.zeroToHundredLong.closed.overlaps(new Interval(null, null, false, false))).be.null(); + }); + it('should properly handle boundless and unknown intervals', () => { boundlessInterval().overlaps(boundlessInterval()).should.be.true(); boundlessInterval().overlaps(d.zeroToHundredLong.closed).should.be.true(); @@ -4390,6 +4476,21 @@ describe('LongInterval', () => { d.zeroToHundredLong.closed.overlaps(105n).should.be.false(); }); + it('should properly handle null endpoints', () => { + should(new Interval(null, 0n).overlaps(-123456789n)).be.true(); + should(new Interval(null, 0n).overlaps(1n)).be.false(); + should(new Interval(null, 0n, false, true).overlaps(0n)).be.true(); + should(new Interval(null, 0n, false, true).overlaps(-123456789n)).be.null(); + should(new Interval(null, 0n, false, true).overlaps(1n)).be.false(); + should(new Interval(0n, null).overlaps(123456789n)).be.true(); + should(new Interval(0n, null).overlaps(-1n)).be.false(); + should(new Interval(0n, null, true, false).overlaps(0n)).be.true(); + should(new Interval(0n, null, true, false).overlaps(123456789n)).be.null(); + should(new Interval(0n, null, true, false).overlaps(-1n)).be.false(); + should(new Interval(null, null).overlaps(5n)).be.true(); + should(new Interval(null, null, false, false).overlaps(5n)).be.null(); + }); + it('should properly handle boundless and unknown intervals', () => { boundlessInterval().overlaps(5n).should.be.true(); should(boundlessInterval().overlaps(null)).be.null(); @@ -4596,6 +4697,31 @@ describe('LongInterval', () => { ivl.equals(point).should.be.false(); }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().equals(boundlessInterval()).should.be.true(); + boundlessInterval().equals(d.zeroToHundredLong.closed).should.be.false(); + d.zeroToHundredLong.closed.equals(boundlessInterval()).should.be.false(); + should(boundlessInterval().equals(unknownInterval())).be.null(); + should(unknownInterval().equals(boundlessInterval())).be.null(); + should(unknownInterval().equals(unknownInterval())).be.null(); + }); + }); + + describe('sameAs', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().sameAs(boundlessInterval()).should.be.true(); + boundlessInterval().sameAs(d.zeroToHundredLong.closed).should.be.false(); + d.zeroToHundredLong.closed.sameAs(boundlessInterval()).should.be.false(); + should(boundlessInterval().sameAs(unknownInterval())).be.null(); + should(unknownInterval().sameAs(boundlessInterval())).be.null(); + should(unknownInterval().sameAs(unknownInterval())).be.null(); + }); }); describe('union', () => { @@ -4740,6 +4866,14 @@ describe('LongInterval', () => { it('should throw when the argument is a point', () => { should(() => d.zeroToHundredLong.union(300n)).throw(Error); }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().union(d.zeroToHundredLong.closed).should.eql(boundlessInterval()); + d.zeroToHundredLong.closed.union(boundlessInterval()).should.eql(boundlessInterval()); + boundlessInterval().union(unknownInterval()).should.eql(boundlessInterval()); + unknownInterval().union(boundlessInterval()).should.eql(boundlessInterval()); + should(unknownInterval().union(unknownInterval())).be.null(); + }); }); describe('intersect', () => { @@ -4876,6 +5010,18 @@ describe('LongInterval', () => { it('should throw when the argument is a point', () => { should(() => d.zeroToHundredLong.intersect(50n)).throw(Error); }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval() + .intersect(d.zeroToHundredLong.closed) + .should.eql(d.zeroToHundredLong.closed); + d.zeroToHundredLong.closed + .intersect(boundlessInterval()) + .should.eql(d.zeroToHundredLong.closed); + boundlessInterval().intersect(unknownInterval()).should.eql(unknownInterval()); + unknownInterval().intersect(boundlessInterval()).should.eql(unknownInterval()); + should(unknownInterval().intersect(unknownInterval())).be.null(); + }); }); describe('except', () => { @@ -5131,6 +5277,29 @@ describe('LongInterval', () => { uIvl.after(uIvl).should.be.false(); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().after(boundlessInterval()).should.be.false(); + boundlessInterval().after(d.zeroToHundredLong.closed).should.be.false(); + d.zeroToHundredLong.closed.after(boundlessInterval()).should.be.false(); + unknownInterval().after(boundlessInterval()).should.be.false(); + should(unknownInterval().after(unknownInterval())).be.null(); + }); + }); + + describe('sameOrAfter', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().sameOrAfter(boundlessInterval()).should.be.true(); + boundlessInterval().sameOrAfter(d.zeroToHundredLong.closed).should.be.false(); + d.zeroToHundredLong.closed.sameOrAfter(boundlessInterval()).should.be.false(); + should(unknownInterval().sameOrAfter(boundlessInterval())).be.null(); + should(unknownInterval().sameOrAfter(unknownInterval())).be.null(); + }); }); describe('before', () => { @@ -5252,6 +5421,29 @@ describe('LongInterval', () => { uIvl.before(uIvl).should.be.false(); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().before(boundlessInterval()).should.be.false(); + boundlessInterval().before(d.zeroToHundredLong.closed).should.be.false(); + d.zeroToHundredLong.closed.before(boundlessInterval()).should.be.false(); + unknownInterval().before(boundlessInterval()).should.be.false(); + should(unknownInterval().before(unknownInterval())).be.null(); + }); + }); + + describe('sameOrBefore', () => { + let d: any; + beforeEach(() => { + d = data(); + }); + + it('should properly handle boundless and unknown intervals', () => { + boundlessInterval().sameOrBefore(boundlessInterval()).should.be.true(); + boundlessInterval().sameOrBefore(d.zeroToHundredLong.closed).should.be.false(); + d.zeroToHundredLong.closed.sameOrBefore(boundlessInterval()).should.be.false(); + should(unknownInterval().sameOrBefore(boundlessInterval())).be.null(); + should(unknownInterval().sameOrBefore(unknownInterval())).be.null(); + }); }); describe('meets', () => { @@ -5373,6 +5565,14 @@ describe('LongInterval', () => { uIvl.meets(uIvl).should.be.false(); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().meets(boundlessInterval()).should.be.false(); + boundlessInterval().meets(d.zeroToHundredLong.closed).should.be.false(); + d.zeroToHundredLong.closed.meets(boundlessInterval()).should.be.false(); + unknownInterval().meets(boundlessInterval()).should.be.false(); + should(unknownInterval().meets(unknownInterval())).be.null(); + }); }); describe('meetsAfter', () => { @@ -5494,6 +5694,14 @@ describe('LongInterval', () => { uIvl.meetsAfter(uIvl).should.be.false(); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().meetsAfter(boundlessInterval()).should.be.false(); + boundlessInterval().meetsAfter(d.zeroToHundredLong.closed).should.be.false(); + d.zeroToHundredLong.closed.meetsAfter(boundlessInterval()).should.be.false(); + unknownInterval().meetsAfter(boundlessInterval()).should.be.false(); + should(unknownInterval().meetsAfter(unknownInterval())).be.null(); + }); }); describe('meetsBefore', () => { @@ -5615,6 +5823,14 @@ describe('LongInterval', () => { uIvl.meetsBefore(uIvl).should.be.false(); }); + + it('should properly handle boundless intervals', () => { + boundlessInterval().meetsBefore(boundlessInterval()).should.be.false(); + boundlessInterval().meetsBefore(d.zeroToHundredLong.closed).should.be.false(); + d.zeroToHundredLong.closed.meetsBefore(boundlessInterval()).should.be.false(); + unknownInterval().meetsBefore(boundlessInterval()).should.be.false(); + should(unknownInterval().meetsBefore(unknownInterval())).be.null(); + }); }); });