UNPKG

cql-execution

Version:

An execution framework for the Clinical Quality Language (CQL)

392 lines (322 loc) 11.3 kB
// Generated by CoffeeScript 1.12.7 (function() { var AliasRef, AliasedQuerySource, ByColumn, ByDirection, ByExpression, Context, Expression, LetClause, MultiSource, Query, QueryLetRef, ReturnClause, Sort, SortClause, UnimplementedExpression, With, Without, allTrue, build, equals, ref, ref1, toDistinctList, typeIsArray, extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, hasProp = {}.hasOwnProperty; ref = require('./expression'), Expression = ref.Expression, UnimplementedExpression = ref.UnimplementedExpression; Context = require('../runtime/context').Context; build = require('./builder').build; ref1 = require('../util/util'), typeIsArray = ref1.typeIsArray, allTrue = ref1.allTrue; equals = require('../util/comparison').equals; module.exports.AliasedQuerySource = AliasedQuerySource = (function() { function AliasedQuerySource(json) { this.alias = json.alias; this.expression = build(json.expression); } return AliasedQuerySource; })(); module.exports.LetClause = LetClause = (function() { function LetClause(json) { this.identifier = json.identifier; this.expression = build(json.expression); } return LetClause; })(); module.exports.With = With = (function(superClass) { extend(With, superClass); function With(json) { With.__super__.constructor.apply(this, arguments); this.alias = json.alias; this.expression = build(json.expression); this.suchThat = build(json.suchThat); } With.prototype.exec = function(ctx) { var childCtx, rec, records, returns; records = this.expression.execute(ctx); this.isList = typeIsArray(records); records = this.isList ? records : [records]; returns = (function() { var i, len, results; results = []; for (i = 0, len = records.length; i < len; i++) { rec = records[i]; childCtx = ctx.childContext(); childCtx.set(this.alias, rec); results.push(this.suchThat.execute(childCtx)); } return results; }).call(this); return returns.some(function(x) { return x; }); }; return With; })(Expression); module.exports.Without = Without = (function(superClass) { extend(Without, superClass); function Without(json) { Without.__super__.constructor.apply(this, arguments); } Without.prototype.exec = function(ctx) { return !Without.__super__.exec.call(this, ctx); }; return Without; })(With); module.exports.Sort = Sort = (function(superClass) { extend(Sort, superClass); function Sort() { return Sort.__super__.constructor.apply(this, arguments); } return Sort; })(UnimplementedExpression); module.exports.ByDirection = ByDirection = (function(superClass) { extend(ByDirection, superClass); function ByDirection(json) { ByDirection.__super__.constructor.apply(this, arguments); this.direction = json.direction; this.low_order = this.direction === "asc" ? -1 : 1; this.high_order = this.low_order * -1; } ByDirection.prototype.exec = function(ctx, a, b) { if (a === b) { return 0; } else if (a < b) { return this.low_order; } else { return this.high_order; } }; return ByDirection; })(Expression); module.exports.ByExpression = ByExpression = (function(superClass) { extend(ByExpression, superClass); function ByExpression(json) { ByExpression.__super__.constructor.apply(this, arguments); this.expression = build(json.expression); this.direction = json.direction; this.low_order = this.direction === "asc" ? -1 : 1; this.high_order = this.low_order * -1; } ByExpression.prototype.exec = function(ctx, a, b) { var a_val, b_val, sctx; sctx = ctx.childContext(a); a_val = this.expression.execute(sctx); sctx = ctx.childContext(b); b_val = this.expression.execute(sctx); if (a_val === b_val) { return 0; } else if (a_val < b_val) { return this.low_order; } else { return this.high_order; } }; return ByExpression; })(Expression); module.exports.ByColumn = ByColumn = (function(superClass) { extend(ByColumn, superClass); function ByColumn(json) { ByColumn.__super__.constructor.apply(this, arguments); this.expression = build({ "name": json.path, "type": "IdentifierRef" }); } return ByColumn; })(ByExpression); module.exports.ReturnClause = ReturnClause = ReturnClause = (function() { function ReturnClause(json) { var ref2; this.expression = build(json.expression); this.distinct = (ref2 = json.distinct) != null ? ref2 : true; } return ReturnClause; })(); module.exports.SortClause = SortClause = SortClause = (function() { function SortClause(json) { this.by = build(json != null ? json.by : void 0); } SortClause.prototype.sort = function(ctx, values) { if (this.by) { return values.sort((function(_this) { return function(a, b) { var i, item, len, order, ref2; order = 0; ref2 = _this.by; for (i = 0, len = ref2.length; i < len; i++) { item = ref2[i]; order = item.exec(ctx, a, b); if (order !== 0) { break; } } return order; }; })(this)); } }; return SortClause; })(); toDistinctList = function(xList) { var i, inYList, j, len, len1, x, y, yList; yList = []; for (i = 0, len = xList.length; i < len; i++) { x = xList[i]; inYList = false; for (j = 0, len1 = yList.length; j < len1; j++) { y = yList[j]; if (equals(x, y)) { inYList = true; } } if (!inYList) { yList.push(x); } } return yList; }; module.exports.Query = Query = (function(superClass) { extend(Query, superClass); function Query(json) { var d, s; Query.__super__.constructor.apply(this, arguments); this.sources = new MultiSource((function() { var i, len, ref2, results; ref2 = json.source; results = []; for (i = 0, len = ref2.length; i < len; i++) { s = ref2[i]; results.push(new AliasedQuerySource(s)); } return results; })()); this.letClauses = (function() { var i, len, ref2, ref3, results; ref3 = (ref2 = json["let"]) != null ? ref2 : []; results = []; for (i = 0, len = ref3.length; i < len; i++) { d = ref3[i]; results.push(new LetClause(d)); } return results; })(); this.relationship = json.relationship != null ? build(json.relationship) : []; this.where = build(json.where); this.returnClause = json["return"] != null ? new ReturnClause(json["return"]) : null; this.aliases = this.sources.aliases(); this.sortClause = json.sort != null ? new SortClause(json.sort) : null; } Query.prototype.exec = function(ctx) { var distinct, ref2, returnedValues; returnedValues = []; this.sources.forEach(ctx, (function(_this) { return function(rctx) { var child_ctx, def, i, len, passed, ref2, rel, relations, val; ref2 = _this.letClauses; for (i = 0, len = ref2.length; i < len; i++) { def = ref2[i]; rctx.set(def.identifier, def.expression.execute(rctx)); } relations = (function() { var j, len1, ref3, results; ref3 = this.relationship; results = []; for (j = 0, len1 = ref3.length; j < len1; j++) { rel = ref3[j]; child_ctx = rctx.childContext(); results.push(rel.execute(child_ctx)); } return results; }).call(_this); passed = allTrue(relations); passed = passed && (_this.where ? _this.where.execute(rctx) : passed); if (passed) { if (_this.returnClause != null) { val = _this.returnClause.expression.execute(rctx); return returnedValues.push(val); } else { if (_this.aliases.length === 1) { return returnedValues.push(rctx.get(_this.aliases[0])); } else { return returnedValues.push(rctx.context_values); } } } }; })(this)); distinct = this.returnClause != null ? this.returnClause.distinct : true; if (distinct) { returnedValues = toDistinctList(returnedValues); } if ((ref2 = this.sortClause) != null) { ref2.sort(ctx, returnedValues); } if (this.sources.returnsList()) { return returnedValues; } else { return returnedValues[0]; } }; return Query; })(Expression); module.exports.AliasRef = AliasRef = (function(superClass) { extend(AliasRef, superClass); function AliasRef(json) { AliasRef.__super__.constructor.apply(this, arguments); this.name = json.name; } AliasRef.prototype.exec = function(ctx) { return ctx != null ? ctx.get(this.name) : void 0; }; return AliasRef; })(Expression); module.exports.QueryLetRef = QueryLetRef = (function(superClass) { extend(QueryLetRef, superClass); function QueryLetRef(json) { QueryLetRef.__super__.constructor.apply(this, arguments); } return QueryLetRef; })(AliasRef); MultiSource = (function() { function MultiSource(sources) { this.sources = sources; this.alias = this.sources[0].alias; this.expression = this.sources[0].expression; this.isList = true; if (this.sources.length > 1) { this.rest = new MultiSource(this.sources.slice(1)); } } MultiSource.prototype.aliases = function() { var a; a = [this.alias]; if (this.rest) { a = a.concat(this.rest.aliases()); } return a; }; MultiSource.prototype.returnsList = function() { return this.isList || (this.rest && this.rest.returnsList()); }; MultiSource.prototype.forEach = function(ctx, func) { var i, len, rctx, rec, records, results; records = this.expression.execute(ctx); this.isList = typeIsArray(records); records = this.isList ? records : [records]; results = []; for (i = 0, len = records.length; i < len; i++) { rec = records[i]; rctx = new Context(ctx); rctx.set(this.alias, rec); if (this.rest) { results.push(this.rest.forEach(rctx, func)); } else { results.push(func(rctx)); } } return results; }; return MultiSource; })(); }).call(this); //# sourceMappingURL=query.js.map