Skip to content

Commit 4d1d9f7

Browse files
committed
Implement Interval PointFrom operator
1 parent 64cfe9b commit 4d1d9f7

8 files changed

Lines changed: 1250 additions & 59 deletions

File tree

examples/browser/cql4browsers.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5085,7 +5085,7 @@ var __importStar = (this && this.__importStar) || (function () {
50855085
};
50865086
})();
50875087
Object.defineProperty(exports, "__esModule", { value: true });
5088-
exports.Collapse = exports.Expand = exports.Ends = exports.Starts = exports.End = exports.Start = exports.Size = exports.Width = exports.OverlapsBefore = exports.OverlapsAfter = exports.Overlaps = exports.MeetsBefore = exports.MeetsAfter = exports.Meets = exports.Interval = void 0;
5088+
exports.Collapse = exports.Expand = exports.Ends = exports.Starts = exports.End = exports.Start = exports.Size = exports.Width = exports.PointFrom = exports.OverlapsBefore = exports.OverlapsAfter = exports.Overlaps = exports.MeetsBefore = exports.MeetsAfter = exports.Meets = exports.Interval = void 0;
50895089
exports.doContains = doContains;
50905090
exports.doProperContains = doProperContains;
50915091
exports.doIncludes = doIncludes;
@@ -5101,6 +5101,7 @@ const math_1 = require("../util/math");
51015101
const units_1 = require("../util/units");
51025102
const dtivl = __importStar(require("../datatypes/interval"));
51035103
const builder_1 = require("./builder");
5104+
const comparison_1 = require("../util/comparison");
51045105
const elmTypes_1 = require("../util/elmTypes");
51055106
class Interval extends expression_1.Expression {
51065107
constructor(json) {
@@ -5263,6 +5264,24 @@ class OverlapsBefore extends expression_1.Expression {
52635264
}
52645265
}
52655266
exports.OverlapsBefore = OverlapsBefore;
5267+
class PointFrom extends expression_1.Expression {
5268+
constructor(json) {
5269+
super(json);
5270+
}
5271+
async exec(ctx) {
5272+
const interval = await this.arg?.execute(ctx);
5273+
if (interval == null) {
5274+
return null;
5275+
}
5276+
const start = interval.start();
5277+
const end = interval.end();
5278+
if (start == end || (0, comparison_1.equals)(start, end)) {
5279+
return start;
5280+
}
5281+
throw new Error('PointFrom operator may only be used on an interval containing a single point.');
5282+
}
5283+
}
5284+
exports.PointFrom = PointFrom;
52665285
// Delegated to by overloaded#Union
52675286
function doUnion(a, b) {
52685287
return a.union(b);
@@ -5848,7 +5867,7 @@ function truncateDecimal(decimal, decimalPlaces) {
58485867
return parseFloat(decimal.toString().match(re)[0]);
58495868
}
58505869

5851-
},{"../datatypes/interval":10,"../datatypes/quantity":12,"../util/elmTypes":55,"../util/math":57,"../util/units":58,"./builder":17,"./expression":23}],28:[function(require,module,exports){
5870+
},{"../datatypes/interval":10,"../datatypes/quantity":12,"../util/comparison":53,"../util/elmTypes":55,"../util/math":57,"../util/units":58,"./builder":17,"./expression":23}],28:[function(require,module,exports){
58525871
"use strict";
58535872
Object.defineProperty(exports, "__esModule", { value: true });
58545873
exports.Library = void 0;

src/elm/interval.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { convertUnit, compareUnits, convertToCQLDateUnit } from '../util/units';
55
import * as dtivl from '../datatypes/interval';
66
import { Context } from '../runtime/context';
77
import { build } from './builder';
8+
import { equals } from '../util/comparison';
89
import { ELM_NAMED_TYPE_SPECIFIER } from '../util/elmTypes';
910

1011
export class Interval extends Expression {
@@ -200,6 +201,29 @@ export class OverlapsBefore extends Expression {
200201
}
201202
}
202203

204+
export class PointFrom extends Expression {
205+
constructor(json: any) {
206+
super(json);
207+
}
208+
209+
async exec(ctx: Context) {
210+
const interval = await this.arg?.execute(ctx);
211+
if (interval == null) {
212+
return null;
213+
}
214+
const start = interval.start();
215+
const end = interval.end();
216+
217+
if (start == end || equals(start, end)) {
218+
return start;
219+
}
220+
221+
throw new Error(
222+
'PointFrom operator may only be used on an interval containing a single point.'
223+
);
224+
}
225+
}
226+
203227
// Delegated to by overloaded#Union
204228
export function doUnion(a: any, b: any) {
205229
return a.union(b);

test/elm/interval/data.cql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,16 @@ define OpenNotNull: end of Interval(DateTime(2012, 1, 1), DateTime(2013, 1, 1))
10081008
define OpenLongNotNull: end of Interval(1L, 3L)
10091009
define OpenNull: end of Interval(DateTime(2013, 1, 1), null)
10101010

1011+
// @Test: PointFrom
1012+
define IntegerPoint: point from Interval[4, 4]
1013+
define IntegerOpenHighPoint: point from Interval[4, 5)
1014+
define LongPoint: point from Interval[4294967296L, 4294967296L]
1015+
define EmptyIntervalPoint: point from Interval(0, 0)
1016+
define DateTimePoint: point from Interval[DateTime(2012, 1, 1), DateTime(2012, 1, 1)]
1017+
define NullPoint: point from (null as Interval<Integer>)
1018+
define NonUnitPoint: point from Interval[1, 4]
1019+
define NullHighPoint: point from Interval[1, null]
1020+
10111021
// @Test: Starts
10121022
define TestStartsNull: Interval[null, null] starts Interval[1, 10]
10131023
define IntegerIntervalStartsTrue: Interval[4,10] starts Interval[4, 15]

0 commit comments

Comments
 (0)