UNPKG

jsoniq

Version:

JSONiq implementation for JavaScript

75 lines (73 loc) 12.2 kB
"use strict"; /// <reference path="../../../../typings/tsd.d.ts" /> var _ = require("lodash"); var OrderByIterator_1 = require("./OrderByIterator"); var ReturnTupleIterator_1 = require("./ReturnTupleIterator"); var Iterator_1 = require("../Iterator"); class FLWORIterator extends Iterator_1.default { constructor(position, clauses) { super(position); this.clauses = clauses; } isMaterializingClause(it) { return it instanceof OrderByIterator_1.default; } serializeAsStream(node, clauses) { node.add("(function *(){") .add(clauses[0].serializeClause(clauses.slice(1))) .add("})()"); return this; } serializeChunk(node, left, op, right, remaining) { var bindings = {}; left.forEach(clause => { if (clause.getBindingVar() !== undefined) { bindings[clause.getBindingVar()] = true; } }); var leftIts = left.slice(1); leftIts.push(new ReturnTupleIterator_1.default(this.position, Object.keys(bindings), op)); node.add("(function *(){\n") .add("let tuples = (function *(){\n") .add(left[0].serializeClause(leftIts)) .add("})();") .add("tuples = r.processTuples(tuples);\n") .add("for(var i = 0; i < tuples.length; i++) {\nlet tuple = tuples[i];\n"); _.forEach(bindings, (v, varName) => { node.add(`let $${varName} = tuple['$${varName}'];\n`); }); node.add(right[0].serializeClause(right.slice(1))) .add("\n}\n})()"); if (remaining.length > 0) { this.serializeChunk(node, remaining[0], remaining[1], remaining[2], remaining.slice(3)); } return this; } serialize() { var chunks = [[]]; this.clauses.forEach((clause, index) => { var prev = this.clauses[index - 1]; var next = this.clauses[index + 1]; if (this.isMaterializingClause(clause) && !this.isMaterializingClause(prev)) { chunks.push([]); chunks[chunks.length - 1].push(clause); if (!this.isMaterializingClause(next)) { chunks.push([]); } } else { chunks[chunks.length - 1].push(clause); } }); var node = super.serialize("flwor"); if (chunks.length > 1) { this.serializeChunk(node, chunks[0], chunks[1], chunks[2], chunks.slice(3)); } else { this.serializeAsStream(node, this.clauses); } return node; } } exports.default = FLWORIterator; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9ydW50aW1lL2l0ZXJhdG9ycy9mbHdvci9GTFdPUkl0ZXJhdG9yLnRzIl0sIm5hbWVzIjpbIkZMV09SSXRlcmF0b3IiLCJGTFdPUkl0ZXJhdG9yLmNvbnN0cnVjdG9yIiwiRkxXT1JJdGVyYXRvci5pc01hdGVyaWFsaXppbmdDbGF1c2UiLCJGTFdPUkl0ZXJhdG9yLnNlcmlhbGl6ZUFzU3RyZWFtIiwiRkxXT1JJdGVyYXRvci5zZXJpYWxpemVDaHVuayIsIkZMV09SSXRlcmF0b3Iuc2VyaWFsaXplIl0sIm1hcHBpbmdzIjoiO0FBQUEscURBQXFEO0FBQ3JELElBQVksQ0FBQyxXQUFNLFFBQVEsQ0FBQyxDQUFBO0FBSzVCLGdDQUE0QixtQkFBbUIsQ0FBQyxDQUFBO0FBQ2hELG9DQUFnQyx1QkFBdUIsQ0FBQyxDQUFBO0FBQ3hELHlCQUFxQixhQUFhLENBQUMsQ0FBQTtBQUVuQyw0QkFBMkMsa0JBQVE7SUFLL0NBLFlBQVlBLFFBQWtCQSxFQUFFQSxPQUFtQkE7UUFDL0NDLE1BQU1BLFFBQVFBLENBQUNBLENBQUNBO1FBQ2hCQSxJQUFJQSxDQUFDQSxPQUFPQSxHQUFxQkEsT0FBT0EsQ0FBQ0E7SUFDN0NBLENBQUNBO0lBRU9ELHFCQUFxQkEsQ0FBQ0EsRUFBa0JBO1FBQzVDRSxNQUFNQSxDQUFDQSxFQUFFQSxZQUFZQSx5QkFBZUEsQ0FBQ0E7SUFDekNBLENBQUNBO0lBRU9GLGlCQUFpQkEsQ0FBQ0EsSUFBSUEsRUFBRUEsT0FBeUJBO1FBQ3JERyxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxnQkFBZ0JBLENBQUNBO2FBQ3JCQSxHQUFHQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxlQUFlQSxDQUFDQSxPQUFPQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNqREEsR0FBR0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7UUFDakJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0lBQ2hCQSxDQUFD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QSxJQUFJQSxFQUFFQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQTtRQUMvQ0EsQ0FBQ0E7UUFDREEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7SUFFaEJBLENBQUNBO0FBQ0xMLENBQUNBO2dDQUFBIiwiZmlsZSI6ImxpYi9ydW50aW1lL2l0ZXJhdG9ycy9mbHdvci9GTFdPUkl0ZXJhdG9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uLy4uL3R5cGluZ3MvdHNkLmQudHNcIiAvPlxuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgKiBhcyBTb3VyY2VNYXAgZnJvbSBcInNvdXJjZS1tYXBcIjtcblxuaW1wb3J0IFBvc2l0aW9uIGZyb20gXCIuLi8uLi8uLi9jb21waWxlci9wYXJzZXJzL1Bvc2l0aW9uXCI7XG5pbXBvcnQgSXRlcmF0b3JDbGF1c2UgZnJvbSBcIi4vSXRlcmF0b3JDbGF1c2VcIjtcbmltcG9ydCBPcmRlckJ5SXRlcmF0b3IgZnJvbSBcIi4vT3JkZXJCeUl0ZXJhdG9yXCI7XG5pbXBvcnQgUmV0dXJuVHVwbGVJdGVyYXRvciBmcm9tIFwiLi9SZXR1cm5UdXBsZUl0ZXJhdG9yXCI7XG5pbXBvcnQgSXRlcmF0b3IgZnJvbSBcIi4uL0l0ZXJhdG9yXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZMV09SSXRlcmF0b3IgZXh0ZW5kcyBJdGVyYXRvciB7XG5cbiAgICBwcml2YXRlIGNsYXVzZXM6IEl0ZXJhdG9yQ2xhdXNlW107XG5cblxuICAgIGNvbnN0cnVjdG9yKHBvc2l0aW9uOiBQb3NpdGlvbiwgY2xhdXNlczogSXRlcmF0b3JbXSkge1xuICAgICAgICBzdXBlcihwb3NpdGlvbik7XG4gICAgICAgIHRoaXMuY2xhdXNlcyA9IDxJdGVyYXRvckNsYXVzZVtdPmNsYXVzZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01hdGVyaWFsaXppbmdDbGF1c2UoaXQ6IEl0ZXJhdG9yQ2xhdXNlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpdCBpbnN0YW5jZW9mIE9yZGVyQnlJdGVyYXRvcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlcmlhbGl6ZUFzU3RyZWFtKG5vZGUsIGNsYXVzZXM6IEl0ZXJhdG9yQ2xhdXNlW10pOiBGTFdPUkl0ZXJhdG9yIHtcbiAgICAgICAgbm9kZS5hZGQoXCIoZnVuY3Rpb24gKigpe1wiKVxuICAgICAgICAgICAgLmFkZChjbGF1c2VzWzBdLnNlcmlhbGl6ZUNsYXVzZShjbGF1c2VzLnNsaWNlKDEpKSlcbiAgICAgICAgICAgIC5hZGQoXCJ9KSgpXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlcmlhbGl6ZUNodW5rKFxuICAgICAgICBub2RlOiBTb3VyY2VNYXAuU291cmNlTm9kZSxcbiAgICAgICAgbGVmdDogSXRlcmF0b3JDbGF1c2VbXSxcbiAgICAgICAgb3A6IEl0ZXJhdG9yQ2xhdXNlW10sXG4gICAgICAgIHJpZ2h0OiBJdGVyYXRvckNsYXVzZVtdLFxuICAgICAgICByZW1haW5pbmc6IGFueVtdXG4gICAgKTogRkxXT1JJdGVyYXRvciB7XG4gICAgICAgIHZhciBiaW5kaW5ncyA9IHt9O1xuICAgICAgICBsZWZ0LmZvckVhY2goY2xhdXNlID0+IHtcbiAgICAgICAgICAgIGlmKGNsYXVzZS5nZXRCaW5kaW5nVmFyKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGJpbmRpbmdzW2NsYXVzZS5nZXRCaW5kaW5nVmFyKCldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBsZWZ0SXRzID0gbGVmdC5zbGljZSgxKTtcbiAgICAgICAgbGVmdEl0cy5wdXNoKG5ldyBSZXR1cm5UdXBsZUl0ZXJhdG9yKHRoaXMucG9zaXRpb24sIE9iamVjdC5rZXlzKGJpbmRpbmdzKSwgb3ApKTtcbiAgICAgICAgbm9kZS5hZGQoXCIoZnVuY3Rpb24gKigpe1xcblwiKVxuICAgICAgICAgICAgLmFkZChcImxldCB0dXBsZXMgPSAoZnVuY3Rpb24gKigpe1xcblwiKVxuICAgICAgICAgICAgLmFkZChsZWZ0WzBdLnNlcmlhbGl6ZUNsYXVzZShsZWZ0SXRzKSlcbiAgICAgICAgICAgIC8vLmFkZCgpXG4gICAgICAgICAgICAuYWRkKFwifSkoKTtcIilcbiAgICAgICAgICAgIC8vLmFkZChvcFswXS5zZXJpYWxpemVDbGF1c2Uob3Auc2xpY2UoMSkpKVxuICAgICAgICAgICAgLmFkZChcInR1cGxlcyA9IHIucHJvY2Vzc1R1cGxlcyh0dXBsZXMpO1xcblwiKVxuICAgICAgICAgICAgLmFkZChcImZvcih2YXIgaSA9IDA7IGkgPCB0dXBsZXMubGVuZ3RoOyBpKyspIHtcXG5sZXQgdHVwbGUgPSB0dXBsZXNbaV07XFxuXCIpO1xuICAgICAgICBfLmZvckVhY2goYmluZGluZ3MsICh2LCB2YXJOYW1lKSA9PiB7XG4gICAgICAgICAgICBub2RlLmFkZChgbGV0ICQke3Zhck5hbWV9ID0gdHVwbGVbJyQke3Zhck5hbWV9J107XFxuYCk7XG4gICAgICAgIH0pO1xuICAgICAgICBub2RlLmFkZChyaWdodFswXS5zZXJpYWxpemVDbGF1c2UocmlnaHQuc2xpY2UoMSkpKVxuICAgICAgICAgICAgLmFkZChcIlxcbn1cXG59KSgpXCIpO1xuXG4gICAgICAgIGlmKHJlbWFpbmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlcmlhbGl6ZUNodW5rKG5vZGUsIHJlbWFpbmluZ1swXSwgcmVtYWluaW5nWzFdLCByZW1haW5pbmdbMl0sIHJlbWFpbmluZy5zbGljZSgzKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogU291cmNlTWFwLlNvdXJjZU5vZGUge1xuICAgICAgICB2YXIgY2h1bmtzID0gW1tdXTtcbiAgICAgICAgdGhpcy5jbGF1c2VzLmZvckVhY2goKGNsYXVzZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHZhciBwcmV2ID0gdGhpcy5jbGF1c2VzW2luZGV4IC0gMV07XG4gICAgICAgICAgICB2YXIgbmV4dCA9IHRoaXMuY2xhdXNlc1tpbmRleCArIDFdO1xuICAgICAgICAgICAgaWYodGhpcy5pc01hdGVyaWFsaXppbmdDbGF1c2UoY2xhdXNlKSAmJiAhdGhpcy5pc01hdGVyaWFsaXppbmdDbGF1c2UocHJldikpIHtcbiAgICAgICAgICAgICAgICBjaHVua3MucHVzaChbXSk7XG4gICAgICAgICAgICAgICAgY2h1bmtzW2NodW5rcy5sZW5ndGggLSAxXS5wdXNoKGNsYXVzZSk7XG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuaXNNYXRlcmlhbGl6aW5nQ2xhdXNlKG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNodW5rc1tjaHVua3MubGVuZ3RoIC0gMV0ucHVzaChjbGF1c2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgbm9kZSA9IHN1cGVyLnNlcmlhbGl6ZShcImZsd29yXCIpO1xuICAgICAgICBpZihjaHVua3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5zZXJpYWxpemVDaHVuayhub2RlLCBjaHVua3NbMF0sIGNodW5rc1sxXSwgY2h1bmtzWzJdLCBjaHVua3Muc2xpY2UoMykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXJpYWxpemVBc1N0cmVhbShub2RlLCB0aGlzLmNsYXVzZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuXG4gICAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9