grafeo-ogm 2.5.1 → 2.5.3
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/CHANGELOG.md +52 -0
- package/dist/cjs/compilers/mutation.compiler.d.ts +11 -0
- package/dist/cjs/compilers/mutation.compiler.d.ts.map +1 -1
- package/dist/cjs/compilers/mutation.compiler.js +20 -1
- package/dist/cjs/compilers/mutation.compiler.js.map +1 -1
- package/dist/cjs/compilers/select-normalizer.d.ts +5 -0
- package/dist/cjs/compilers/select-normalizer.d.ts.map +1 -1
- package/dist/cjs/compilers/select-normalizer.js +54 -3
- package/dist/cjs/compilers/select-normalizer.js.map +1 -1
- package/dist/cjs/compilers/selection.compiler.d.ts +33 -0
- package/dist/cjs/compilers/selection.compiler.d.ts.map +1 -1
- package/dist/cjs/compilers/selection.compiler.js +220 -53
- package/dist/cjs/compilers/selection.compiler.js.map +1 -1
- package/dist/cjs/compilers/where.compiler.d.ts.map +1 -1
- package/dist/cjs/compilers/where.compiler.js +21 -0
- package/dist/cjs/compilers/where.compiler.js.map +1 -1
- package/dist/cjs/execution/executor.d.ts +7 -2
- package/dist/cjs/execution/executor.d.ts.map +1 -1
- package/dist/cjs/execution/executor.js +22 -5
- package/dist/cjs/execution/executor.js.map +1 -1
- package/dist/cjs/generator/generate-types.d.ts.map +1 -1
- package/dist/cjs/generator/generate-types.js +19 -2
- package/dist/cjs/generator/generate-types.js.map +1 -1
- package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts +2 -1
- package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts.map +1 -1
- package/dist/cjs/generator/type-emitters/model-map-emitter.js +9 -7
- package/dist/cjs/generator/type-emitters/model-map-emitter.js.map +1 -1
- package/dist/cjs/generator/type-emitters/utility-types.d.ts +13 -1
- package/dist/cjs/generator/type-emitters/utility-types.d.ts.map +1 -1
- package/dist/cjs/generator/type-emitters/utility-types.js +21 -3
- package/dist/cjs/generator/type-emitters/utility-types.js.map +1 -1
- package/dist/cjs/interface-model.d.ts.map +1 -1
- package/dist/cjs/interface-model.js +5 -1
- package/dist/cjs/interface-model.js.map +1 -1
- package/dist/cjs/schema/parser.d.ts.map +1 -1
- package/dist/cjs/schema/parser.js +7 -2
- package/dist/cjs/schema/parser.js.map +1 -1
- package/dist/cjs/testing/cypher-assert.d.ts +2 -2
- package/dist/cjs/testing/cypher-assert.d.ts.map +1 -1
- package/dist/cjs/testing/cypher-assert.js +54 -6
- package/dist/cjs/testing/cypher-assert.js.map +1 -1
- package/dist/cjs/testing/neo4j-record-factory.d.ts +5 -0
- package/dist/cjs/testing/neo4j-record-factory.d.ts.map +1 -1
- package/dist/cjs/testing/neo4j-record-factory.js +82 -27
- package/dist/cjs/testing/neo4j-record-factory.js.map +1 -1
- package/dist/cjs/utils/cypher-field-projection.d.ts +9 -1
- package/dist/cjs/utils/cypher-field-projection.d.ts.map +1 -1
- package/dist/cjs/utils/cypher-field-projection.js +39 -9
- package/dist/cjs/utils/cypher-field-projection.js.map +1 -1
- package/dist/cjs/utils/cypher-sort-projection.d.ts +6 -4
- package/dist/cjs/utils/cypher-sort-projection.d.ts.map +1 -1
- package/dist/cjs/utils/cypher-sort-projection.js +9 -7
- package/dist/cjs/utils/cypher-sort-projection.js.map +1 -1
- package/dist/cjs/utils/write-coercion.d.ts.map +1 -1
- package/dist/cjs/utils/write-coercion.js +12 -1
- package/dist/cjs/utils/write-coercion.js.map +1 -1
- package/dist/esm/compilers/mutation.compiler.d.ts +11 -0
- package/dist/esm/compilers/mutation.compiler.d.ts.map +1 -1
- package/dist/esm/compilers/mutation.compiler.js +20 -1
- package/dist/esm/compilers/mutation.compiler.js.map +1 -1
- package/dist/esm/compilers/select-normalizer.d.ts +5 -0
- package/dist/esm/compilers/select-normalizer.d.ts.map +1 -1
- package/dist/esm/compilers/select-normalizer.js +54 -3
- package/dist/esm/compilers/select-normalizer.js.map +1 -1
- package/dist/esm/compilers/selection.compiler.d.ts +33 -0
- package/dist/esm/compilers/selection.compiler.d.ts.map +1 -1
- package/dist/esm/compilers/selection.compiler.js +221 -54
- package/dist/esm/compilers/selection.compiler.js.map +1 -1
- package/dist/esm/compilers/where.compiler.d.ts.map +1 -1
- package/dist/esm/compilers/where.compiler.js +21 -0
- package/dist/esm/compilers/where.compiler.js.map +1 -1
- package/dist/esm/execution/executor.d.ts +7 -2
- package/dist/esm/execution/executor.d.ts.map +1 -1
- package/dist/esm/execution/executor.js +22 -5
- package/dist/esm/execution/executor.js.map +1 -1
- package/dist/esm/generator/generate-types.d.ts.map +1 -1
- package/dist/esm/generator/generate-types.js +20 -3
- package/dist/esm/generator/generate-types.js.map +1 -1
- package/dist/esm/generator/type-emitters/model-map-emitter.d.ts +2 -1
- package/dist/esm/generator/type-emitters/model-map-emitter.d.ts.map +1 -1
- package/dist/esm/generator/type-emitters/model-map-emitter.js +9 -7
- package/dist/esm/generator/type-emitters/model-map-emitter.js.map +1 -1
- package/dist/esm/generator/type-emitters/utility-types.d.ts +13 -1
- package/dist/esm/generator/type-emitters/utility-types.d.ts.map +1 -1
- package/dist/esm/generator/type-emitters/utility-types.js +19 -3
- package/dist/esm/generator/type-emitters/utility-types.js.map +1 -1
- package/dist/esm/interface-model.d.ts.map +1 -1
- package/dist/esm/interface-model.js +5 -1
- package/dist/esm/interface-model.js.map +1 -1
- package/dist/esm/schema/parser.d.ts.map +1 -1
- package/dist/esm/schema/parser.js +7 -2
- package/dist/esm/schema/parser.js.map +1 -1
- package/dist/esm/testing/cypher-assert.d.ts +2 -2
- package/dist/esm/testing/cypher-assert.d.ts.map +1 -1
- package/dist/esm/testing/cypher-assert.js +54 -6
- package/dist/esm/testing/cypher-assert.js.map +1 -1
- package/dist/esm/testing/neo4j-record-factory.d.ts +5 -0
- package/dist/esm/testing/neo4j-record-factory.d.ts.map +1 -1
- package/dist/esm/testing/neo4j-record-factory.js +82 -27
- package/dist/esm/testing/neo4j-record-factory.js.map +1 -1
- package/dist/esm/utils/cypher-field-projection.d.ts +9 -1
- package/dist/esm/utils/cypher-field-projection.d.ts.map +1 -1
- package/dist/esm/utils/cypher-field-projection.js +39 -9
- package/dist/esm/utils/cypher-field-projection.js.map +1 -1
- package/dist/esm/utils/cypher-sort-projection.d.ts +6 -4
- package/dist/esm/utils/cypher-sort-projection.d.ts.map +1 -1
- package/dist/esm/utils/cypher-sort-projection.js +9 -7
- package/dist/esm/utils/cypher-sort-projection.js.map +1 -1
- package/dist/esm/utils/write-coercion.d.ts.map +1 -1
- package/dist/esm/utils/write-coercion.js +12 -1
- package/dist/esm/utils/write-coercion.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,8 +9,11 @@ const neo4j_driver_1 = __importDefault(require("neo4j-driver"));
|
|
|
9
9
|
* ISO-8601 date-time as Neo4j's `datetime()` accepts it: a date, an
|
|
10
10
|
* optional time with up to nine fractional digits, an optional offset
|
|
11
11
|
* (`Z`, `±HH`, `±HHMM`, `±HH:MM`) and an optional `[Area/City]` zone id.
|
|
12
|
+
*
|
|
13
|
+
* v2.5.3 — the basic format (`20240101T100000Z`, no separators) is
|
|
14
|
+
* accepted too, as Neo4j accepts it.
|
|
12
15
|
*/
|
|
13
|
-
const ISO_DATE_TIME = /^([+-]?\d{4,})-(\d{2})-(\d{2})(?:[T ](\d{2})
|
|
16
|
+
const ISO_DATE_TIME = /^(?:([+-]?\d{4,})-(\d{2})-(\d{2})|([+-]?\d{4})(\d{2})(\d{2}))(?:[T ](\d{2}):?(\d{2})(?::?(\d{2})(?:[.,](\d{1,9}))?)?)?(Z|[+-]\d{2}(?::?\d{2})?)?(?:\[([^\]]+)\])?$/i;
|
|
14
17
|
function parseOffsetSeconds(offset) {
|
|
15
18
|
if (offset.toUpperCase() === 'Z')
|
|
16
19
|
return 0;
|
|
@@ -18,16 +21,26 @@ function parseOffsetSeconds(offset) {
|
|
|
18
21
|
const digits = offset.slice(1).replace(':', '');
|
|
19
22
|
const hours = Number(digits.slice(0, 2));
|
|
20
23
|
const minutes = digits.length > 2 ? Number(digits.slice(2, 4)) : 0;
|
|
21
|
-
|
|
24
|
+
// v2.5.3 — `-00:00` is offset 0, not -0 (which `toEqual` tells apart
|
|
25
|
+
// from the driver's 0).
|
|
26
|
+
return sign * (hours * 3600 + minutes * 60) || 0;
|
|
22
27
|
}
|
|
23
28
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
29
|
+
* Epoch milliseconds of a wall-clock time read as UTC. v2.5.3 — `Date.UTC`
|
|
30
|
+
* maps years 0–99 to 1900–1999, so the year is set with `setUTCFullYear`.
|
|
26
31
|
*/
|
|
27
|
-
function
|
|
32
|
+
function utcMs(year, month, day, hour, minute, second) {
|
|
33
|
+
const d = new Date(0);
|
|
34
|
+
d.setUTCFullYear(year, month - 1, day);
|
|
35
|
+
d.setUTCHours(hour, minute, second, 0);
|
|
36
|
+
return d.getTime();
|
|
37
|
+
}
|
|
38
|
+
/** Offset of `timeZone` at an instant, in whole seconds. */
|
|
39
|
+
function zoneOffsetAt(timeZone, instantMs) {
|
|
28
40
|
const fmt = new Intl.DateTimeFormat('en-US', {
|
|
29
41
|
timeZone,
|
|
30
42
|
hourCycle: 'h23',
|
|
43
|
+
era: 'short',
|
|
31
44
|
year: 'numeric',
|
|
32
45
|
month: '2-digit',
|
|
33
46
|
day: '2-digit',
|
|
@@ -35,16 +48,44 @@ function zoneOffsetSeconds(timeZone, wallClockAsUtcMs) {
|
|
|
35
48
|
minute: '2-digit',
|
|
36
49
|
second: '2-digit',
|
|
37
50
|
});
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
51
|
+
const p = {};
|
|
52
|
+
let bc = false;
|
|
53
|
+
for (const part of fmt.formatToParts(new Date(instantMs)))
|
|
54
|
+
if (part.type === 'era')
|
|
55
|
+
bc = part.value.toUpperCase().startsWith('B');
|
|
56
|
+
else if (part.type !== 'literal')
|
|
57
|
+
p[part.type] = Number(part.value);
|
|
58
|
+
// v2.5.3 — `Intl` writes year -1 as "2 BC".
|
|
59
|
+
const year = bc ? 1 - p.year : p.year;
|
|
60
|
+
const asUtc = utcMs(year, p.month, p.day, p.hour, p.minute, p.second);
|
|
61
|
+
return Math.round((asUtc - Math.floor(instantMs / 1000) * 1000) / 1000);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Resolve a wall-clock time in `timeZone` as Neo4j (java.time) does:
|
|
65
|
+
* - a valid wall time keeps its offset;
|
|
66
|
+
* - in a DST overlap the earlier offset (the larger one) wins;
|
|
67
|
+
* - in a DST gap the wall time moves later by the length of the gap.
|
|
68
|
+
*
|
|
69
|
+
* Returns the offset and the (possibly shifted) wall time as UTC ms.
|
|
70
|
+
* Pre-2.5.3 a gap time kept its non-existent wall clock and an overlap in
|
|
71
|
+
* a zone east of UTC took the later offset.
|
|
72
|
+
*/
|
|
73
|
+
function resolveZoned(timeZone, wallMs) {
|
|
74
|
+
const DAY = 86400000;
|
|
75
|
+
const first = zoneOffsetAt(timeZone, wallMs);
|
|
76
|
+
const candidates = new Set([
|
|
77
|
+
zoneOffsetAt(timeZone, wallMs - DAY),
|
|
78
|
+
zoneOffsetAt(timeZone, wallMs + DAY),
|
|
79
|
+
first,
|
|
80
|
+
zoneOffsetAt(timeZone, wallMs - first * 1000),
|
|
81
|
+
]);
|
|
82
|
+
const valid = [...candidates].filter((o) => zoneOffsetAt(timeZone, wallMs - o * 1000) === o);
|
|
83
|
+
if (valid.length > 0)
|
|
84
|
+
return { offsetSeconds: Math.max(...valid), wallMs };
|
|
85
|
+
// Gap: the instant uses the offset before the transition (the smaller).
|
|
86
|
+
const instant = wallMs - Math.min(...candidates) * 1000;
|
|
87
|
+
const offsetSeconds = zoneOffsetAt(timeZone, instant);
|
|
88
|
+
return { offsetSeconds, wallMs: instant + offsetSeconds * 1000 };
|
|
48
89
|
}
|
|
49
90
|
/**
|
|
50
91
|
* Factory for creating mock Neo4j Record objects for testing.
|
|
@@ -78,6 +119,11 @@ class Neo4jRecordFactory {
|
|
|
78
119
|
* A string with neither an offset nor a zone id is read as UTC, as Neo4j
|
|
79
120
|
* reads it with its default zone.
|
|
80
121
|
*
|
|
122
|
+
* With a zone id and no offset, the zone rules apply as in Neo4j
|
|
123
|
+
* (v2.5.3): a wall time inside a DST gap moves later by the gap, an
|
|
124
|
+
* ambiguous one takes the earlier offset, and historical (local mean
|
|
125
|
+
* time) offsets are honoured for any year.
|
|
126
|
+
*
|
|
81
127
|
* Before v2.4.8 the value was converted to UTC with the offset dropped
|
|
82
128
|
* and the fraction cut to milliseconds; before v2.5.0 an offset-less
|
|
83
129
|
* string was read in the machine's local zone.
|
|
@@ -88,19 +134,28 @@ class Neo4jRecordFactory {
|
|
|
88
134
|
// pre-v2.5.0 parse.
|
|
89
135
|
if (!m)
|
|
90
136
|
return Neo4jRecordFactory.legacyDateTime(isoString);
|
|
91
|
-
const [,
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
137
|
+
const [, ey, emo, ed, by, bmo, bd, h, mi, s, frac, offset, zoneId] = m;
|
|
138
|
+
let year = Number(ey ?? by);
|
|
139
|
+
let month = Number(emo ?? bmo);
|
|
140
|
+
let day = Number(ed ?? bd);
|
|
141
|
+
let hour = Number(h ?? 0);
|
|
142
|
+
let minute = Number(mi ?? 0);
|
|
143
|
+
let second = Number(s ?? 0);
|
|
98
144
|
const nanosecond = frac ? Number(frac.padEnd(9, '0')) : 0;
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
145
|
+
let offsetSeconds = 0;
|
|
146
|
+
if (offset !== undefined)
|
|
147
|
+
offsetSeconds = parseOffsetSeconds(offset);
|
|
148
|
+
else if (zoneId !== undefined) {
|
|
149
|
+
const resolved = resolveZoned(zoneId, utcMs(year, month, day, hour, minute, second));
|
|
150
|
+
offsetSeconds = resolved.offsetSeconds;
|
|
151
|
+
const w = new Date(resolved.wallMs);
|
|
152
|
+
year = w.getUTCFullYear();
|
|
153
|
+
month = w.getUTCMonth() + 1;
|
|
154
|
+
day = w.getUTCDate();
|
|
155
|
+
hour = w.getUTCHours();
|
|
156
|
+
minute = w.getUTCMinutes();
|
|
157
|
+
second = w.getUTCSeconds();
|
|
158
|
+
}
|
|
104
159
|
return new neo4j_driver_1.default.types.DateTime(year, month, day, hour, minute, second, nanosecond, offsetSeconds, zoneId);
|
|
105
160
|
}
|
|
106
161
|
/** The pre-v2.5.0 parse: through `Date`, in UTC, millisecond precision. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neo4j-record-factory.js","sourceRoot":"","sources":["../../../src/testing/neo4j-record-factory.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAqE;AAErE
|
|
1
|
+
{"version":3,"file":"neo4j-record-factory.js","sourceRoot":"","sources":["../../../src/testing/neo4j-record-factory.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAqE;AAErE;;;;;;;GAOG;AACH,MAAM,aAAa,GACjB,qKAAqK,CAAC;AAExK,SAAS,kBAAkB,CAAC,MAAc;IACxC,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG;QAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,qEAAqE;IACrE,wBAAwB;IACxB,OAAO,IAAI,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,SAAS,KAAK,CACZ,IAAY,EACZ,KAAa,EACb,GAAW,EACX,IAAY,EACZ,MAAc,EACd,MAAc;IAEd,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,4DAA4D;AAC5D,SAAS,YAAY,CAAC,QAAgB,EAAE,SAAiB;IACvD,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAC3C,QAAQ;QACR,SAAS,EAAE,KAAK;QAChB,GAAG,EAAE,OAAO;QACZ,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;IACH,MAAM,CAAC,GAA2B,EAAE,CAAC;IACrC,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;YAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aAClE,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,4CAA4C;IAC5C,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,YAAY,CACnB,QAAgB,EAChB,MAAc;IAEd,MAAM,GAAG,GAAG,QAAU,CAAC;IACvB,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS;QACjC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;QACpC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;QACpC,KAAK;QACL,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;KAC9C,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CACvD,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3E,wEAAwE;IACxE,MAAM,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC;IACxD,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,EAAE,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAa,kBAAkB;IAC7B;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,IAA6B;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,IAAI,sBAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAA2B,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAa;QAC1B,OAAO,sBAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,QAAQ,CAAC,SAAiB;QAC/B,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,gEAAgE;QAChE,oBAAoB;QACpB,IAAI,CAAC,CAAC;YAAE,OAAO,kBAAkB,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAE5D,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACvE,IAAI,IAAI,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5B,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QAC/B,IAAI,GAAG,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3B,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1B,IAAI,MAAM,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7B,IAAI,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1D,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,MAAM,KAAK,SAAS;YAAE,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;aAChE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,YAAY,CAC3B,MAAM,EACN,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAC9C,CAAC;YACF,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;YACvC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;YAC1B,KAAK,GAAG,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAC5B,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YACvB,MAAM,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;YAC3B,MAAM,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;QAED,OAAO,IAAI,sBAAK,CAAC,KAAK,CAAC,QAAQ,CAC7B,IAAI,EACJ,KAAK,EACL,GAAG,EACH,IAAI,EACJ,MAAM,EACN,MAAM,EACN,UAAU,EACV,aAAa,EACb,MAAM,CACP,CAAC;IACJ,CAAC;IAED,2EAA2E;IACnE,MAAM,CAAC,cAAc,CAAC,SAAiB;QAC7C,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,wEAAwE;QACxE,6BAA6B;QAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,IAAI,SAAS,CACjB,iCAAiC,SAAS,gCAAgC,CAC3E,CAAC;QACJ,OAAO,IAAI,sBAAK,CAAC,KAAK,CAAC,QAAQ,CAC7B,CAAC,CAAC,cAAc,EAAE,EAClB,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,EACnB,CAAC,CAAC,UAAU,EAAE,EACd,CAAC,CAAC,WAAW,EAAE,EACf,CAAC,CAAC,aAAa,EAAE,EACjB,CAAC,CAAC,aAAa,EAAE,EACjB,CAAC,CAAC,kBAAkB,EAAE,GAAG,OAAS,EAClC,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,IAAI,CACT,MAAgB,EAChB,UAAmC,EACnC,UAA+D,EAAE;QAEjE,MAAM,QAAQ,GAAG,sBAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;QAClD,OAAO,IAAI,sBAAK,CAAC,KAAK,CAAC,IAAI,CACzB,QAAQ,EACR,MAAM,EACN,UAAU,EACV,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,EAAE,CACzC,CAAC;IACJ,CAAC;CACF;AAnID,gDAmIC"}
|
|
@@ -20,7 +20,15 @@ export declare function buildCypherFieldCall(statement: string, nodeVar: string,
|
|
|
20
20
|
* implementer's field selected through an inline fragment on an
|
|
21
21
|
* abstract type). Other rows still keep their row, with `null`.
|
|
22
22
|
*/
|
|
23
|
-
guardLabel?: string
|
|
23
|
+
guardLabel?: string,
|
|
24
|
+
/**
|
|
25
|
+
* v2.5.3 — name the reduced column with this (unique) alias instead of
|
|
26
|
+
* `columnName`. Pre-2.5.3 the CALL returned `AS <columnName>` and the
|
|
27
|
+
* caller renamed it in a following WITH, so a `columnName` equal to a
|
|
28
|
+
* variable already in scope (`n`, `score`, `__typename`) failed the
|
|
29
|
+
* query with "Variable already declared".
|
|
30
|
+
*/
|
|
31
|
+
outputAlias?: string): string;
|
|
24
32
|
/**
|
|
25
33
|
* Builds an inline `head(COLLECT { ... })` subquery expression for a
|
|
26
34
|
* `@cypher` scalar field. Used inside contexts where a CALL prelude cannot
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cypher-field-projection.d.ts","sourceRoot":"","sources":["../../../src/utils/cypher-field-projection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG1D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM;AAClB;;;;GAIG;AACH,UAAU,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cypher-field-projection.d.ts","sourceRoot":"","sources":["../../../src/utils/cypher-field-projection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG1D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM;AAClB;;;;GAIG;AACH,UAAU,CAAC,EAAE,MAAM;AACnB;;;;;;GAMG;AACH,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CA0BR;AAQD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM;AACf;;;GAGG;AACH,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAIR;AAkBD;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,IAAI,CASN;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAgB;IAWzB,sEAAsE;IACtE,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAAC,cAAc;IAfjC;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;;IAG7C,sEAAsE;IACrD,OAAO,EAAE,MAAM;IAChC,2DAA2D;IAC1C,YAAY,GAAE,aAAa,CAAC,MAAM,CAAM;IACzD,4DAA4D;IAC3C,cAAc,GAAE,MAAe;IAKlD;;;;;;OAMG;IACH,QAAQ,CACN,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,kBAAkB;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM;IA4CT,+CAA+C;IAC/C,MAAM,IAAI,OAAO;IAIjB,sEAAsE;IACtE,IAAI,IAAI,MAAM,EAAE;IAIhB,wDAAwD;IACxD,OAAO,IAAI,MAAM,EAAE;IAInB,0CAA0C;IAC1C,UAAU,IAAI,MAAM;CAGrB"}
|
|
@@ -27,23 +27,46 @@ function buildCypherFieldCall(statement, nodeVar, columnName,
|
|
|
27
27
|
* implementer's field selected through an inline fragment on an
|
|
28
28
|
* abstract type). Other rows still keep their row, with `null`.
|
|
29
29
|
*/
|
|
30
|
-
guardLabel
|
|
30
|
+
guardLabel,
|
|
31
|
+
/**
|
|
32
|
+
* v2.5.3 — name the reduced column with this (unique) alias instead of
|
|
33
|
+
* `columnName`. Pre-2.5.3 the CALL returned `AS <columnName>` and the
|
|
34
|
+
* caller renamed it in a following WITH, so a `columnName` equal to a
|
|
35
|
+
* variable already in scope (`n`, `score`, `__typename`) failed the
|
|
36
|
+
* query with "Variable already declared".
|
|
37
|
+
*/
|
|
38
|
+
outputAlias) {
|
|
31
39
|
const col = (0, validation_1.escapeIdentifier)(columnName);
|
|
40
|
+
if (outputAlias !== undefined)
|
|
41
|
+
(0, validation_1.assertSafeIdentifier)(outputAlias, '@cypher alias');
|
|
42
|
+
const out = outputAlias ?? col;
|
|
43
|
+
// v2.5.3 — a statement that returns a column named like the node
|
|
44
|
+
// variable (`RETURN this.rank AS n`) would redeclare it when the inner
|
|
45
|
+
// CALL hands its columns back. Rebind the node to a private name first
|
|
46
|
+
// (only then, so every other statement's Cypher is unchanged).
|
|
47
|
+
const shadows = mentionsIdentifier(statement, nodeVar);
|
|
48
|
+
const inner = shadows ? `${nodeVar}__cf_this` : nodeVar;
|
|
32
49
|
return [
|
|
33
50
|
`CALL {`,
|
|
34
51
|
` WITH ${nodeVar}`,
|
|
52
|
+
...(shadows ? [` WITH ${nodeVar} AS ${inner}`] : []),
|
|
35
53
|
...(guardLabel !== undefined
|
|
36
|
-
? [` WITH ${
|
|
54
|
+
? [` WITH ${inner} WHERE ${inner}:${(0, validation_1.escapeIdentifier)(guardLabel)}`]
|
|
37
55
|
: []),
|
|
38
56
|
` CALL {`,
|
|
39
|
-
` WITH ${
|
|
40
|
-
` WITH ${
|
|
57
|
+
` WITH ${inner}`,
|
|
58
|
+
` WITH ${inner} AS this`,
|
|
41
59
|
` ${statement}`,
|
|
42
60
|
` }`,
|
|
43
|
-
` RETURN head(collect(${col})) AS ${
|
|
61
|
+
` RETURN head(collect(${col})) AS ${out}`,
|
|
44
62
|
`}`,
|
|
45
63
|
].join('\n');
|
|
46
64
|
}
|
|
65
|
+
/** Whether `name` appears in `cypher` as a standalone identifier token. */
|
|
66
|
+
function mentionsIdentifier(cypher, name) {
|
|
67
|
+
const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
68
|
+
return new RegExp(`(?<![\\w.$])\`?${escaped}\`?(?![\\w])`).test(cypher);
|
|
69
|
+
}
|
|
47
70
|
/**
|
|
48
71
|
* Builds an inline `head(COLLECT { ... })` subquery expression for a
|
|
49
72
|
* `@cypher` scalar field. Used inside contexts where a CALL prelude cannot
|
|
@@ -73,7 +96,14 @@ fieldLabel) {
|
|
|
73
96
|
* Cypher's aggregating functions, as a call (`count(`, not the `COUNT {`
|
|
74
97
|
* subquery expression, which does not aggregate the enclosing query).
|
|
75
98
|
*/
|
|
76
|
-
const AGGREGATING_CALL =
|
|
99
|
+
const AGGREGATING_CALL = /(?<![\w.$`])(?:avg|collect|count|max|min|percentileCont|percentileDisc|stDev|stDevP|sum)\s*\(/i;
|
|
100
|
+
/**
|
|
101
|
+
* v2.5.3 — string literals and comments, blanked before the aggregation
|
|
102
|
+
* test: pre-2.5.3 `RETURN 'count(' + this.x AS c` was refused. A name
|
|
103
|
+
* qualified with `.` (`apoc.coll.max(`) is not an aggregating call either
|
|
104
|
+
* (see the lookbehind above).
|
|
105
|
+
*/
|
|
106
|
+
const LITERALS_AND_COMMENTS = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`[^`]*`|\/\/[^\n]*|\/\*[\s\S]*?\*\//g;
|
|
77
107
|
/**
|
|
78
108
|
* Refuse an aggregating `@cypher` statement where it would be projected
|
|
79
109
|
* inline (v2.4.8). Neo4j 5 rejects ANY aggregating subquery expression
|
|
@@ -86,7 +116,7 @@ const AGGREGATING_CALL = /\b(?:avg|collect|count|max|min|percentileCont|percenti
|
|
|
86
116
|
* CALL-prelude projection is unaffected and keeps working.
|
|
87
117
|
*/
|
|
88
118
|
function assertInlineableCypherField(fieldLabel, statement) {
|
|
89
|
-
if (!AGGREGATING_CALL.test(statement))
|
|
119
|
+
if (!AGGREGATING_CALL.test(statement.replace(LITERALS_AND_COMMENTS, "''")))
|
|
90
120
|
return;
|
|
91
121
|
throw new errors_1.OGMError(`@cypher field "${fieldLabel}" aggregates in its statement, so it can only be selected at the top level of a query. ` +
|
|
92
122
|
`Neo4j 5 rejects aggregating subqueries nested inside a projection ("Aggregation column contains implicit grouping expressions"), ` +
|
|
@@ -161,8 +191,8 @@ class CypherFieldScope {
|
|
|
161
191
|
(0, validation_1.assertSafeIdentifier)(alias, '@cypher alias');
|
|
162
192
|
const carry = [...this.preserveVars, ...this.carriedAliases];
|
|
163
193
|
const carryStr = carry.length ? `, ${carry.join(', ')}` : '';
|
|
164
|
-
this.callLines.push(buildCypherFieldCall(propDef.cypherStatement, this.nodeVar, columnName, guardLabel));
|
|
165
|
-
this.callLines.push(`WITH ${this.nodeVar}${carryStr}, ${
|
|
194
|
+
this.callLines.push(buildCypherFieldCall(propDef.cypherStatement, this.nodeVar, columnName, guardLabel, alias));
|
|
195
|
+
this.callLines.push(`WITH ${this.nodeVar}${carryStr}, ${alias}`);
|
|
166
196
|
this.carriedAliases.push(alias);
|
|
167
197
|
this.aliases.set(key, alias);
|
|
168
198
|
return alias;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cypher-field-projection.js","sourceRoot":"","sources":["../../../src/utils/cypher-field-projection.ts"],"names":[],"mappings":";;;AAmBA,
|
|
1
|
+
{"version":3,"file":"cypher-field-projection.js","sourceRoot":"","sources":["../../../src/utils/cypher-field-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,11 +6,13 @@ import type { PropertyDefinition } from '../schema/types';
|
|
|
6
6
|
* no rows sorts with `null` instead of vanishing, and one returning
|
|
7
7
|
* several rows sorts once.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* With `outputAlias` (v2.5.3) the column comes out under that unique
|
|
10
|
+
* alias (e.g. `__sort_<fieldName>`); the caller follows the CALL with its
|
|
11
|
+
* own `WITH` to carry it forward with any prior sort aliases.
|
|
12
12
|
*/
|
|
13
|
-
export declare function buildCypherSortProjection(statement: string, nodeVar: string, columnName: string
|
|
13
|
+
export declare function buildCypherSortProjection(statement: string, nodeVar: string, columnName: string,
|
|
14
|
+
/** v2.5.3 — see `buildCypherFieldCall`'s `outputAlias`. */
|
|
15
|
+
outputAlias?: string): string;
|
|
14
16
|
/**
|
|
15
17
|
* Compiles a `sort` array (mixed stored-field + `@cypher`-field entries)
|
|
16
18
|
* into the Cypher fragments needed before and after the `RETURN` clause.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cypher-sort-projection.d.ts","sourceRoot":"","sources":["../../../src/utils/cypher-sort-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAU1D;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cypher-sort-projection.d.ts","sourceRoot":"","sources":["../../../src/utils/cypher-sort-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAU1D;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM;AAClB,2DAA2D;AAC3D,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAQR;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IAClE,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACtC,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAmDnC;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5D"}
|
|
@@ -12,12 +12,14 @@ const validation_1 = require("./validation");
|
|
|
12
12
|
* no rows sorts with `null` instead of vanishing, and one returning
|
|
13
13
|
* several rows sorts once.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* With `outputAlias` (v2.5.3) the column comes out under that unique
|
|
16
|
+
* alias (e.g. `__sort_<fieldName>`); the caller follows the CALL with its
|
|
17
|
+
* own `WITH` to carry it forward with any prior sort aliases.
|
|
18
18
|
*/
|
|
19
|
-
function buildCypherSortProjection(statement, nodeVar, columnName
|
|
20
|
-
|
|
19
|
+
function buildCypherSortProjection(statement, nodeVar, columnName,
|
|
20
|
+
/** v2.5.3 — see `buildCypherFieldCall`'s `outputAlias`. */
|
|
21
|
+
outputAlias) {
|
|
22
|
+
return (0, cypher_field_projection_1.buildCypherFieldCall)(statement, nodeVar, columnName, undefined, outputAlias);
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* Compiles a `sort` array (mixed stored-field + `@cypher`-field entries)
|
|
@@ -62,10 +64,10 @@ function compileSortClause(args) {
|
|
|
62
64
|
const alias = `__sort_${field}`;
|
|
63
65
|
const columnName = propDef.cypherColumnName ?? field;
|
|
64
66
|
(0, validation_1.assertSafeIdentifier)(columnName, '@cypher columnName');
|
|
65
|
-
preLines.push(buildCypherSortProjection(propDef.cypherStatement, nodeVar, columnName));
|
|
67
|
+
preLines.push(buildCypherSortProjection(propDef.cypherStatement, nodeVar, columnName, alias));
|
|
66
68
|
const carry = [...preserveVars, ...carriedAliases];
|
|
67
69
|
const carryStr = carry.length ? `, ${carry.join(', ')}` : '';
|
|
68
|
-
preLines.push(`WITH ${nodeVar}${carryStr}, ${
|
|
70
|
+
preLines.push(`WITH ${nodeVar}${carryStr}, ${alias}`);
|
|
69
71
|
carriedAliases.push(alias);
|
|
70
72
|
sortItems.push(`${alias} ${validDirection}`);
|
|
71
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cypher-sort-projection.js","sourceRoot":"","sources":["../../../src/utils/cypher-sort-projection.ts"],"names":[],"mappings":";;AAqBA,
|
|
1
|
+
{"version":3,"file":"cypher-sort-projection.js","sourceRoot":"","sources":["../../../src/utils/cypher-sort-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-coercion.d.ts","sourceRoot":"","sources":["../../../src/utils/write-coercion.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAkI1D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,kBAAkB,GAAG,SAAS,GACtC,OAAO,CAWT;AAqCD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,kBAAkB,GAAG,SAAS,GACtC,MAAM,CAWR;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EAAE,EACjB,OAAO,EAAE,kBAAkB,GAAG,SAAS,GACtC,MAAM,CAwBR;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvC,MAAM,EAAE,MAAM,GACb,MAAM,CA8BR;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvC,MAAM,EAAE,MAAM,GACb,OAAO,
|
|
1
|
+
{"version":3,"file":"write-coercion.d.ts","sourceRoot":"","sources":["../../../src/utils/write-coercion.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAkI1D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,kBAAkB,GAAG,SAAS,GACtC,OAAO,CAWT;AAqCD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,kBAAkB,GAAG,SAAS,GACtC,MAAM,CAWR;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EAAE,EACjB,OAAO,EAAE,kBAAkB,GAAG,SAAS,GACtC,MAAM,CAwBR;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvC,MAAM,EAAE,MAAM,GACb,MAAM,CA8BR;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvC,MAAM,EAAE,MAAM,GACb,OAAO,CAuBT;AAqBD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAQ7E"}
|
|
@@ -301,7 +301,18 @@ function coerceWhereValue(value, propDef, suffix) {
|
|
|
301
301
|
return value;
|
|
302
302
|
if (!COMPARABLE_SUFFIXES.has(suffix))
|
|
303
303
|
return value;
|
|
304
|
-
const
|
|
304
|
+
const isIn = suffix === '_IN' || suffix === '_NOT_IN';
|
|
305
|
+
// v2.5.3 — `_IN` / `_NOT_IN` on a LIST field take a list of lists: coerce
|
|
306
|
+
// two levels deep. Pre-2.5.3 the inner lists reached coerceWhereElement,
|
|
307
|
+
// which returns arrays unchanged, so BigInt strings and Dates inside them
|
|
308
|
+
// were bound raw and silently matched nothing.
|
|
309
|
+
if (isIn && propDef.isArray)
|
|
310
|
+
return Array.isArray(value)
|
|
311
|
+
? value.map((inner) => Array.isArray(inner)
|
|
312
|
+
? inner.map((element) => coerceWhereElement(element, propDef))
|
|
313
|
+
: inner)
|
|
314
|
+
: value;
|
|
315
|
+
const elementWise = isIn || propDef.isArray;
|
|
305
316
|
if (elementWise)
|
|
306
317
|
return Array.isArray(value)
|
|
307
318
|
? value.map((element) => coerceWhereElement(element, propDef))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-coercion.js","sourceRoot":"","sources":["../../../src/utils/write-coercion.ts"],"names":[],"mappings":";;AAwJA,4CAcC;AAiDD,sCAeC;AASD,4CA4BC;AAUD,wCAmCC;AAmBD,
|
|
1
|
+
{"version":3,"file":"write-coercion.js","sourceRoot":"","sources":["../../../src/utils/write-coercion.ts"],"names":[],"mappings":";;AAwJA,4CAcC;AAiDD,sCAeC;AASD,4CA4BC;AAUD,wCAmCC;AAmBD,4CA2BC;AA6BD,4DAQC;AA3YD,+CAAmD;AACnD,sCAAqC;AAGrC;;GAEG;AACH,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,qBAAqB,GAA2B;IACpD,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,eAAe;IAC9B,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,EAAE;IACF,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,SAAS;CACV,CAAC,CAAC;AAqBH,SAAS,qBAAqB,CAAC,KAAc;IAC3C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,IAAI,IAAA,sBAAO,EAAC,KAAK,CAAC,IAAI,IAAA,oBAAK,EAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACjD,MAAM,SAAS,GAAG,KAAgC,CAAC;IACnD,MAAM,SAAS,GACb,OAAO,SAAS,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,CAAC,KAAK,QAAQ,CAAC;IACrE,MAAM,UAAU,GACd,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ;QACvC,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC;IACzC,OAAO,SAAS,IAAI,UAAU,CAAC;AACjC,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAA2B;IAE3B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,QAAQ,KAAK,SAAS;QACxB,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC1E,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QACtC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACrE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CACzB,QAAmB,EACnB,IAAsB,EACtB,OAA2B;IAE3B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,SAAS,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9D,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,OAAO,KAAK,OAAO,CAAC,MAAM;QAC5B,MAAM,IAAI,iBAAQ,CAChB,mCAAmC,OAAO,CAAC,IAAI,WAAW,OAAO,CAAC,IAAI,KAAK;YACzE,yBAAyB,IAAI,CAAC,EAAE,8CAA8C;YAC9E,GAAG,IAAI,CAAC,EAAE,kEAAkE;YAC5E,mCAAmC,CACtC,CAAC;IACJ,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,gBAAgB,CAC9B,KAAc,EACd,OAAuC;IAEvC,IAAI,OAAO,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAChE,OAAO,KAAK,CAAC;IACf,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAE1D,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACxC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAc,EACd,OAA2B;IAE3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxD,qEAAqE;IACrE,wEAAwE;IACxE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAA,kBAAG,EAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YAC1B,MAAM,IAAI,iBAAQ,CAChB,2BAA2B,OAAO,CAAC,IAAI,WAAW,OAAO,CAAC,IAAI,aAAa,KAAK,IAAI;gBAClF,4EAA4E;gBAC5E,kCAAkC,CACrC,CAAC;QACJ,OAAO,IAAA,kBAAG,EAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,sEAAsE;QACtE,qEAAqE;QACrE,kEAAkE;QAClE,mEAAmE;QACnE,8CAA8C;QAC9C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;YACxB,MAAM,IAAI,iBAAQ,CAChB,2BAA2B,OAAO,CAAC,IAAI,WAAW,OAAO,CAAC,IAAI,yBAAyB,KAAK,KAAK;gBAC/F,qEAAqE,CACxE,CAAC;QACJ,OAAO,IAAA,kBAAG,EAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,qDAAqD;IACrD,IAAI,IAAA,oBAAK,EAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,aAAa,CAC3B,IAAY,EACZ,KAAc,EACd,OAAuC;IAEvC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3D,OAAO,YAAY,IAAI,MAAM,IAAI,CAAC,EAAE,SAAS,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,CAAC;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC9B,IAAY,EACZ,MAAiB,EACjB,OAAuC;IAEvC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,MAAM;aACrB,MAAM,CAAC,CAAC,CAAC,EAAkB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;aAC/C,IAAI,EAAE,CAAC;QACV,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/D,OAAO,YAAY,IAAI,MAAM,IAAI,CAAC,EAAE,SAAS,CAAC;IAChD,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;IACpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5D,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,OAAO,KAAK,OAAO,CAAC,MAAM;QAC5B,MAAM,IAAI,iBAAQ,CAChB,yBAAyB,OAAO,CAAC,IAAI,WAAW,OAAO,CAAC,IAAI,qBAAqB;YAC/E,SAAS,IAAI,CAAC,EAAE,8DAA8D;YAC9E,yEAAyE;YACzE,iBAAiB,CACpB,CAAC;IACJ,OAAO,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,CAAC;AAC/B,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,cAAc,CAC5B,QAAgB,EAChB,KAAc,EACd,OAAuC,EACvC,MAAc;IAEd,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC3C,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACxC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,CAAC;IACtD,wEAAwE;IACxE,sEAAsE;IACtE,sEAAsE;IACtE,sEAAsE;IACtE,qDAAqD;IACrD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QAC3C,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7C,MAAM,SAAS,GAAG,KAAK;iBACpB,MAAM,CAAC,CAAC,CAAC,EAAkB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iBAC/C,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC;gBAAE,OAAO,QAAQ,CAAC;YACnE,OAAO,YAAY,QAAQ,sBAAsB,IAAI,CAAC,EAAE,UAAU,CAAC;QACrE,CAAC;QACD,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,QAAQ,CAAC;QACxD,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;YAAE,OAAO,QAAQ,CAAC;QAC/D,OAAO,YAAY,QAAQ,MAAM,IAAI,CAAC,EAAE,SAAS,CAAC;IACpD,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QAC3C,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;YAAE,OAAO,QAAQ,CAAC;QAC/D,OAAO,YAAY,QAAQ,MAAM,IAAI,CAAC,EAAE,SAAS,CAAC;IACpD,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACxC,OAAO,GAAG,IAAI,CAAC,EAAE,IAAI,QAAQ,GAAG,CAAC;AACnC,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,gBAAgB,CAC9B,KAAc,EACd,OAAuC,EACvC,MAAc;IAEd,IAAI,OAAO,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAChE,OAAO,KAAK,CAAC;IACf,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,IAAI,GAAG,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,SAAS,CAAC;IACtD,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,+CAA+C;IAC/C,IAAI,IAAI,IAAI,OAAO,CAAC,OAAO;QACzB,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACzB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAClB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAClB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC9D,CAAC,CAAC,KAAK,CACV;YACH,CAAC,CAAC,KAAK,CAAC;IACZ,MAAM,WAAW,GAAG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAC5C,IAAI,WAAW;QACb,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACzB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9D,CAAC,CAAC,KAAK,CAAC;IACZ,OAAO,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAc,EACd,OAA2B;IAE3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxD,IAAI,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YAC3D,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC;YACtC,CAAC,CAAC,KAAK,CAAC;IACZ,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QACzD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,iBAAQ,CAChB,0CAA0C,OAAO,CAAC,IAAI,sBAAsB,CAC7E,CAAC;QACJ,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,wBAAwB,CAAC,OAA2B;IAClE,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;IACjC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,sEAAsE;IACtE,wBAAwB;IACxB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QACpB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,OAAO,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,oBAAoB,CAC3B,GAAW,EACX,OAA2B;IAE3B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,GAAG,KAAK,MAAM,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,KAAK,KAAK,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5C;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -54,6 +54,17 @@ export declare class MutationCompiler {
|
|
|
54
54
|
* from the same counter).
|
|
55
55
|
*/
|
|
56
56
|
private buildTargetPolicyPredicate;
|
|
57
|
+
/**
|
|
58
|
+
* v2.5.2 — a connect / disconnect nested in a connect / disconnect item
|
|
59
|
+
* writes the INTERMEDIATE node's own relationships, which the direct
|
|
60
|
+
* equivalent (`Intermediate.update({ connect | disconnect })`) only allows
|
|
61
|
+
* under its `update` policy. Pre-2.5.2 the intermediate was gated by
|
|
62
|
+
* `read` alone, so a context that could merely see a node could link and
|
|
63
|
+
* unlink its relationships. Inside the item's CALL this filters the row
|
|
64
|
+
* before the nested ops; the outer link / unlink still needs `read` only,
|
|
65
|
+
* and `count(*)` keeps one row per node. No policies → no lines.
|
|
66
|
+
*/
|
|
67
|
+
private gateOnUpdate;
|
|
57
68
|
private getPolicyWhereCompiler;
|
|
58
69
|
/**
|
|
59
70
|
* Compile a nested-write `where` (connect, disconnect, nested update,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutation.compiler.d.ts","sourceRoot":"","sources":["../../../src/compilers/mutation.compiler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,cAAc,EAGd,cAAc,EACf,MAAM,iBAAiB,CAAC;AAqBzB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AA4DD;;GAEG;AACH,qBAAa,gBAAgB;IAmBzB,OAAO,CAAC,MAAM;IAlBhB;;;OAGG;IACH,OAAO,CAAC,UAAU,CAA6B;IAE/C,OAAO,CAAC,MAAM,CAAC,CAAY;IAE3B;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB,CAAC,CAAgB;gBAGlC,MAAM,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,SAAS,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE;IAMjE;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,OAAO,CAAC,0BAA0B;IAuDlC,OAAO,CAAC,sBAAsB;IAU9B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,yBAAyB;IA+BjC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAQxB,8EAA8E;IAC9E,WAAW,IAAI,IAAI;IAInB,OAAO,CAAC,oBAAoB;IAQ5B;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAqBnB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IASxB;;;OAGG;IACH,aAAa,CACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACjC,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,MAAM,EAAE;IACjB;;;;OAIG;IACH,aAAa,CAAC,EAAE,mBAAmB;IACnC;;;OAGG;IACH,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAC/B,cAAc;IA+DjB;;OAEG;IACH,aAAa,CACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC5C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC/C,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,EACD,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,UAAU,GAAE,MAAM,GAAG,OAAgB;IACrC;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,mBAAmB;IACnC;;;;OAIG;IACH,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAC/B,cAAc;IAsFjB;;;;;;;;OAQG;IACH,aAAa,CACX,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,EACD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrC,+DAA+D;IAC/D,aAAa,CAAC,EAAE,mBAAmB;IACnC,gEAAgE;IAChE,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAC/B,cAAc;IA+CjB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,iBAAiB;IAqFzB;;;OAGG;IACH,YAAY,CACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,cAAc;IA2HjB;;OAEG;IACH,gBAAgB,CACd,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,EACD,SAAS,CAAC,EAAE,MAAM,EAAE,EACpB,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,cAAc;IA2CjB;;;;OAIG;IACH,iBAAiB,CACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,OAAO,EACxB,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,cAAc;
|
|
1
|
+
{"version":3,"file":"mutation.compiler.d.ts","sourceRoot":"","sources":["../../../src/compilers/mutation.compiler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,cAAc,EAGd,cAAc,EACf,MAAM,iBAAiB,CAAC;AAqBzB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AA4DD;;GAEG;AACH,qBAAa,gBAAgB;IAmBzB,OAAO,CAAC,MAAM;IAlBhB;;;OAGG;IACH,OAAO,CAAC,UAAU,CAA6B;IAE/C,OAAO,CAAC,MAAM,CAAC,CAAY;IAE3B;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB,CAAC,CAAgB;gBAGlC,MAAM,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,SAAS,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE;IAMjE;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,OAAO,CAAC,0BAA0B;IAuDlC;;;;;;;;;OASG;IACH,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,sBAAsB;IAU9B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,yBAAyB;IA+BjC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAQxB,8EAA8E;IAC9E,WAAW,IAAI,IAAI;IAInB,OAAO,CAAC,oBAAoB;IAQ5B;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAqBnB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IASxB;;;OAGG;IACH,aAAa,CACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACjC,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,MAAM,EAAE;IACjB;;;;OAIG;IACH,aAAa,CAAC,EAAE,mBAAmB;IACnC;;;OAGG;IACH,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAC/B,cAAc;IA+DjB;;OAEG;IACH,aAAa,CACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC5C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC/C,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,EACD,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,UAAU,GAAE,MAAM,GAAG,OAAgB;IACrC;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,mBAAmB;IACnC;;;;OAIG;IACH,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAC/B,cAAc;IAsFjB;;;;;;;;OAQG;IACH,aAAa,CACX,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,EACD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrC,+DAA+D;IAC/D,aAAa,CAAC,EAAE,mBAAmB;IACnC,gEAAgE;IAChE,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAC/B,cAAc;IA+CjB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,iBAAiB;IAqFzB;;;OAGG;IACH,YAAY,CACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,cAAc;IA2HjB;;OAEG;IACH,gBAAgB,CACd,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,EACD,SAAS,CAAC,EAAE,MAAM,EAAE,EACpB,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,cAAc;IA2CjB;;;;OAIG;IACH,iBAAiB,CACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,OAAO,EACxB,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,cAAc;IAsLjB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,qBAAqB;IA4C7B,OAAO,CAAC,wBAAwB;IAgFhC;;;OAGG;IACH,OAAO,CAAC,iCAAiC;IA6KzC;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IAyDrB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA0LxB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,gBAAgB;IA+IxB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAsDxB;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IA+C7B,yEAAyE;IACzE,OAAO,CAAC,mBAAmB;IAoI3B;;;;;OAKG;IACH,OAAO,CAAC,eAAe,CAAyC;IAEhE,OAAO,CAAC,cAAc;IAStB,0EAA0E;IAC1E,OAAO,CAAC,kBAAkB;IAO1B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IA4C9B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IA4fhC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAcvC;IAEF;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,6BAA6B;IAkCrC,OAAO,CAAC,qBAAqB;CAQ9B;AAoBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiDzB;AAED,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,GACrB,cAAc,GAAG,IAAI,CAiBvB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,GAChB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAyB5B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,GAChB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAenC"}
|
|
@@ -123,6 +123,20 @@ export class MutationCompiler {
|
|
|
123
123
|
mergeParams(params, clause.params);
|
|
124
124
|
return clause.cypher;
|
|
125
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* v2.5.2 — a connect / disconnect nested in a connect / disconnect item
|
|
128
|
+
* writes the INTERMEDIATE node's own relationships, which the direct
|
|
129
|
+
* equivalent (`Intermediate.update({ connect | disconnect })`) only allows
|
|
130
|
+
* under its `update` policy. Pre-2.5.2 the intermediate was gated by
|
|
131
|
+
* `read` alone, so a context that could merely see a node could link and
|
|
132
|
+
* unlink its relationships. Inside the item's CALL this filters the row
|
|
133
|
+
* before the nested ops; the outer link / unlink still needs `read` only,
|
|
134
|
+
* and `count(*)` keeps one row per node. No policies → no lines.
|
|
135
|
+
*/
|
|
136
|
+
gateOnUpdate(withClause, targetNodeDef, targetVar, params, policyContext, paramCounter) {
|
|
137
|
+
const predicate = this.buildTargetPolicyPredicate(targetNodeDef, targetVar, params, policyContext, paramCounter, 'update');
|
|
138
|
+
return predicate ? [withClause, `WHERE ${predicate}`] : [];
|
|
139
|
+
}
|
|
126
140
|
getPolicyWhereCompiler() {
|
|
127
141
|
// Inherit the logger: since v2.3.0 this compiler also compiles every
|
|
128
142
|
// nested-write `where`, and its empty-AND/OR warnings must surface.
|
|
@@ -696,6 +710,10 @@ export class MutationCompiler {
|
|
|
696
710
|
// v2.5.0 — rejected in EVERY item. Pre-2.5.0 only the first item's
|
|
697
711
|
// relationship fields were; in later items the nested input was
|
|
698
712
|
// skipped unwritten.
|
|
713
|
+
// v2.5.3 — a `null` relationship field means "no nested write" and
|
|
714
|
+
// is skipped, as upsert does. Pre-2.5.3 it threw.
|
|
715
|
+
if (nodeDef.relationships.has(key) && item[key] === null)
|
|
716
|
+
continue;
|
|
699
717
|
if (nodeDef.relationships.has(key))
|
|
700
718
|
throw new OGMError(`createMany does not support relationship fields. Found: "${key}" in data[${index}]. Use create() for nested operations.`);
|
|
701
719
|
assertSafePropertyName(key, 'createMany property');
|
|
@@ -1266,6 +1284,7 @@ export class MutationCompiler {
|
|
|
1266
1284
|
throw new OGMError(`A nested "connect" inside a connect on "${relDef.fieldName}" (abstract type "${targetNodeDef.typeName}") ` +
|
|
1267
1285
|
`must be keyed by the implementing type, e.g. { ${relDef.fieldName}: { Member: [{ where, connect }] } }.`);
|
|
1268
1286
|
const inner = nestedScope(a.scope.carryVars, connectVar, a.scope.depth, a.edgeParamPrefix);
|
|
1287
|
+
lines.push(...this.gateOnUpdate(inner.withClause, targetNodeDef, connectVar, a.params, a.policyContext, a.paramCounter));
|
|
1269
1288
|
for (const nestedConnect of Array.isArray(nested) ? nested : [nested]) {
|
|
1270
1289
|
if (!isPlainObject(nestedConnect))
|
|
1271
1290
|
throw new OGMError(`A nested "connect" inside a connect on "${relDef.fieldName}" must be an object keyed by relationship.`);
|
|
@@ -1317,7 +1336,7 @@ export class MutationCompiler {
|
|
|
1317
1336
|
throw new OGMError(`A nested "disconnect" inside a disconnect on "${relDef.fieldName}" (abstract type "${targetNodeDef.typeName}") ` +
|
|
1318
1337
|
`must be keyed by the implementing type, e.g. { ${relDef.fieldName}: { Member: [{ where, disconnect }] } }.`);
|
|
1319
1338
|
const inner = nestedScope(carryVars, targetVar, depth, uniqueToken);
|
|
1320
|
-
const lines =
|
|
1339
|
+
const lines = this.gateOnUpdate(inner.withClause, targetNodeDef, targetVar, params, policyContext, paramCounter);
|
|
1321
1340
|
for (const nestedDisconnect of Array.isArray(nested) ? nested : [nested]) {
|
|
1322
1341
|
if (!isPlainObject(nestedDisconnect))
|
|
1323
1342
|
throw new OGMError(`A nested "disconnect" inside a disconnect on "${relDef.fieldName}" must be an object keyed by relationship.`);
|