grafeo-ogm 2.5.0 → 2.5.2
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 +26 -0
- package/README.md +86 -21
- package/assets/brand/grafeo-mark-on-dark.svg +1 -0
- package/assets/brand/grafeo-mark-on-light.svg +1 -0
- package/dist/cjs/cli/commands/db-push.d.ts.map +1 -1
- package/dist/cjs/cli/commands/db-push.js +17 -5
- package/dist/cjs/cli/commands/db-push.js.map +1 -1
- package/dist/cjs/cli/push-planner.d.ts +6 -0
- package/dist/cjs/cli/push-planner.d.ts.map +1 -1
- package/dist/cjs/cli/push-planner.js +24 -5
- package/dist/cjs/cli/push-planner.js.map +1 -1
- 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 +60 -10
- package/dist/cjs/compilers/mutation.compiler.js.map +1 -1
- package/dist/esm/cli/commands/db-push.d.ts.map +1 -1
- package/dist/esm/cli/commands/db-push.js +17 -5
- package/dist/esm/cli/commands/db-push.js.map +1 -1
- package/dist/esm/cli/push-planner.d.ts +6 -0
- package/dist/esm/cli/push-planner.d.ts.map +1 -1
- package/dist/esm/cli/push-planner.js +24 -5
- package/dist/esm/cli/push-planner.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 +60 -10
- package/dist/esm/compilers/mutation.compiler.js.map +1 -1
- package/package.json +1 -1
- package/assets/logo.jpg +0 -0
|
@@ -51,6 +51,10 @@ export function planSchemaSync(schema, live, vectorConfig) {
|
|
|
51
51
|
const changed = [];
|
|
52
52
|
const covered = [];
|
|
53
53
|
const blocked = [];
|
|
54
|
+
const equivalentIndex = (name, definition) => live.indexes.find((i) => i.name !== name &&
|
|
55
|
+
!i.owningConstraint &&
|
|
56
|
+
i.type === definition.type &&
|
|
57
|
+
sameSchema(definition, i, definition.unorderedProperties));
|
|
54
58
|
for (const statement of desired) {
|
|
55
59
|
const isConstraint = statement.kind === 'unique-constraint';
|
|
56
60
|
const present = isConstraint
|
|
@@ -71,10 +75,17 @@ export function planSchemaSync(schema, live, vectorConfig) {
|
|
|
71
75
|
!liveConstraintNames.has(i.name) &&
|
|
72
76
|
sameSchema(definition, i));
|
|
73
77
|
if (blocker) {
|
|
74
|
-
blocked.push({ statement, by: blocker.name });
|
|
78
|
+
blocked.push({ statement, by: blocker.name, reason: 'range-index' });
|
|
75
79
|
continue;
|
|
76
80
|
}
|
|
77
81
|
}
|
|
82
|
+
const twin = !isConstraint &&
|
|
83
|
+
definition &&
|
|
84
|
+
equivalentIndex(statement.name, definition);
|
|
85
|
+
if (twin) {
|
|
86
|
+
blocked.push({ statement, by: twin.name, reason: 'equivalent-index' });
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
78
89
|
create.push(statement);
|
|
79
90
|
continue;
|
|
80
91
|
}
|
|
@@ -86,8 +97,16 @@ export function planSchemaSync(schema, live, vectorConfig) {
|
|
|
86
97
|
: definitions.get(statement.name);
|
|
87
98
|
const liveItem = liveIndexesByName.get(statement.name);
|
|
88
99
|
const differences = liveItem && definition ? diffDefinition(definition, liveItem) : [];
|
|
89
|
-
if (differences.length === 0)
|
|
100
|
+
if (differences.length === 0) {
|
|
90
101
|
inSync.push(statement);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
// v2.5.1 — Neo4j will not create a fulltext/vector index equivalent to
|
|
105
|
+
// one that exists under another name, so a drop + recreate would leave
|
|
106
|
+
// the SDL name missing (and fulltext queries address it by that name).
|
|
107
|
+
const twin = definition && equivalentIndex(statement.name, definition);
|
|
108
|
+
if (twin)
|
|
109
|
+
blocked.push({ statement, by: twin.name, reason: 'equivalent-index' });
|
|
91
110
|
else
|
|
92
111
|
changed.push({
|
|
93
112
|
statement,
|
|
@@ -258,13 +277,13 @@ function diffDefinition(want, live) {
|
|
|
258
277
|
* Same entity, labels and properties? Requires the live row to report its
|
|
259
278
|
* definition columns — without them nothing is ever called equivalent.
|
|
260
279
|
*/
|
|
261
|
-
function sameSchema(want, live) {
|
|
280
|
+
function sameSchema(want, live, unorderedProperties = false) {
|
|
262
281
|
if (!live.labelsOrTypes || !live.properties)
|
|
263
282
|
return false;
|
|
264
283
|
if (live.entityType && live.entityType !== want.entityType)
|
|
265
284
|
return false;
|
|
266
|
-
return (sameList(live.labelsOrTypes, want.labelsOrTypes) &&
|
|
267
|
-
sameList(live.properties, want.properties));
|
|
285
|
+
return (sameList(live.labelsOrTypes, want.labelsOrTypes, unorderedProperties) &&
|
|
286
|
+
sameList(live.properties, want.properties, unorderedProperties));
|
|
268
287
|
}
|
|
269
288
|
function sameList(a, b, unordered = false) {
|
|
270
289
|
if (a.length !== b.length)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-planner.js","sourceRoot":"","sources":["../../../src/cli/push-planner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,mCAAmC,EACnC,+BAA+B,EAC/B,0BAA0B,EAC1B,sBAAsB,EAEtB,oBAAoB,GAGrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,oBAAoB,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"push-planner.js","sourceRoot":"","sources":["../../../src/cli/push-planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"mutation.compiler.d.ts","sourceRoot":"","sources":["../../../src/compilers/mutation.compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,15 @@ const MAX_NESTED_LINK_DEPTH = 5;
|
|
|
20
20
|
* bound as `targetVar`: that node becomes the source, everything in scope
|
|
21
21
|
* stays carried, and its own names are prefixed by it.
|
|
22
22
|
*/
|
|
23
|
-
function nestedScope(carryVars, targetVar, depth
|
|
23
|
+
function nestedScope(carryVars, targetVar, depth,
|
|
24
|
+
/**
|
|
25
|
+
* A token unique along the whole write path (v2.5.1). Pre-2.5.1 the
|
|
26
|
+
* prefix was `targetVar` alone, which sibling connects share (`target`)
|
|
27
|
+
* and which per-member union / interface dispatch restarts (`n_conn0`),
|
|
28
|
+
* so their nested params collided and the last writer won: links went
|
|
29
|
+
* to the wrong node and edge values were overwritten.
|
|
30
|
+
*/
|
|
31
|
+
uniqueToken) {
|
|
24
32
|
if (depth >= MAX_NESTED_LINK_DEPTH)
|
|
25
33
|
throw new OGMError(`Nested connect / disconnect deeper than ${MAX_NESTED_LINK_DEPTH} levels is not supported.`);
|
|
26
34
|
const vars = [...new Set([...carryVars, targetVar])];
|
|
@@ -28,7 +36,7 @@ function nestedScope(carryVars, targetVar, depth) {
|
|
|
28
36
|
sourceVar: targetVar,
|
|
29
37
|
carryVars: vars,
|
|
30
38
|
withClause: `WITH ${vars.join(', ')}`,
|
|
31
|
-
varPrefix: `${
|
|
39
|
+
varPrefix: `${uniqueToken}_`,
|
|
32
40
|
depth: depth + 1,
|
|
33
41
|
};
|
|
34
42
|
}
|
|
@@ -115,6 +123,20 @@ export class MutationCompiler {
|
|
|
115
123
|
mergeParams(params, clause.params);
|
|
116
124
|
return clause.cypher;
|
|
117
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
|
+
}
|
|
118
140
|
getPolicyWhereCompiler() {
|
|
119
141
|
// Inherit the logger: since v2.3.0 this compiler also compiles every
|
|
120
142
|
// nested-write `where`, and its empty-AND/OR warnings must surface.
|
|
@@ -168,6 +190,9 @@ export class MutationCompiler {
|
|
|
168
190
|
*/
|
|
169
191
|
isConnectFastPathEligible(items, targetNodeDef) {
|
|
170
192
|
for (const item of items) {
|
|
193
|
+
// A non-object item takes the per-item path, which rejects it.
|
|
194
|
+
if (!isPlainObject(item))
|
|
195
|
+
return false;
|
|
171
196
|
// A nested `connect` is per item (v2.4.8): the UNWIND cannot run it.
|
|
172
197
|
if (item.connect != null)
|
|
173
198
|
return false;
|
|
@@ -483,6 +508,11 @@ export class MutationCompiler {
|
|
|
483
508
|
schema: this.schema,
|
|
484
509
|
});
|
|
485
510
|
const conditions = [
|
|
511
|
+
// v2.5.1 — an interface / union target binds no label in the
|
|
512
|
+
// pattern, so restrict the match to its member types. Without it a
|
|
513
|
+
// nested or cascade delete also DETACH DELETEd any other node on the
|
|
514
|
+
// same relationship type (a Toy deleted through `pets`).
|
|
515
|
+
this.targetMatch(targetNodeDef, targetVar).labelPredicate,
|
|
486
516
|
this.compileTargetWhere(item.where, targetVar, targetNodeDef, args.params, args.policyContext, args.paramCounter),
|
|
487
517
|
this.buildTargetPolicyPredicate(targetNodeDef, targetVar, args.params, args.policyContext, args.paramCounter, 'delete'),
|
|
488
518
|
].filter((c) => Boolean(c));
|
|
@@ -1015,6 +1045,11 @@ export class MutationCompiler {
|
|
|
1015
1045
|
const relDef = nodeDef.relationships.get(fieldName);
|
|
1016
1046
|
if (!relDef)
|
|
1017
1047
|
continue;
|
|
1048
|
+
// v2.5.1 — `{ rel: null }` (the generated input is `InputMaybe`)
|
|
1049
|
+
// connects nothing. Since 2.4.8 it reached the item compiler with no
|
|
1050
|
+
// `where`, so the MATCH had no filter and EVERY target was linked.
|
|
1051
|
+
if (spec == null)
|
|
1052
|
+
continue;
|
|
1018
1053
|
const abstract = abstractTarget(relDef.target, this.schema);
|
|
1019
1054
|
const memberEntries = abstract && !isBlanketSpec(spec)
|
|
1020
1055
|
? perMemberEntries(spec, abstract, fieldName)
|
|
@@ -1186,9 +1221,14 @@ export class MutationCompiler {
|
|
|
1186
1221
|
*/
|
|
1187
1222
|
buildConnectItem(a) {
|
|
1188
1223
|
const { connectSpec, relDef, targetNodeDef, sourceVar, connectVar } = a;
|
|
1224
|
+
// v2.5.1 — every connect item reaches here (top-level, array, nested in
|
|
1225
|
+
// create / update / connect). A null or non-object item has no filter:
|
|
1226
|
+
// compiling it would MATCH, and link, every target node.
|
|
1227
|
+
if (!isPlainObject(connectSpec))
|
|
1228
|
+
throw new OGMError(`A connect item on "${relDef.fieldName}" must be an object such as { where: { node: { … } } }; got ${connectSpec === null ? 'null' : typeof connectSpec}.`);
|
|
1189
1229
|
const lines = [];
|
|
1190
|
-
const whereSpec = connectSpec
|
|
1191
|
-
const edgeInput = connectSpec
|
|
1230
|
+
const whereSpec = connectSpec.where;
|
|
1231
|
+
const edgeInput = connectSpec.edge;
|
|
1192
1232
|
lines.push(a.withClause);
|
|
1193
1233
|
lines.push('CALL {');
|
|
1194
1234
|
lines.push(a.withClause);
|
|
@@ -1234,12 +1274,13 @@ export class MutationCompiler {
|
|
|
1234
1274
|
// A `connect` nested in the item links the CONNECTED node onward
|
|
1235
1275
|
// (`connect: { posts: [{ where, connect: { tags: [...] } }] }`), with
|
|
1236
1276
|
// the same policy predicates at its level. Pre-2.4.8 it was ignored.
|
|
1237
|
-
const nested = connectSpec
|
|
1277
|
+
const nested = connectSpec.connect;
|
|
1238
1278
|
if (nested != null) {
|
|
1239
1279
|
if (abstractTarget(targetNodeDef.typeName, this.schema))
|
|
1240
1280
|
throw new OGMError(`A nested "connect" inside a connect on "${relDef.fieldName}" (abstract type "${targetNodeDef.typeName}") ` +
|
|
1241
1281
|
`must be keyed by the implementing type, e.g. { ${relDef.fieldName}: { Member: [{ where, connect }] } }.`);
|
|
1242
|
-
const inner = nestedScope(a.scope.carryVars, connectVar, a.scope.depth);
|
|
1282
|
+
const inner = nestedScope(a.scope.carryVars, connectVar, a.scope.depth, a.edgeParamPrefix);
|
|
1283
|
+
lines.push(...this.gateOnUpdate(inner.withClause, targetNodeDef, connectVar, a.params, a.policyContext, a.paramCounter));
|
|
1243
1284
|
for (const nestedConnect of Array.isArray(nested) ? nested : [nested]) {
|
|
1244
1285
|
if (!isPlainObject(nestedConnect))
|
|
1245
1286
|
throw new OGMError(`A nested "connect" inside a connect on "${relDef.fieldName}" must be an object keyed by relationship.`);
|
|
@@ -1282,14 +1323,16 @@ export class MutationCompiler {
|
|
|
1282
1323
|
* { tags: [...] } }] }`), with the same policy predicates at its level.
|
|
1283
1324
|
* Pre-2.4.8 it was ignored. `''`-free: no input, no lines.
|
|
1284
1325
|
*/
|
|
1285
|
-
buildNestedDisconnect(nested, relDef, targetNodeDef, targetVar, carryVars, params, policyContext, paramCounter, depth = 0
|
|
1326
|
+
buildNestedDisconnect(nested, relDef, targetNodeDef, targetVar, carryVars, params, policyContext, paramCounter, depth = 0,
|
|
1327
|
+
/** Unique along the write path; see `nestedScope`. */
|
|
1328
|
+
uniqueToken = targetVar) {
|
|
1286
1329
|
if (nested == null)
|
|
1287
1330
|
return [];
|
|
1288
1331
|
if (abstractTarget(targetNodeDef.typeName, this.schema))
|
|
1289
1332
|
throw new OGMError(`A nested "disconnect" inside a disconnect on "${relDef.fieldName}" (abstract type "${targetNodeDef.typeName}") ` +
|
|
1290
1333
|
`must be keyed by the implementing type, e.g. { ${relDef.fieldName}: { Member: [{ where, disconnect }] } }.`);
|
|
1291
|
-
const inner = nestedScope(carryVars, targetVar, depth);
|
|
1292
|
-
const lines =
|
|
1334
|
+
const inner = nestedScope(carryVars, targetVar, depth, uniqueToken);
|
|
1335
|
+
const lines = this.gateOnUpdate(inner.withClause, targetNodeDef, targetVar, params, policyContext, paramCounter);
|
|
1293
1336
|
for (const nestedDisconnect of Array.isArray(nested) ? nested : [nested]) {
|
|
1294
1337
|
if (!isPlainObject(nestedDisconnect))
|
|
1295
1338
|
throw new OGMError(`A nested "disconnect" inside a disconnect on "${relDef.fieldName}" must be an object keyed by relationship.`);
|
|
@@ -1530,7 +1573,10 @@ export class MutationCompiler {
|
|
|
1530
1573
|
if (nestedDiscConditions.length > 0)
|
|
1531
1574
|
lines.push(`WHERE ${nestedDiscConditions.join(' AND ')}`);
|
|
1532
1575
|
lines.push(`DELETE ${relVar}`);
|
|
1533
|
-
lines.push(...this.buildNestedDisconnect(nestedDisconnect, relDef, targetNodeDef, discTarget, allVars, params, policyContext, paramCounter
|
|
1576
|
+
lines.push(...this.buildNestedDisconnect(nestedDisconnect, relDef, targetNodeDef, discTarget, allVars, params, policyContext, paramCounter, 0,
|
|
1577
|
+
// `discTarget` restarts per member under union dispatch;
|
|
1578
|
+
// `itemPrefix` is unique along the path.
|
|
1579
|
+
`${itemPrefix}_disc${di}`));
|
|
1534
1580
|
}
|
|
1535
1581
|
lines.push(`RETURN count(*) AS _${relVar}`);
|
|
1536
1582
|
lines.push('}');
|
|
@@ -1717,6 +1763,10 @@ export class MutationCompiler {
|
|
|
1717
1763
|
// `update` policy, exactly like a direct update on that type
|
|
1718
1764
|
// (pre-2.3.0 it enforced no target policy at all).
|
|
1719
1765
|
const updateConditions = [
|
|
1766
|
+
// v2.5.1 — restrict an interface / union target to its member
|
|
1767
|
+
// types; without it the nested update also SET properties on
|
|
1768
|
+
// other nodes on the same relationship type.
|
|
1769
|
+
this.targetMatch(targetNodeDef, updateVar).labelPredicate,
|
|
1720
1770
|
this.compileTargetWhere(updateWhere, updateVar, targetNodeDef, params, policyContext, paramCounter),
|
|
1721
1771
|
this.buildTargetPolicyPredicate(targetNodeDef, updateVar, params, policyContext, paramCounter, 'update'),
|
|
1722
1772
|
].filter((c) => Boolean(c));
|