flowquery 1.0.79 → 1.0.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/flowquery.min.js +1 -1
- package/dist/parsing/expressions/collect_subquery.d.ts +7 -0
- package/dist/parsing/expressions/collect_subquery.d.ts.map +1 -0
- package/dist/parsing/expressions/collect_subquery.js +21 -0
- package/dist/parsing/expressions/collect_subquery.js.map +1 -0
- package/dist/parsing/expressions/count_subquery.d.ts +7 -0
- package/dist/parsing/expressions/count_subquery.d.ts.map +1 -0
- package/dist/parsing/expressions/count_subquery.js +14 -0
- package/dist/parsing/expressions/count_subquery.js.map +1 -0
- package/dist/parsing/expressions/exists_subquery.d.ts +7 -0
- package/dist/parsing/expressions/exists_subquery.d.ts.map +1 -0
- package/dist/parsing/expressions/exists_subquery.js +14 -0
- package/dist/parsing/expressions/exists_subquery.js.map +1 -0
- package/dist/parsing/expressions/subquery_expression.d.ts +11 -11
- package/dist/parsing/expressions/subquery_expression.d.ts.map +1 -1
- package/dist/parsing/expressions/subquery_expression.js +53 -39
- package/dist/parsing/expressions/subquery_expression.js.map +1 -1
- package/dist/parsing/functions/round.d.ts +2 -0
- package/dist/parsing/functions/round.d.ts.map +1 -1
- package/dist/parsing/functions/round.js +32 -7
- package/dist/parsing/functions/round.js.map +1 -1
- package/dist/parsing/parser.d.ts.map +1 -1
- package/dist/parsing/parser.js +13 -16
- package/dist/parsing/parser.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import SubqueryExpression from "./subquery_expression";
|
|
2
|
+
/** `COLLECT { ... }` — the subquery's single returned column gathered into an array. */
|
|
3
|
+
declare class CollectSubquery extends SubqueryExpression {
|
|
4
|
+
protected reduce(rows: any[]): any[];
|
|
5
|
+
}
|
|
6
|
+
export default CollectSubquery;
|
|
7
|
+
//# sourceMappingURL=collect_subquery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect_subquery.d.ts","sourceRoot":"","sources":["../../../src/parsing/expressions/collect_subquery.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,uBAAuB,CAAC;AAEvD,wFAAwF;AACxF,cAAM,eAAgB,SAAQ,kBAAkB;IAC5C,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE;CASvC;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const subquery_expression_1 = __importDefault(require("./subquery_expression"));
|
|
7
|
+
/** `COLLECT { ... }` — the subquery's single returned column gathered into an array. */
|
|
8
|
+
class CollectSubquery extends subquery_expression_1.default {
|
|
9
|
+
reduce(rows) {
|
|
10
|
+
if (rows.length === 0)
|
|
11
|
+
return [];
|
|
12
|
+
const keys = Object.keys(rows[0]);
|
|
13
|
+
if (keys.length !== 1) {
|
|
14
|
+
throw new Error("COLLECT subquery must return exactly one column");
|
|
15
|
+
}
|
|
16
|
+
const key = keys[0];
|
|
17
|
+
return rows.map((r) => r[key]);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.default = CollectSubquery;
|
|
21
|
+
//# sourceMappingURL=collect_subquery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect_subquery.js","sourceRoot":"","sources":["../../../src/parsing/expressions/collect_subquery.ts"],"names":[],"mappings":";;;;;AAAA,gFAAuD;AAEvD,wFAAwF;AACxF,MAAM,eAAgB,SAAQ,6BAAkB;IAClC,MAAM,CAAC,IAAW;QACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;CACJ;AAED,kBAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import SubqueryExpression from "./subquery_expression";
|
|
2
|
+
/** `COUNT { ... }` — the number of rows the subquery produces. */
|
|
3
|
+
declare class CountSubquery extends SubqueryExpression {
|
|
4
|
+
protected reduce(_rows: any[], count: number): number;
|
|
5
|
+
}
|
|
6
|
+
export default CountSubquery;
|
|
7
|
+
//# sourceMappingURL=count_subquery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"count_subquery.d.ts","sourceRoot":"","sources":["../../../src/parsing/expressions/count_subquery.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,uBAAuB,CAAC;AAEvD,kEAAkE;AAClE,cAAM,aAAc,SAAQ,kBAAkB;IAC1C,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;CAGxD;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const subquery_expression_1 = __importDefault(require("./subquery_expression"));
|
|
7
|
+
/** `COUNT { ... }` — the number of rows the subquery produces. */
|
|
8
|
+
class CountSubquery extends subquery_expression_1.default {
|
|
9
|
+
reduce(_rows, count) {
|
|
10
|
+
return count;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.default = CountSubquery;
|
|
14
|
+
//# sourceMappingURL=count_subquery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"count_subquery.js","sourceRoot":"","sources":["../../../src/parsing/expressions/count_subquery.ts"],"names":[],"mappings":";;;;;AAAA,gFAAuD;AAEvD,kEAAkE;AAClE,MAAM,aAAc,SAAQ,6BAAkB;IAChC,MAAM,CAAC,KAAY,EAAE,KAAa;QACxC,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ;AAED,kBAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import SubqueryExpression from "./subquery_expression";
|
|
2
|
+
/** `EXISTS { ... }` — true when the subquery produces at least one row. */
|
|
3
|
+
declare class ExistsSubquery extends SubqueryExpression {
|
|
4
|
+
protected reduce(_rows: any[], count: number): boolean;
|
|
5
|
+
}
|
|
6
|
+
export default ExistsSubquery;
|
|
7
|
+
//# sourceMappingURL=exists_subquery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exists_subquery.d.ts","sourceRoot":"","sources":["../../../src/parsing/expressions/exists_subquery.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,uBAAuB,CAAC;AAEvD,2EAA2E;AAC3E,cAAM,cAAe,SAAQ,kBAAkB;IAC3C,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;CAGzD;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const subquery_expression_1 = __importDefault(require("./subquery_expression"));
|
|
7
|
+
/** `EXISTS { ... }` — true when the subquery produces at least one row. */
|
|
8
|
+
class ExistsSubquery extends subquery_expression_1.default {
|
|
9
|
+
reduce(_rows, count) {
|
|
10
|
+
return count > 0;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.default = ExistsSubquery;
|
|
14
|
+
//# sourceMappingURL=exists_subquery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exists_subquery.js","sourceRoot":"","sources":["../../../src/parsing/expressions/exists_subquery.ts"],"names":[],"mappings":";;;;;AAAA,gFAAuD;AAEvD,2EAA2E;AAC3E,MAAM,cAAe,SAAQ,6BAAkB;IACjC,MAAM,CAAC,KAAY,EAAE,KAAa;QACxC,OAAO,KAAK,GAAG,CAAC,CAAC;IACrB,CAAC;CACJ;AAED,kBAAe,cAAc,CAAC"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import ASTNode from "../ast_node";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Base class for the brace-delimited subquery expressions `EXISTS { }`,
|
|
4
|
+
* `COUNT { }` and `COLLECT { }`. The base executes the nested query and
|
|
5
|
+
* hands the resulting rows and row-count to `reduce()`, which each concrete
|
|
6
|
+
* subclass implements to produce its value.
|
|
7
|
+
*/
|
|
8
|
+
declare abstract class SubqueryExpression extends ASTNode {
|
|
9
9
|
private _subqueryAST;
|
|
10
|
-
private
|
|
11
|
-
|
|
12
|
-
constructor(mode: SubqueryMode, subqueryAST: ASTNode);
|
|
13
|
-
get mode(): SubqueryMode;
|
|
10
|
+
private _value;
|
|
11
|
+
constructor(subqueryAST: ASTNode);
|
|
14
12
|
introducesScope(): boolean;
|
|
15
13
|
evaluate(): Promise<void>;
|
|
16
14
|
value(): any;
|
|
15
|
+
/** Reduce the executed subquery's rows and row-count to this expression's value. */
|
|
16
|
+
protected abstract reduce(rows: any[], count: number): any;
|
|
17
17
|
}
|
|
18
18
|
export default SubqueryExpression;
|
|
19
19
|
//# sourceMappingURL=subquery_expression.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subquery_expression.d.ts","sourceRoot":"","sources":["../../../src/parsing/expressions/subquery_expression.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"subquery_expression.d.ts","sourceRoot":"","sources":["../../../src/parsing/expressions/subquery_expression.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,aAAa,CAAC;AAclC;;;;;GAKG;AACH,uBAAe,kBAAmB,SAAQ,OAAO;IAC7C,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,MAAM,CAAM;gBAER,WAAW,EAAE,OAAO;IAKzB,eAAe,IAAI,OAAO;IAIpB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC/B,KAAK,IAAI,GAAG;IAInB,oFAAoF;IACpF,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG;CAC7D;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
36
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
37
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -12,17 +45,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
45
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
46
|
};
|
|
14
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.SubqueryMode = void 0;
|
|
16
|
-
const runner_1 = __importDefault(require("../../compute/runner"));
|
|
17
48
|
const ast_node_1 = __importDefault(require("../ast_node"));
|
|
18
49
|
const operation_1 = __importDefault(require("../operations/operation"));
|
|
19
|
-
const return_1 = __importDefault(require("../operations/return"));
|
|
20
|
-
var SubqueryMode;
|
|
21
|
-
(function (SubqueryMode) {
|
|
22
|
-
SubqueryMode["EXISTS"] = "exists";
|
|
23
|
-
SubqueryMode["COUNT"] = "count";
|
|
24
|
-
SubqueryMode["COLLECT"] = "collect";
|
|
25
|
-
})(SubqueryMode || (exports.SubqueryMode = SubqueryMode = {}));
|
|
26
50
|
/**
|
|
27
51
|
* Counts rows flowing through an operation chain without producing results.
|
|
28
52
|
* Used by SubqueryExpression to evaluate MATCH-only subqueries (no RETURN).
|
|
@@ -38,32 +62,36 @@ class RowCounter extends operation_1.default {
|
|
|
38
62
|
});
|
|
39
63
|
}
|
|
40
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Base class for the brace-delimited subquery expressions `EXISTS { }`,
|
|
67
|
+
* `COUNT { }` and `COLLECT { }`. The base executes the nested query and
|
|
68
|
+
* hands the resulting rows and row-count to `reduce()`, which each concrete
|
|
69
|
+
* subclass implements to produce its value.
|
|
70
|
+
*/
|
|
41
71
|
class SubqueryExpression extends ast_node_1.default {
|
|
42
|
-
constructor(
|
|
72
|
+
constructor(subqueryAST) {
|
|
43
73
|
super();
|
|
44
|
-
this._results = [];
|
|
45
|
-
this._rowCount = 0;
|
|
46
|
-
this._mode = mode;
|
|
47
74
|
this._subqueryAST = subqueryAST;
|
|
48
75
|
}
|
|
49
|
-
get mode() {
|
|
50
|
-
return this._mode;
|
|
51
|
-
}
|
|
52
76
|
introducesScope() {
|
|
53
77
|
return true;
|
|
54
78
|
}
|
|
55
79
|
evaluate() {
|
|
56
80
|
return __awaiter(this, void 0, void 0, function* () {
|
|
57
81
|
var _a;
|
|
58
|
-
|
|
59
|
-
this
|
|
82
|
+
// Imported lazily to break the module cycle with Runner (which
|
|
83
|
+
// imports the parser, which imports this file's subclasses).
|
|
84
|
+
const { default: Runner } = yield Promise.resolve().then(() => __importStar(require("../../compute/runner")));
|
|
85
|
+
const { default: Return } = yield Promise.resolve().then(() => __importStar(require("../operations/return")));
|
|
60
86
|
const first = this._subqueryAST.firstChild();
|
|
61
87
|
const last = this._subqueryAST.lastChild();
|
|
62
|
-
|
|
63
|
-
|
|
88
|
+
let rows = [];
|
|
89
|
+
let count = 0;
|
|
90
|
+
if (last instanceof Return) {
|
|
91
|
+
const runner = new Runner(null, this._subqueryAST);
|
|
64
92
|
yield runner.run();
|
|
65
|
-
|
|
66
|
-
|
|
93
|
+
rows = (_a = runner.results) !== null && _a !== void 0 ? _a : [];
|
|
94
|
+
count = rows.length;
|
|
67
95
|
}
|
|
68
96
|
else {
|
|
69
97
|
// Subquery without RETURN (e.g., EXISTS { MATCH ... })
|
|
@@ -74,27 +102,13 @@ class SubqueryExpression extends ast_node_1.default {
|
|
|
74
102
|
yield first.run();
|
|
75
103
|
yield first.finish();
|
|
76
104
|
last.next = savedNext;
|
|
77
|
-
|
|
105
|
+
count = counter.count;
|
|
78
106
|
}
|
|
107
|
+
this._value = this.reduce(rows, count);
|
|
79
108
|
});
|
|
80
109
|
}
|
|
81
110
|
value() {
|
|
82
|
-
|
|
83
|
-
case SubqueryMode.EXISTS:
|
|
84
|
-
return this._rowCount > 0;
|
|
85
|
-
case SubqueryMode.COUNT:
|
|
86
|
-
return this._rowCount;
|
|
87
|
-
case SubqueryMode.COLLECT: {
|
|
88
|
-
if (this._results.length === 0)
|
|
89
|
-
return [];
|
|
90
|
-
const keys = Object.keys(this._results[0]);
|
|
91
|
-
if (keys.length !== 1) {
|
|
92
|
-
throw new Error("COLLECT subquery must return exactly one column");
|
|
93
|
-
}
|
|
94
|
-
const key = keys[0];
|
|
95
|
-
return this._results.map((r) => r[key]);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
111
|
+
return this._value;
|
|
98
112
|
}
|
|
99
113
|
}
|
|
100
114
|
exports.default = SubqueryExpression;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subquery_expression.js","sourceRoot":"","sources":["../../../src/parsing/expressions/subquery_expression.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"subquery_expression.js","sourceRoot":"","sources":["../../../src/parsing/expressions/subquery_expression.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2DAAkC;AAClC,wEAAgD;AAEhD;;;GAGG;AACH,MAAM,UAAW,SAAQ,mBAAS;IAAlC;;QACW,UAAK,GAAW,CAAC,CAAC;IAI7B,CAAC;IAHgB,GAAG;;YACZ,IAAI,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;KAAA;CACJ;AAED;;;;;GAKG;AACH,MAAe,kBAAmB,SAAQ,kBAAO;IAI7C,YAAY,WAAoB;QAC5B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IACpC,CAAC;IAEM,eAAe;QAClB,OAAO,IAAI,CAAC;IAChB,CAAC;IAEY,QAAQ;;;YACjB,+DAA+D;YAC/D,6DAA6D;YAC7D,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,wDAAa,sBAAsB,GAAC,CAAC;YACjE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,wDAAa,sBAAsB,GAAC,CAAC;YAEjE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAe,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAe,CAAC;YAExD,IAAI,IAAI,GAAU,EAAE,CAAC;YACrB,IAAI,KAAK,GAAG,CAAC,CAAC;YAEd,IAAI,IAAI,YAAY,MAAM,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBACnD,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;gBACnB,IAAI,GAAG,MAAA,MAAM,CAAC,OAAO,mCAAI,EAAE,CAAC;gBAC5B,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACJ,uDAAuD;gBACvD,MAAM,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC5B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;gBAEpB,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;gBAClB,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;gBAErB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;gBACtB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC1B,CAAC;YAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;KAAA;IAEM,KAAK;QACR,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;CAIJ;AAED,kBAAe,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round.d.ts","sourceRoot":"","sources":["../../../src/parsing/functions/round.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,YAAY,CAAC;AAGlC,
|
|
1
|
+
{"version":3,"file":"round.d.ts","sourceRoot":"","sources":["../../../src/parsing/functions/round.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,aAAa,CAAC;AAClC,OAAO,QAAQ,MAAM,YAAY,CAAC;AAGlC,cAeM,KAAM,SAAQ,QAAQ;;IAIxB,IAAW,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,EAKrC;IACM,KAAK,IAAI,GAAG;CAuBtB;AAED,eAAe,KAAK,CAAC"}
|
|
@@ -14,26 +14,51 @@ const function_metadata_1 = require("./function_metadata");
|
|
|
14
14
|
let Round = class Round extends function_1.default {
|
|
15
15
|
constructor() {
|
|
16
16
|
super("round");
|
|
17
|
-
|
|
17
|
+
}
|
|
18
|
+
set parameters(nodes) {
|
|
19
|
+
if (nodes.length < 1 || nodes.length > 2) {
|
|
20
|
+
throw new Error(`Function round expected 1 or 2 parameters, but got ${nodes.length}`);
|
|
21
|
+
}
|
|
22
|
+
this.children = nodes;
|
|
18
23
|
}
|
|
19
24
|
value() {
|
|
20
|
-
const
|
|
25
|
+
const children = this.getChildren();
|
|
26
|
+
const value = children[0].value();
|
|
21
27
|
if (value === null || value === undefined) {
|
|
22
28
|
return null;
|
|
23
29
|
}
|
|
24
30
|
if (typeof value !== "number") {
|
|
25
31
|
throw new Error("Invalid argument for round function");
|
|
26
32
|
}
|
|
27
|
-
|
|
33
|
+
if (children.length === 1) {
|
|
34
|
+
return Math.round(value);
|
|
35
|
+
}
|
|
36
|
+
const precision = children[1].value();
|
|
37
|
+
if (precision === null || precision === undefined) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
if (typeof precision !== "number" || !Number.isInteger(precision)) {
|
|
41
|
+
throw new Error("Invalid precision argument for round function");
|
|
42
|
+
}
|
|
43
|
+
// Round half away from zero to `precision` decimal places.
|
|
44
|
+
const factor = Math.pow(10, precision);
|
|
45
|
+
return (Math.sign(value) * Math.round(Math.abs(value) * factor)) / factor;
|
|
28
46
|
}
|
|
29
47
|
};
|
|
30
48
|
Round = __decorate([
|
|
31
49
|
(0, function_metadata_1.FunctionDef)({
|
|
32
|
-
description: "Rounds a number to the nearest integer",
|
|
50
|
+
description: "Rounds a number to the nearest integer, or to an optional number of decimal places",
|
|
33
51
|
category: "scalar",
|
|
34
|
-
parameters: [
|
|
35
|
-
|
|
36
|
-
|
|
52
|
+
parameters: [
|
|
53
|
+
{ name: "value", description: "Number to round", type: "number" },
|
|
54
|
+
{
|
|
55
|
+
name: "precision",
|
|
56
|
+
description: "Number of decimal places to round to (optional)",
|
|
57
|
+
type: "integer",
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
output: { description: "Rounded number", type: "number", example: 4 },
|
|
61
|
+
examples: ["WITH 3.7 AS n RETURN round(n)", "RETURN round(3.14159, 2)"],
|
|
37
62
|
})
|
|
38
63
|
], Round);
|
|
39
64
|
exports.default = Round;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round.js","sourceRoot":"","sources":["../../../src/parsing/functions/round.ts"],"names":[],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"round.js","sourceRoot":"","sources":["../../../src/parsing/functions/round.ts"],"names":[],"mappings":";;;;;;;;;;;AACA,0DAAkC;AAClC,2DAAkD;AAiBlD,IAAM,KAAK,GAAX,MAAM,KAAM,SAAQ,kBAAQ;IACxB;QACI,KAAK,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IACD,IAAW,UAAU,CAAC,KAAgB;QAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,sDAAsD,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,CAAC;IACM,KAAK;QACR,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACrE,CAAC;QACD,2DAA2D;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC;IAC9E,CAAC;CACJ,CAAA;AAjCK,KAAK;IAfV,IAAA,+BAAW,EAAC;QACT,WAAW,EACP,oFAAoF;QACxF,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE;YACR,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE;YACjE;gBACI,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,iDAAiD;gBAC9D,IAAI,EAAE,SAAS;aAClB;SACJ;QACD,MAAM,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;QACrE,QAAQ,EAAE,CAAC,+BAA+B,EAAE,0BAA0B,CAAC;KAC1E,CAAC;GACI,KAAK,CAiCV;AAED,kBAAe,KAAK,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parsing/parser.ts"],"names":[],"mappings":"AAUA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,UAAU,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parsing/parser.ts"],"names":[],"mappings":"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"}
|
package/dist/parsing/parser.js
CHANGED
|
@@ -59,6 +59,9 @@ const list_comprehension_1 = __importDefault(require("./data_structures/list_com
|
|
|
59
59
|
const lookup_1 = __importDefault(require("./data_structures/lookup"));
|
|
60
60
|
const range_lookup_1 = __importDefault(require("./data_structures/range_lookup"));
|
|
61
61
|
const binding_reference_1 = __importDefault(require("./expressions/binding_reference"));
|
|
62
|
+
const collect_subquery_1 = __importDefault(require("./expressions/collect_subquery"));
|
|
63
|
+
const count_subquery_1 = __importDefault(require("./expressions/count_subquery"));
|
|
64
|
+
const exists_subquery_1 = __importDefault(require("./expressions/exists_subquery"));
|
|
62
65
|
const expression_1 = __importDefault(require("./expressions/expression"));
|
|
63
66
|
const f_string_1 = __importDefault(require("./expressions/f_string"));
|
|
64
67
|
const identifier_1 = __importDefault(require("./expressions/identifier"));
|
|
@@ -66,7 +69,6 @@ const operator_1 = require("./expressions/operator");
|
|
|
66
69
|
const parameter_reference_1 = __importDefault(require("./expressions/parameter_reference"));
|
|
67
70
|
const reference_1 = __importDefault(require("./expressions/reference"));
|
|
68
71
|
const string_1 = __importDefault(require("./expressions/string"));
|
|
69
|
-
const subquery_expression_1 = __importStar(require("./expressions/subquery_expression"));
|
|
70
72
|
const aggregate_function_1 = __importDefault(require("./functions/aggregate_function"));
|
|
71
73
|
const function_1 = __importDefault(require("./functions/function"));
|
|
72
74
|
const function_factory_1 = __importDefault(require("./functions/function_factory"));
|
|
@@ -2654,19 +2656,8 @@ class Parser extends base_parser_1.default {
|
|
|
2654
2656
|
}
|
|
2655
2657
|
parseSubqueryExpression() {
|
|
2656
2658
|
const keyword = (this.token.value || "").toUpperCase();
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
case "EXISTS":
|
|
2660
|
-
mode = subquery_expression_1.SubqueryMode.EXISTS;
|
|
2661
|
-
break;
|
|
2662
|
-
case "COUNT":
|
|
2663
|
-
mode = subquery_expression_1.SubqueryMode.COUNT;
|
|
2664
|
-
break;
|
|
2665
|
-
case "COLLECT":
|
|
2666
|
-
mode = subquery_expression_1.SubqueryMode.COLLECT;
|
|
2667
|
-
break;
|
|
2668
|
-
default:
|
|
2669
|
-
return null;
|
|
2659
|
+
if (keyword !== "EXISTS" && keyword !== "COUNT" && keyword !== "COLLECT") {
|
|
2660
|
+
return null;
|
|
2670
2661
|
}
|
|
2671
2662
|
this.setNextToken(); // consume EXISTS/COUNT/COLLECT keyword
|
|
2672
2663
|
this.skipWhitespaceAndComments();
|
|
@@ -2682,7 +2673,7 @@ class Parser extends base_parser_1.default {
|
|
|
2682
2673
|
// COLLECT is excluded: it needs a RETURN to know what to collect.
|
|
2683
2674
|
let subqueryAST;
|
|
2684
2675
|
if (this.token.isOpeningBrace() && this.nextSignificantToken().isLeftParenthesis()) {
|
|
2685
|
-
if (
|
|
2676
|
+
if (keyword === "COLLECT") {
|
|
2686
2677
|
this._state = outerState;
|
|
2687
2678
|
throw new Error("COLLECT subquery must contain a RETURN clause");
|
|
2688
2679
|
}
|
|
@@ -2695,7 +2686,13 @@ class Parser extends base_parser_1.default {
|
|
|
2695
2686
|
if (subqueryAST === null) {
|
|
2696
2687
|
throw new Error(`Expected opening brace after ${keyword}`);
|
|
2697
2688
|
}
|
|
2698
|
-
|
|
2689
|
+
if (keyword === "EXISTS") {
|
|
2690
|
+
return new exists_subquery_1.default(subqueryAST);
|
|
2691
|
+
}
|
|
2692
|
+
if (keyword === "COUNT") {
|
|
2693
|
+
return new count_subquery_1.default(subqueryAST);
|
|
2694
|
+
}
|
|
2695
|
+
return new collect_subquery_1.default(subqueryAST);
|
|
2699
2696
|
}
|
|
2700
2697
|
/**
|
|
2701
2698
|
* Parses a bare graph pattern (with optional trailing WHERE) inside
|