grafeo-ogm 2.4.8 → 2.5.1
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 +72 -0
- package/README.md +106 -27
- 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.map +1 -1
- package/dist/cjs/compilers/mutation.compiler.js +92 -51
- package/dist/cjs/compilers/mutation.compiler.js.map +1 -1
- package/dist/cjs/compilers/selection.compiler.d.ts +16 -0
- package/dist/cjs/compilers/selection.compiler.d.ts.map +1 -1
- package/dist/cjs/compilers/selection.compiler.js +158 -18
- package/dist/cjs/compilers/selection.compiler.js.map +1 -1
- package/dist/cjs/generator/type-emitters/where-emitter.js +16 -0
- package/dist/cjs/generator/type-emitters/where-emitter.js.map +1 -1
- package/dist/cjs/interface-model.d.ts +12 -0
- package/dist/cjs/interface-model.d.ts.map +1 -1
- package/dist/cjs/interface-model.js +21 -13
- package/dist/cjs/interface-model.js.map +1 -1
- package/dist/cjs/model.d.ts.map +1 -1
- package/dist/cjs/model.js +6 -0
- package/dist/cjs/model.js.map +1 -1
- package/dist/cjs/subgraph/subgraph-operations.d.ts.map +1 -1
- package/dist/cjs/subgraph/subgraph-operations.js +71 -6
- package/dist/cjs/subgraph/subgraph-operations.js.map +1 -1
- package/dist/cjs/subgraph/types.d.ts +14 -0
- package/dist/cjs/subgraph/types.d.ts.map +1 -1
- package/dist/cjs/testing/cypher-assert.d.ts +19 -1
- package/dist/cjs/testing/cypher-assert.d.ts.map +1 -1
- package/dist/cjs/testing/cypher-assert.js +192 -11
- package/dist/cjs/testing/cypher-assert.js.map +1 -1
- package/dist/cjs/testing/neo4j-record-factory.d.ts +8 -4
- package/dist/cjs/testing/neo4j-record-factory.d.ts.map +1 -1
- package/dist/cjs/testing/neo4j-record-factory.js +18 -7
- package/dist/cjs/testing/neo4j-record-factory.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.map +1 -1
- package/dist/esm/compilers/mutation.compiler.js +92 -51
- package/dist/esm/compilers/mutation.compiler.js.map +1 -1
- package/dist/esm/compilers/selection.compiler.d.ts +16 -0
- package/dist/esm/compilers/selection.compiler.d.ts.map +1 -1
- package/dist/esm/compilers/selection.compiler.js +160 -20
- package/dist/esm/compilers/selection.compiler.js.map +1 -1
- package/dist/esm/generator/type-emitters/where-emitter.js +16 -0
- package/dist/esm/generator/type-emitters/where-emitter.js.map +1 -1
- package/dist/esm/interface-model.d.ts +12 -0
- package/dist/esm/interface-model.d.ts.map +1 -1
- package/dist/esm/interface-model.js +21 -13
- package/dist/esm/interface-model.js.map +1 -1
- package/dist/esm/model.d.ts.map +1 -1
- package/dist/esm/model.js +6 -0
- package/dist/esm/model.js.map +1 -1
- package/dist/esm/subgraph/subgraph-operations.d.ts.map +1 -1
- package/dist/esm/subgraph/subgraph-operations.js +71 -6
- package/dist/esm/subgraph/subgraph-operations.js.map +1 -1
- package/dist/esm/subgraph/types.d.ts +14 -0
- package/dist/esm/subgraph/types.d.ts.map +1 -1
- package/dist/esm/testing/cypher-assert.d.ts +19 -1
- package/dist/esm/testing/cypher-assert.d.ts.map +1 -1
- package/dist/esm/testing/cypher-assert.js +192 -11
- package/dist/esm/testing/cypher-assert.js.map +1 -1
- package/dist/esm/testing/neo4j-record-factory.d.ts +8 -4
- package/dist/esm/testing/neo4j-record-factory.d.ts.map +1 -1
- package/dist/esm/testing/neo4j-record-factory.js +18 -7
- package/dist/esm/testing/neo4j-record-factory.js.map +1 -1
- package/package.json +1 -1
- package/assets/logo.jpg +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-planner.js","sourceRoot":"","sources":["../../../src/cli/push-planner.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"push-planner.js","sourceRoot":"","sources":["../../../src/cli/push-planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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;IAmLjB;;;;;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;IAqIxB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAsDxB;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAwC7B,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"}
|
|
@@ -27,7 +27,15 @@ const MAX_NESTED_LINK_DEPTH = 5;
|
|
|
27
27
|
* bound as `targetVar`: that node becomes the source, everything in scope
|
|
28
28
|
* stays carried, and its own names are prefixed by it.
|
|
29
29
|
*/
|
|
30
|
-
function nestedScope(carryVars, targetVar, depth
|
|
30
|
+
function nestedScope(carryVars, targetVar, depth,
|
|
31
|
+
/**
|
|
32
|
+
* A token unique along the whole write path (v2.5.1). Pre-2.5.1 the
|
|
33
|
+
* prefix was `targetVar` alone, which sibling connects share (`target`)
|
|
34
|
+
* and which per-member union / interface dispatch restarts (`n_conn0`),
|
|
35
|
+
* so their nested params collided and the last writer won: links went
|
|
36
|
+
* to the wrong node and edge values were overwritten.
|
|
37
|
+
*/
|
|
38
|
+
uniqueToken) {
|
|
31
39
|
if (depth >= MAX_NESTED_LINK_DEPTH)
|
|
32
40
|
throw new errors_1.OGMError(`Nested connect / disconnect deeper than ${MAX_NESTED_LINK_DEPTH} levels is not supported.`);
|
|
33
41
|
const vars = [...new Set([...carryVars, targetVar])];
|
|
@@ -35,7 +43,7 @@ function nestedScope(carryVars, targetVar, depth) {
|
|
|
35
43
|
sourceVar: targetVar,
|
|
36
44
|
carryVars: vars,
|
|
37
45
|
withClause: `WITH ${vars.join(', ')}`,
|
|
38
|
-
varPrefix: `${
|
|
46
|
+
varPrefix: `${uniqueToken}_`,
|
|
39
47
|
depth: depth + 1,
|
|
40
48
|
};
|
|
41
49
|
}
|
|
@@ -175,6 +183,9 @@ class MutationCompiler {
|
|
|
175
183
|
*/
|
|
176
184
|
isConnectFastPathEligible(items, targetNodeDef) {
|
|
177
185
|
for (const item of items) {
|
|
186
|
+
// A non-object item takes the per-item path, which rejects it.
|
|
187
|
+
if (!(0, validation_1.isPlainObject)(item))
|
|
188
|
+
return false;
|
|
178
189
|
// A nested `connect` is per item (v2.4.8): the UNWIND cannot run it.
|
|
179
190
|
if (item.connect != null)
|
|
180
191
|
return false;
|
|
@@ -283,8 +294,10 @@ class MutationCompiler {
|
|
|
283
294
|
const input = inputs[i];
|
|
284
295
|
const prefix = `create${i}`;
|
|
285
296
|
const nodeVar = i === 0 ? 'n' : `n_${i}`;
|
|
286
|
-
|
|
297
|
+
// Labels first: an unsafe label must fail as such, before any
|
|
298
|
+
// input-key check (v2.5.0 rejects unknown keys).
|
|
287
299
|
const labelStr = this.getCachedLabelString(nodeDef);
|
|
300
|
+
const { propString, propParams } = this.buildCreateProperties(input, nodeDef, prefix);
|
|
288
301
|
lines.push(`CREATE (${nodeVar}:${labelStr} { ${propString} })`);
|
|
289
302
|
(0, validation_1.mergeParams)(params, propParams);
|
|
290
303
|
createdVars.push(nodeVar);
|
|
@@ -359,6 +372,7 @@ class MutationCompiler {
|
|
|
359
372
|
if (value === undefined)
|
|
360
373
|
continue;
|
|
361
374
|
(0, validation_1.assertSafePropertyName)(key, 'update property');
|
|
375
|
+
assertKnownField(nodeDef, key, 'update');
|
|
362
376
|
const propDef = nodeDef.properties.get(key);
|
|
363
377
|
const paramName = `update_${key}`;
|
|
364
378
|
const valueExpr = (0, write_coercion_1.wrapWriteExpr)(`$${paramName}`, value, propDef);
|
|
@@ -487,6 +501,11 @@ class MutationCompiler {
|
|
|
487
501
|
schema: this.schema,
|
|
488
502
|
});
|
|
489
503
|
const conditions = [
|
|
504
|
+
// v2.5.1 — an interface / union target binds no label in the
|
|
505
|
+
// pattern, so restrict the match to its member types. Without it a
|
|
506
|
+
// nested or cascade delete also DETACH DELETEd any other node on the
|
|
507
|
+
// same relationship type (a Toy deleted through `pets`).
|
|
508
|
+
this.targetMatch(targetNodeDef, targetVar).labelPredicate,
|
|
490
509
|
this.compileTargetWhere(item.where, targetVar, targetNodeDef, args.params, args.policyContext, args.paramCounter),
|
|
491
510
|
this.buildTargetPolicyPredicate(targetNodeDef, targetVar, args.params, args.policyContext, args.paramCounter, 'delete'),
|
|
492
511
|
].filter((c) => Boolean(c));
|
|
@@ -510,19 +529,31 @@ class MutationCompiler {
|
|
|
510
529
|
const labelStr = this.getCachedLabelString(nodeDef);
|
|
511
530
|
const lines = [];
|
|
512
531
|
const params = {};
|
|
513
|
-
//
|
|
532
|
+
// MERGE key: the `@id` / `@unique` fields of `where`, and nothing else
|
|
533
|
+
// (v2.5.0). Any other key throws:
|
|
534
|
+
// - a plain field (`{ email, name }`) became part of the MERGE
|
|
535
|
+
// pattern, so an existing node with that email but another name did
|
|
536
|
+
// not match — MERGE created a DUPLICATE beside it;
|
|
537
|
+
// - an operator key (`name_CONTAINS`) was dropped, silently widening
|
|
538
|
+
// the match to the remaining keys;
|
|
539
|
+
// - a typo (`usernme`) became a phantom property on the new node.
|
|
540
|
+
// Pre-1.7.4 any key set was accepted; 1.7.4 required at least one
|
|
541
|
+
// unique key but still let the others through.
|
|
514
542
|
const mergeProps = [];
|
|
515
543
|
const mergeKeyNames = [];
|
|
516
544
|
for (const [key, value] of Object.entries(where)) {
|
|
517
|
-
if (value === undefined
|
|
518
|
-
continue;
|
|
519
|
-
// Skip relationship suffixes and operators
|
|
520
|
-
if (key === 'AND' || key === 'OR' || key === 'NOT')
|
|
521
|
-
continue;
|
|
522
|
-
if (key.includes('_') && !nodeDef.properties.has(key))
|
|
545
|
+
if (value === undefined)
|
|
523
546
|
continue;
|
|
524
|
-
(0, validation_1.assertSafePropertyName)(key, 'merge key');
|
|
525
547
|
const propDef = nodeDef.properties.get(key);
|
|
548
|
+
if (!propDef ||
|
|
549
|
+
propDef.isCypher ||
|
|
550
|
+
!(propDef.isUnique || propDef.isGenerated))
|
|
551
|
+
throw new errors_1.OGMError(`upsert "where" accepts only @id / @unique fields of ${nodeDef.typeName}; "${key}" is not one. ` +
|
|
552
|
+
`MERGE matches on exactly these keys — put other fields in "create" / "update", ` +
|
|
553
|
+
`or use findFirst() + create() / update() for a non-unique match.`);
|
|
554
|
+
if (value === null)
|
|
555
|
+
throw new errors_1.OGMError(`upsert "where.${key}" is null; a MERGE key must have a value.`);
|
|
556
|
+
(0, validation_1.assertSafePropertyName)(key, 'merge key');
|
|
526
557
|
const paramName = `merge_${key}`;
|
|
527
558
|
const valueExpr = (0, write_coercion_1.wrapWriteExpr)(`$${paramName}`, value, propDef);
|
|
528
559
|
mergeProps.push(`${(0, validation_1.escapeIdentifier)(key)}: ${valueExpr}`);
|
|
@@ -530,30 +561,8 @@ class MutationCompiler {
|
|
|
530
561
|
params[paramName] = (0, write_coercion_1.coerceWriteValue)(value, propDef);
|
|
531
562
|
}
|
|
532
563
|
if (mergeProps.length === 0)
|
|
533
|
-
throw new errors_1.OGMError(
|
|
534
|
-
|
|
535
|
-
// `@id` property. Pre-1.7.4 we accepted any key set, so:
|
|
536
|
-
// - A typo in `where` (e.g. `usernme`) became a phantom MERGE
|
|
537
|
-
// property — Neo4j happily created a node with that mis-named
|
|
538
|
-
// attribute on first use.
|
|
539
|
-
// - A non-unique `where` (e.g. `where: { country: 'AR' }`) matched
|
|
540
|
-
// multiple existing nodes; MERGE then fans out across all of
|
|
541
|
-
// them, applying ON MATCH SET to every match. Almost always a
|
|
542
|
-
// bug, never the developer's intent.
|
|
543
|
-
// Requiring at least one unique/id key forces MERGE to target at
|
|
544
|
-
// most one row.
|
|
545
|
-
const hasUniqueOrId = mergeKeyNames.some((name) => {
|
|
546
|
-
const prop = nodeDef.properties.get(name);
|
|
547
|
-
// `isGenerated` is the parser's flag for the `@id` directive;
|
|
548
|
-
// `isUnique` is the flag for `@unique`. Either is sufficient
|
|
549
|
-
// to guarantee the MERGE pattern targets at most one row.
|
|
550
|
-
return prop !== undefined && (prop.isUnique || prop.isGenerated);
|
|
551
|
-
});
|
|
552
|
-
if (!hasUniqueOrId)
|
|
553
|
-
throw new errors_1.OGMError(`upsert "where" must contain at least one property marked with @id or @unique. ` +
|
|
554
|
-
`Got [${mergeKeyNames.map((n) => `"${n}"`).join(', ')}] — none of these are unique on ${nodeDef.typeName}. ` +
|
|
555
|
-
`Without a unique key, MERGE can fan out across multiple existing nodes (applying ON MATCH SET to each) ` +
|
|
556
|
-
`or create phantom properties on typo. If you really want a non-unique merge, use create() + update().`);
|
|
564
|
+
throw new errors_1.OGMError(`upsert requires at least one scalar property in "where" for MERGE key: ` +
|
|
565
|
+
`an @id or @unique field of ${nodeDef.typeName}.`);
|
|
557
566
|
lines.push(`MERGE (n:${labelStr} { ${mergeProps.join(', ')} })`);
|
|
558
567
|
// ON CREATE SET — all properties from create input (scalar only)
|
|
559
568
|
const createSets = [];
|
|
@@ -566,6 +575,7 @@ class MutationCompiler {
|
|
|
566
575
|
throw upsertRelationshipError(nodeDef, key, 'create');
|
|
567
576
|
}
|
|
568
577
|
(0, validation_1.assertSafePropertyName)(key, 'create property');
|
|
578
|
+
assertKnownField(nodeDef, key, 'create');
|
|
569
579
|
const propDef = nodeDef.properties.get(key);
|
|
570
580
|
const paramName = `onCreate_${key}`;
|
|
571
581
|
const valueExpr = (0, write_coercion_1.wrapWriteExpr)(`$${paramName}`, value, propDef);
|
|
@@ -616,6 +626,7 @@ class MutationCompiler {
|
|
|
616
626
|
throw upsertRelationshipError(nodeDef, key, 'update');
|
|
617
627
|
}
|
|
618
628
|
(0, validation_1.assertSafePropertyName)(key, 'update property');
|
|
629
|
+
assertKnownField(nodeDef, key, 'update');
|
|
619
630
|
const propDef = nodeDef.properties.get(key);
|
|
620
631
|
const paramName = `onMatch_${key}`;
|
|
621
632
|
const valueExpr = (0, write_coercion_1.wrapWriteExpr)(`$${paramName}`, value, propDef);
|
|
@@ -689,16 +700,13 @@ class MutationCompiler {
|
|
|
689
700
|
for (const key of Object.keys(item)) {
|
|
690
701
|
if (item[key] === undefined || scalarKeys.includes(key))
|
|
691
702
|
continue;
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
if (index > 0)
|
|
698
|
-
continue;
|
|
699
|
-
throw new errors_1.OGMError(`createMany does not support relationship fields. Found: "${key}". Use create() for nested operations.`);
|
|
700
|
-
}
|
|
703
|
+
// v2.5.0 — rejected in EVERY item. Pre-2.5.0 only the first item's
|
|
704
|
+
// relationship fields were; in later items the nested input was
|
|
705
|
+
// skipped unwritten.
|
|
706
|
+
if (nodeDef.relationships.has(key))
|
|
707
|
+
throw new errors_1.OGMError(`createMany does not support relationship fields. Found: "${key}" in data[${index}]. Use create() for nested operations.`);
|
|
701
708
|
(0, validation_1.assertSafePropertyName)(key, 'createMany property');
|
|
709
|
+
assertKnownField(nodeDef, key, 'createMany');
|
|
702
710
|
scalarKeys.push(key);
|
|
703
711
|
}
|
|
704
712
|
// Identify @id (generated) fields that are NOT provided in data
|
|
@@ -830,6 +838,7 @@ class MutationCompiler {
|
|
|
830
838
|
if (value === undefined)
|
|
831
839
|
continue;
|
|
832
840
|
(0, validation_1.assertSafePropertyName)(key, 'create property');
|
|
841
|
+
assertKnownField(nodeDef, key, 'create');
|
|
833
842
|
const propDef = nodeDef.properties.get(key);
|
|
834
843
|
const paramName = `${prefix}_${key}`;
|
|
835
844
|
const valueExpr = (0, write_coercion_1.wrapWriteExpr)(`$${paramName}`, value, propDef);
|
|
@@ -1029,6 +1038,11 @@ class MutationCompiler {
|
|
|
1029
1038
|
const relDef = nodeDef.relationships.get(fieldName);
|
|
1030
1039
|
if (!relDef)
|
|
1031
1040
|
continue;
|
|
1041
|
+
// v2.5.1 — `{ rel: null }` (the generated input is `InputMaybe`)
|
|
1042
|
+
// connects nothing. Since 2.4.8 it reached the item compiler with no
|
|
1043
|
+
// `where`, so the MATCH had no filter and EVERY target was linked.
|
|
1044
|
+
if (spec == null)
|
|
1045
|
+
continue;
|
|
1032
1046
|
const abstract = abstractTarget(relDef.target, this.schema);
|
|
1033
1047
|
const memberEntries = abstract && !isBlanketSpec(spec)
|
|
1034
1048
|
? perMemberEntries(spec, abstract, fieldName)
|
|
@@ -1200,9 +1214,14 @@ class MutationCompiler {
|
|
|
1200
1214
|
*/
|
|
1201
1215
|
buildConnectItem(a) {
|
|
1202
1216
|
const { connectSpec, relDef, targetNodeDef, sourceVar, connectVar } = a;
|
|
1217
|
+
// v2.5.1 — every connect item reaches here (top-level, array, nested in
|
|
1218
|
+
// create / update / connect). A null or non-object item has no filter:
|
|
1219
|
+
// compiling it would MATCH, and link, every target node.
|
|
1220
|
+
if (!(0, validation_1.isPlainObject)(connectSpec))
|
|
1221
|
+
throw new errors_1.OGMError(`A connect item on "${relDef.fieldName}" must be an object such as { where: { node: { … } } }; got ${connectSpec === null ? 'null' : typeof connectSpec}.`);
|
|
1203
1222
|
const lines = [];
|
|
1204
|
-
const whereSpec = connectSpec
|
|
1205
|
-
const edgeInput = connectSpec
|
|
1223
|
+
const whereSpec = connectSpec.where;
|
|
1224
|
+
const edgeInput = connectSpec.edge;
|
|
1206
1225
|
lines.push(a.withClause);
|
|
1207
1226
|
lines.push('CALL {');
|
|
1208
1227
|
lines.push(a.withClause);
|
|
@@ -1248,12 +1267,12 @@ class MutationCompiler {
|
|
|
1248
1267
|
// A `connect` nested in the item links the CONNECTED node onward
|
|
1249
1268
|
// (`connect: { posts: [{ where, connect: { tags: [...] } }] }`), with
|
|
1250
1269
|
// the same policy predicates at its level. Pre-2.4.8 it was ignored.
|
|
1251
|
-
const nested = connectSpec
|
|
1270
|
+
const nested = connectSpec.connect;
|
|
1252
1271
|
if (nested != null) {
|
|
1253
1272
|
if (abstractTarget(targetNodeDef.typeName, this.schema))
|
|
1254
1273
|
throw new errors_1.OGMError(`A nested "connect" inside a connect on "${relDef.fieldName}" (abstract type "${targetNodeDef.typeName}") ` +
|
|
1255
1274
|
`must be keyed by the implementing type, e.g. { ${relDef.fieldName}: { Member: [{ where, connect }] } }.`);
|
|
1256
|
-
const inner = nestedScope(a.scope.carryVars, connectVar, a.scope.depth);
|
|
1275
|
+
const inner = nestedScope(a.scope.carryVars, connectVar, a.scope.depth, a.edgeParamPrefix);
|
|
1257
1276
|
for (const nestedConnect of Array.isArray(nested) ? nested : [nested]) {
|
|
1258
1277
|
if (!(0, validation_1.isPlainObject)(nestedConnect))
|
|
1259
1278
|
throw new errors_1.OGMError(`A nested "connect" inside a connect on "${relDef.fieldName}" must be an object keyed by relationship.`);
|
|
@@ -1296,13 +1315,15 @@ class MutationCompiler {
|
|
|
1296
1315
|
* { tags: [...] } }] }`), with the same policy predicates at its level.
|
|
1297
1316
|
* Pre-2.4.8 it was ignored. `''`-free: no input, no lines.
|
|
1298
1317
|
*/
|
|
1299
|
-
buildNestedDisconnect(nested, relDef, targetNodeDef, targetVar, carryVars, params, policyContext, paramCounter, depth = 0
|
|
1318
|
+
buildNestedDisconnect(nested, relDef, targetNodeDef, targetVar, carryVars, params, policyContext, paramCounter, depth = 0,
|
|
1319
|
+
/** Unique along the write path; see `nestedScope`. */
|
|
1320
|
+
uniqueToken = targetVar) {
|
|
1300
1321
|
if (nested == null)
|
|
1301
1322
|
return [];
|
|
1302
1323
|
if (abstractTarget(targetNodeDef.typeName, this.schema))
|
|
1303
1324
|
throw new errors_1.OGMError(`A nested "disconnect" inside a disconnect on "${relDef.fieldName}" (abstract type "${targetNodeDef.typeName}") ` +
|
|
1304
1325
|
`must be keyed by the implementing type, e.g. { ${relDef.fieldName}: { Member: [{ where, disconnect }] } }.`);
|
|
1305
|
-
const inner = nestedScope(carryVars, targetVar, depth);
|
|
1326
|
+
const inner = nestedScope(carryVars, targetVar, depth, uniqueToken);
|
|
1306
1327
|
const lines = [];
|
|
1307
1328
|
for (const nestedDisconnect of Array.isArray(nested) ? nested : [nested]) {
|
|
1308
1329
|
if (!(0, validation_1.isPlainObject)(nestedDisconnect))
|
|
@@ -1544,7 +1565,10 @@ class MutationCompiler {
|
|
|
1544
1565
|
if (nestedDiscConditions.length > 0)
|
|
1545
1566
|
lines.push(`WHERE ${nestedDiscConditions.join(' AND ')}`);
|
|
1546
1567
|
lines.push(`DELETE ${relVar}`);
|
|
1547
|
-
lines.push(...this.buildNestedDisconnect(nestedDisconnect, relDef, targetNodeDef, discTarget, allVars, params, policyContext, paramCounter
|
|
1568
|
+
lines.push(...this.buildNestedDisconnect(nestedDisconnect, relDef, targetNodeDef, discTarget, allVars, params, policyContext, paramCounter, 0,
|
|
1569
|
+
// `discTarget` restarts per member under union dispatch;
|
|
1570
|
+
// `itemPrefix` is unique along the path.
|
|
1571
|
+
`${itemPrefix}_disc${di}`));
|
|
1548
1572
|
}
|
|
1549
1573
|
lines.push(`RETURN count(*) AS _${relVar}`);
|
|
1550
1574
|
lines.push('}');
|
|
@@ -1674,6 +1698,7 @@ class MutationCompiler {
|
|
|
1674
1698
|
if (val === undefined)
|
|
1675
1699
|
continue;
|
|
1676
1700
|
(0, validation_1.assertSafePropertyName)(prop, 'nested update property');
|
|
1701
|
+
assertKnownField(targetNodeDef, prop, 'nested update');
|
|
1677
1702
|
const nodePropDef = targetNodeDef.properties.get(prop);
|
|
1678
1703
|
const paramName = `${itemPrefix}_set_${prop}`;
|
|
1679
1704
|
setClauses.push(`${updateVar}.${(0, validation_1.escapeIdentifier)(prop)} = ${(0, write_coercion_1.wrapWriteExpr)(`$${paramName}`, val, nodePropDef)}`);
|
|
@@ -1730,6 +1755,10 @@ class MutationCompiler {
|
|
|
1730
1755
|
// `update` policy, exactly like a direct update on that type
|
|
1731
1756
|
// (pre-2.3.0 it enforced no target policy at all).
|
|
1732
1757
|
const updateConditions = [
|
|
1758
|
+
// v2.5.1 — restrict an interface / union target to its member
|
|
1759
|
+
// types; without it the nested update also SET properties on
|
|
1760
|
+
// other nodes on the same relationship type.
|
|
1761
|
+
this.targetMatch(targetNodeDef, updateVar).labelPredicate,
|
|
1733
1762
|
this.compileTargetWhere(updateWhere, updateVar, targetNodeDef, params, policyContext, paramCounter),
|
|
1734
1763
|
this.buildTargetPolicyPredicate(targetNodeDef, updateVar, params, policyContext, paramCounter, 'update'),
|
|
1735
1764
|
].filter((c) => Boolean(c));
|
|
@@ -1977,6 +2006,18 @@ function unwrapAbstractCreateNode(nodeSpec, target, fieldName) {
|
|
|
1977
2006
|
`e.g. { node: { ${target.members[0] ?? 'Member'}: { … } } }. Allowed: ${target.members.map((m) => `"${m}"`).join(', ')}.`);
|
|
1978
2007
|
return [keys[0], nodeSpec[keys[0]]];
|
|
1979
2008
|
}
|
|
2009
|
+
/**
|
|
2010
|
+
* Reject a write key that is neither a property nor a relationship of the
|
|
2011
|
+
* type (v2.5.0). Pre-2.5.0 only its spelling was checked, so a typo
|
|
2012
|
+
* (`nmae`) was stored as a stray property and the intended field was left
|
|
2013
|
+
* untouched — at every depth (nested creates and updates included).
|
|
2014
|
+
*/
|
|
2015
|
+
function assertKnownField(nodeDef, key, input) {
|
|
2016
|
+
if (nodeDef.properties.has(key) || nodeDef.relationships.has(key))
|
|
2017
|
+
return;
|
|
2018
|
+
throw new errors_1.OGMError(`Unknown field "${key}" in the ${input} input of ${nodeDef.typeName}: it is neither a property nor a ` +
|
|
2019
|
+
`relationship of the type. Declare it in the schema, or fix the key.`);
|
|
2020
|
+
}
|
|
1980
2021
|
/**
|
|
1981
2022
|
* MERGE writes scalars only. Pre-2.4.8 a relationship field in an upsert's
|
|
1982
2023
|
* `create` / `update` was skipped, so its nested connect / create never
|