grafeo-ogm 2.4.7 → 2.5.0
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 +126 -0
- package/README.md +95 -35
- package/dist/cjs/cli/commands/db-push.d.ts.map +1 -1
- package/dist/cjs/cli/commands/db-push.js +74 -8
- package/dist/cjs/cli/commands/db-push.js.map +1 -1
- package/dist/cjs/cli/commands/db-seed.d.ts.map +1 -1
- package/dist/cjs/cli/commands/db-seed.js +10 -1
- package/dist/cjs/cli/commands/db-seed.js.map +1 -1
- package/dist/cjs/cli/introspect.d.ts +2 -2
- package/dist/cjs/cli/introspect.d.ts.map +1 -1
- package/dist/cjs/cli/introspect.js +44 -2
- package/dist/cjs/cli/introspect.js.map +1 -1
- package/dist/cjs/cli/push-planner.d.ts +57 -2
- package/dist/cjs/cli/push-planner.d.ts.map +1 -1
- package/dist/cjs/cli/push-planner.js +161 -3
- package/dist/cjs/cli/push-planner.js.map +1 -1
- package/dist/cjs/compilers/fulltext.compiler.d.ts.map +1 -1
- package/dist/cjs/compilers/fulltext.compiler.js +5 -1
- package/dist/cjs/compilers/fulltext.compiler.js.map +1 -1
- package/dist/cjs/compilers/mutation.compiler.d.ts +107 -1
- package/dist/cjs/compilers/mutation.compiler.d.ts.map +1 -1
- package/dist/cjs/compilers/mutation.compiler.js +695 -422
- package/dist/cjs/compilers/mutation.compiler.js.map +1 -1
- package/dist/cjs/compilers/select-normalizer.d.ts.map +1 -1
- package/dist/cjs/compilers/select-normalizer.js +12 -1
- package/dist/cjs/compilers/select-normalizer.js.map +1 -1
- package/dist/cjs/compilers/selection.compiler.d.ts +56 -0
- package/dist/cjs/compilers/selection.compiler.d.ts.map +1 -1
- package/dist/cjs/compilers/selection.compiler.js +271 -29
- 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 +36 -15
- package/dist/cjs/compilers/where.compiler.js.map +1 -1
- package/dist/cjs/execution/executor.d.ts +34 -9
- package/dist/cjs/execution/executor.d.ts.map +1 -1
- package/dist/cjs/execution/executor.js +42 -5
- package/dist/cjs/execution/executor.js.map +1 -1
- package/dist/cjs/execution/result-mapper.d.ts.map +1 -1
- package/dist/cjs/execution/result-mapper.js +4 -2
- package/dist/cjs/execution/result-mapper.js.map +1 -1
- package/dist/cjs/generator/generate-types.d.ts.map +1 -1
- package/dist/cjs/generator/generate-types.js +76 -0
- package/dist/cjs/generator/generate-types.js.map +1 -1
- package/dist/cjs/generator/type-emitters/aggregation-emitter.d.ts.map +1 -1
- package/dist/cjs/generator/type-emitters/aggregation-emitter.js +19 -7
- package/dist/cjs/generator/type-emitters/aggregation-emitter.js.map +1 -1
- package/dist/cjs/generator/type-emitters/input-emitter.js +13 -4
- package/dist/cjs/generator/type-emitters/input-emitter.js.map +1 -1
- package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts +1 -0
- package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts.map +1 -1
- package/dist/cjs/generator/type-emitters/model-map-emitter.js +5 -20
- package/dist/cjs/generator/type-emitters/model-map-emitter.js.map +1 -1
- package/dist/cjs/generator/type-emitters/node-type-emitter.d.ts +3 -0
- package/dist/cjs/generator/type-emitters/node-type-emitter.d.ts.map +1 -1
- package/dist/cjs/generator/type-emitters/node-type-emitter.js +6 -11
- package/dist/cjs/generator/type-emitters/node-type-emitter.js.map +1 -1
- package/dist/cjs/generator/type-emitters/select-fields-emitter.js +21 -2
- package/dist/cjs/generator/type-emitters/select-fields-emitter.js.map +1 -1
- package/dist/cjs/generator/type-emitters/where-emitter.js +19 -3
- package/dist/cjs/generator/type-emitters/where-emitter.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.d.ts.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 +27 -13
- package/dist/cjs/interface-model.js.map +1 -1
- package/dist/cjs/model.d.ts.map +1 -1
- package/dist/cjs/model.js +12 -0
- package/dist/cjs/model.js.map +1 -1
- package/dist/cjs/ogm.d.ts +22 -2
- package/dist/cjs/ogm.d.ts.map +1 -1
- package/dist/cjs/ogm.js +42 -5
- package/dist/cjs/ogm.js.map +1 -1
- package/dist/cjs/policy/nested-writes.d.ts.map +1 -1
- package/dist/cjs/policy/nested-writes.js +40 -20
- package/dist/cjs/policy/nested-writes.js.map +1 -1
- package/dist/cjs/schema/parser.d.ts.map +1 -1
- package/dist/cjs/schema/parser.js +94 -16
- package/dist/cjs/schema/parser.js.map +1 -1
- package/dist/cjs/schema/types.d.ts +1 -1
- package/dist/cjs/schema/types.d.ts.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 +217 -13
- package/dist/cjs/testing/cypher-assert.js.map +1 -1
- package/dist/cjs/testing/neo4j-record-factory.d.ts +29 -2
- package/dist/cjs/testing/neo4j-record-factory.d.ts.map +1 -1
- package/dist/cjs/testing/neo4j-record-factory.js +93 -3
- package/dist/cjs/testing/neo4j-record-factory.js.map +1 -1
- package/dist/cjs/utils/cypher-field-projection.d.ts +31 -3
- package/dist/cjs/utils/cypher-field-projection.d.ts.map +1 -1
- package/dist/cjs/utils/cypher-field-projection.js +59 -7
- package/dist/cjs/utils/cypher-field-projection.js.map +1 -1
- package/dist/cjs/utils/write-coercion.d.ts +18 -0
- package/dist/cjs/utils/write-coercion.d.ts.map +1 -1
- package/dist/cjs/utils/write-coercion.js +74 -1
- package/dist/cjs/utils/write-coercion.js.map +1 -1
- package/dist/esm/cli/commands/db-push.d.ts.map +1 -1
- package/dist/esm/cli/commands/db-push.js +74 -8
- package/dist/esm/cli/commands/db-push.js.map +1 -1
- package/dist/esm/cli/commands/db-seed.d.ts.map +1 -1
- package/dist/esm/cli/commands/db-seed.js +10 -1
- package/dist/esm/cli/commands/db-seed.js.map +1 -1
- package/dist/esm/cli/introspect.d.ts +2 -2
- package/dist/esm/cli/introspect.d.ts.map +1 -1
- package/dist/esm/cli/introspect.js +44 -2
- package/dist/esm/cli/introspect.js.map +1 -1
- package/dist/esm/cli/push-planner.d.ts +57 -2
- package/dist/esm/cli/push-planner.d.ts.map +1 -1
- package/dist/esm/cli/push-planner.js +162 -4
- package/dist/esm/cli/push-planner.js.map +1 -1
- package/dist/esm/compilers/fulltext.compiler.d.ts.map +1 -1
- package/dist/esm/compilers/fulltext.compiler.js +5 -1
- package/dist/esm/compilers/fulltext.compiler.js.map +1 -1
- package/dist/esm/compilers/mutation.compiler.d.ts +107 -1
- package/dist/esm/compilers/mutation.compiler.d.ts.map +1 -1
- package/dist/esm/compilers/mutation.compiler.js +692 -422
- package/dist/esm/compilers/mutation.compiler.js.map +1 -1
- package/dist/esm/compilers/select-normalizer.d.ts.map +1 -1
- package/dist/esm/compilers/select-normalizer.js +12 -1
- package/dist/esm/compilers/select-normalizer.js.map +1 -1
- package/dist/esm/compilers/selection.compiler.d.ts +56 -0
- package/dist/esm/compilers/selection.compiler.d.ts.map +1 -1
- package/dist/esm/compilers/selection.compiler.js +273 -31
- 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 +37 -16
- package/dist/esm/compilers/where.compiler.js.map +1 -1
- package/dist/esm/execution/executor.d.ts +34 -9
- package/dist/esm/execution/executor.d.ts.map +1 -1
- package/dist/esm/execution/executor.js +41 -5
- package/dist/esm/execution/executor.js.map +1 -1
- package/dist/esm/execution/result-mapper.d.ts.map +1 -1
- package/dist/esm/execution/result-mapper.js +4 -2
- package/dist/esm/execution/result-mapper.js.map +1 -1
- package/dist/esm/generator/generate-types.d.ts.map +1 -1
- package/dist/esm/generator/generate-types.js +76 -0
- package/dist/esm/generator/generate-types.js.map +1 -1
- package/dist/esm/generator/type-emitters/aggregation-emitter.d.ts.map +1 -1
- package/dist/esm/generator/type-emitters/aggregation-emitter.js +19 -7
- package/dist/esm/generator/type-emitters/aggregation-emitter.js.map +1 -1
- package/dist/esm/generator/type-emitters/input-emitter.js +13 -4
- package/dist/esm/generator/type-emitters/input-emitter.js.map +1 -1
- package/dist/esm/generator/type-emitters/model-map-emitter.d.ts +1 -0
- package/dist/esm/generator/type-emitters/model-map-emitter.d.ts.map +1 -1
- package/dist/esm/generator/type-emitters/model-map-emitter.js +5 -20
- package/dist/esm/generator/type-emitters/model-map-emitter.js.map +1 -1
- package/dist/esm/generator/type-emitters/node-type-emitter.d.ts +3 -0
- package/dist/esm/generator/type-emitters/node-type-emitter.d.ts.map +1 -1
- package/dist/esm/generator/type-emitters/node-type-emitter.js +6 -11
- package/dist/esm/generator/type-emitters/node-type-emitter.js.map +1 -1
- package/dist/esm/generator/type-emitters/select-fields-emitter.js +21 -2
- package/dist/esm/generator/type-emitters/select-fields-emitter.js.map +1 -1
- package/dist/esm/generator/type-emitters/where-emitter.js +19 -3
- package/dist/esm/generator/type-emitters/where-emitter.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.d.ts.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 +27 -13
- package/dist/esm/interface-model.js.map +1 -1
- package/dist/esm/model.d.ts.map +1 -1
- package/dist/esm/model.js +12 -0
- package/dist/esm/model.js.map +1 -1
- package/dist/esm/ogm.d.ts +22 -2
- package/dist/esm/ogm.d.ts.map +1 -1
- package/dist/esm/ogm.js +43 -6
- package/dist/esm/ogm.js.map +1 -1
- package/dist/esm/policy/nested-writes.d.ts.map +1 -1
- package/dist/esm/policy/nested-writes.js +40 -20
- package/dist/esm/policy/nested-writes.js.map +1 -1
- package/dist/esm/schema/parser.d.ts.map +1 -1
- package/dist/esm/schema/parser.js +94 -16
- package/dist/esm/schema/parser.js.map +1 -1
- package/dist/esm/schema/types.d.ts +1 -1
- package/dist/esm/schema/types.d.ts.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 +217 -13
- package/dist/esm/testing/cypher-assert.js.map +1 -1
- package/dist/esm/testing/neo4j-record-factory.d.ts +29 -2
- package/dist/esm/testing/neo4j-record-factory.d.ts.map +1 -1
- package/dist/esm/testing/neo4j-record-factory.js +93 -3
- package/dist/esm/testing/neo4j-record-factory.js.map +1 -1
- package/dist/esm/utils/cypher-field-projection.d.ts +31 -3
- package/dist/esm/utils/cypher-field-projection.d.ts.map +1 -1
- package/dist/esm/utils/cypher-field-projection.js +58 -7
- package/dist/esm/utils/cypher-field-projection.js.map +1 -1
- package/dist/esm/utils/write-coercion.d.ts +18 -0
- package/dist/esm/utils/write-coercion.d.ts.map +1 -1
- package/dist/esm/utils/write-coercion.js +73 -1
- package/dist/esm/utils/write-coercion.js.map +1 -1
- package/package.json +1 -1
|
@@ -40,9 +40,11 @@ function parseDbPushFlags(argv) {
|
|
|
40
40
|
*/
|
|
41
41
|
function renderPlan(plan, io, willDrop) {
|
|
42
42
|
if (plan.create.length === 0)
|
|
43
|
-
if (plan.orphans.length === 0
|
|
43
|
+
if (plan.orphans.length === 0 &&
|
|
44
|
+
plan.changed.length === 0 &&
|
|
45
|
+
plan.blocked.length === 0)
|
|
44
46
|
// Only claim a clean "in sync" when there is genuinely nothing to do —
|
|
45
|
-
// outstanding orphans mean
|
|
47
|
+
// outstanding orphans or changed definitions mean it is not in sync.
|
|
46
48
|
io.out('✓ No changes — constraints and indexes are in sync');
|
|
47
49
|
else
|
|
48
50
|
io.out('No constraints or indexes to create.');
|
|
@@ -53,6 +55,28 @@ function renderPlan(plan, io, willDrop) {
|
|
|
53
55
|
io.out(` ${statement.cypher}`);
|
|
54
56
|
}
|
|
55
57
|
}
|
|
58
|
+
// v2.4.8 — an equivalent constraint under another name satisfies the SDL;
|
|
59
|
+
// say which one, instead of "creating" it on every run.
|
|
60
|
+
for (const cover of plan.covered)
|
|
61
|
+
io.out(` = ${cover.statement.name} covered by ${safeDisplay(cover.by)} (equivalent constraint)`);
|
|
62
|
+
// v2.4.8 — a changed definition used to be reported "in sync". Under
|
|
63
|
+
// --force-drop it is dropped and recreated; otherwise it is left alone
|
|
64
|
+
// and the output says plainly that the schema is NOT in sync.
|
|
65
|
+
if (plan.changed.length > 0) {
|
|
66
|
+
if (willDrop)
|
|
67
|
+
io.out(`Changed — ${plan.changed.length} index definition(s) differ from the SDL; eligible to recreate (--force-drop):`);
|
|
68
|
+
else
|
|
69
|
+
io.out(`Changed — ${plan.changed.length} index definition(s) differ from the SDL — schema is NOT in sync (kept as-is; use --force-drop to recreate):`);
|
|
70
|
+
for (const change of plan.changed) {
|
|
71
|
+
io.out(` ~ ${change.statement.name}`);
|
|
72
|
+
for (const diff of change.differences)
|
|
73
|
+
io.out(` ${diff}`);
|
|
74
|
+
if (willDrop) {
|
|
75
|
+
io.out(` ${change.dropCypher}`);
|
|
76
|
+
io.out(` ${change.statement.cypher}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
56
80
|
if (plan.orphans.length > 0)
|
|
57
81
|
if (willDrop) {
|
|
58
82
|
// "eligible to drop" — this is the plan; consent is resolved afterward.
|
|
@@ -76,7 +100,7 @@ async function resolveDropConsent(plan, io, yes) {
|
|
|
76
100
|
if (io.interactive && io.confirm)
|
|
77
101
|
// Strict `=== true`: only an explicit boolean true consents, so a
|
|
78
102
|
// misbehaving embedder returning a truthy non-boolean can't authorize a drop.
|
|
79
|
-
return (await io.confirm(`Drop the ${plan.orphans.length} item(s) listed above?`)) === true
|
|
103
|
+
return (await io.confirm(`Drop the ${plan.orphans.length + plan.changed.length} item(s) listed above?`)) === true
|
|
80
104
|
? 'granted'
|
|
81
105
|
: 'declined';
|
|
82
106
|
return 'blocked';
|
|
@@ -87,19 +111,51 @@ async function applyCreates(driver, database, plan, io) {
|
|
|
87
111
|
const session = driver.session(database ? { database } : undefined);
|
|
88
112
|
try {
|
|
89
113
|
for (const statement of plan.create) {
|
|
90
|
-
|
|
91
|
-
|
|
114
|
+
let result;
|
|
115
|
+
try {
|
|
116
|
+
result = await session.run(statement.cypher);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
// v2.4.8 — an existing schema rule the plan could not see (a race,
|
|
120
|
+
// or a server that hides definition columns) used to crash the
|
|
121
|
+
// whole push with exit 1. Report it and carry on with the rest.
|
|
122
|
+
if (!isSchemaAlreadyExists(error))
|
|
123
|
+
throw error;
|
|
124
|
+
io.err(`warning: ${statement.name} not created — ${safeDisplay(error.message)}`);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
// v2.4.8 — `IF NOT EXISTS` is a silent no-op when an equivalent rule
|
|
128
|
+
// exists; only claim "created" when Neo4j says something was added.
|
|
129
|
+
const updates = result?.summary?.counters?.updates?.();
|
|
130
|
+
if (updates &&
|
|
131
|
+
(updates.constraintsAdded ?? 0) + (updates.indexesAdded ?? 0) === 0)
|
|
132
|
+
io.out(`= ${statement.name} not created — Neo4j reports an equivalent constraint or index already exists`);
|
|
133
|
+
else
|
|
134
|
+
io.out(`✓ created ${statement.name}`);
|
|
92
135
|
}
|
|
93
136
|
}
|
|
94
137
|
finally {
|
|
95
138
|
await session.close();
|
|
96
139
|
}
|
|
97
140
|
}
|
|
141
|
+
/** `Neo.ClientError.Schema.*AlreadyExists` (index / constraint / equivalent rule). */
|
|
142
|
+
function isSchemaAlreadyExists(error) {
|
|
143
|
+
const code = error?.code;
|
|
144
|
+
return (typeof code === 'string' &&
|
|
145
|
+
/^Neo\.ClientError\.Schema\.\w*AlreadyExists$/.test(code));
|
|
146
|
+
}
|
|
98
147
|
async function applyDrops(driver, database, plan, io) {
|
|
99
|
-
if (plan.orphans.length === 0)
|
|
148
|
+
if (plan.orphans.length === 0 && plan.changed.length === 0)
|
|
100
149
|
return;
|
|
101
150
|
const session = driver.session(database ? { database } : undefined);
|
|
102
151
|
try {
|
|
152
|
+
// Drop + create, in that order: `CREATE … IF NOT EXISTS` would be a
|
|
153
|
+
// no-op while the old definition still holds the name.
|
|
154
|
+
for (const change of plan.changed) {
|
|
155
|
+
await session.run(change.dropCypher);
|
|
156
|
+
await session.run(change.statement.cypher);
|
|
157
|
+
io.out(`✓ recreated ${change.statement.name}`);
|
|
158
|
+
}
|
|
103
159
|
for (const orphan of plan.orphans) {
|
|
104
160
|
await session.run(orphan.dropCypher);
|
|
105
161
|
io.out(`✓ dropped ${safeDisplay(orphan.name)}`);
|
|
@@ -124,14 +180,24 @@ export async function runDbPush(argv, io) {
|
|
|
124
180
|
try {
|
|
125
181
|
const live = await fetchLiveSchema(driver, connection.database);
|
|
126
182
|
const plan = planSchemaSync(schema, live, vectorConfig);
|
|
127
|
-
const willDrop = forceDrop && plan.orphans.length > 0;
|
|
183
|
+
const willDrop = forceDrop && (plan.orphans.length > 0 || plan.changed.length > 0);
|
|
128
184
|
renderPlan(plan, io, willDrop);
|
|
129
185
|
// `@vector` indexes without dimensions are reported, never silently
|
|
130
186
|
// skipped, and never block the rest of the plan.
|
|
187
|
+
// v2.4.8 — Neo4j refuses a unique constraint over a property a plain
|
|
188
|
+
// RANGE index already covers. Report it (the index is not grafeo's to
|
|
189
|
+
// drop) instead of letting the CREATE crash the whole push.
|
|
190
|
+
for (const block of plan.blocked)
|
|
191
|
+
io.err(`warning: ${block.statement.name} not created — index "${safeDisplay(block.by)}" ` +
|
|
192
|
+
`already covers the same label and property, and Neo4j will not add a ` +
|
|
193
|
+
`unique constraint until that index is dropped. Schema is NOT in sync.`);
|
|
131
194
|
for (const needs of plan.needsConfig)
|
|
132
195
|
io.err(`warning: vector index "${needs.indexName}" ` +
|
|
133
196
|
`(${needs.typeName}.${needs.embeddingProperty}) skipped — set ` +
|
|
134
197
|
`vectorIndexes['${needs.indexName}'].dimensions in grafeo.config.ts to create it`);
|
|
198
|
+
if (plan.changed.length > 0 && !forceDrop)
|
|
199
|
+
io.err(`warning: ${plan.changed.length} index definition(s) differ from the SDL and were NOT applied ` +
|
|
200
|
+
`(${plan.changed.map((c) => c.statement.name).join(', ')}) — re-run with --force-drop to drop and recreate them`);
|
|
135
201
|
// Nothing to create and nothing to drop → no writes (idempotent re-run).
|
|
136
202
|
if (plan.create.length === 0 && !willDrop)
|
|
137
203
|
return 0;
|
|
@@ -154,7 +220,7 @@ export async function runDbPush(argv, io) {
|
|
|
154
220
|
if (consent === 'granted')
|
|
155
221
|
await applyDrops(driver, connection.database, plan, io);
|
|
156
222
|
else if (consent === 'declined')
|
|
157
|
-
io.out('Drop declined — orphans kept.');
|
|
223
|
+
io.out('Drop declined — orphans and changed definitions kept.');
|
|
158
224
|
return 0;
|
|
159
225
|
}
|
|
160
226
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-push.js","sourceRoot":"","sources":["../../../../src/cli/commands/db-push.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAiB,MAAM,iBAAiB,CAAC;AAchE,SAAS,gBAAgB,CAAC,IAAc;IACtC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;YAC3B,IAAI,EAAE,IAAI;YACV,OAAO,EAAE;gBACP,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACvB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC5B,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC9B,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBACjC,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;aAC3B;YACD,MAAM,EAAE,IAAI;YACZ,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;QACH,OAAO,MAAqB,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,QAAQ,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,IAAc,EAAE,EAAS,EAAE,QAAiB;IAC9D,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"db-push.js","sourceRoot":"","sources":["../../../../src/cli/commands/db-push.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-seed.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/db-seed.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,EAAgB,MAAM,UAAU,CAAC;AAwGpD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"db-seed.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/db-seed.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,EAAgB,MAAM,UAAU,CAAC;AAwGpD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAwC1E"}
|
|
@@ -98,7 +98,16 @@ export async function runDbSeed(argv, io) {
|
|
|
98
98
|
// The OGM constructor parses the SDL synchronously and throws on an
|
|
99
99
|
// invalid schema — it lives inside this try so the driver created above
|
|
100
100
|
// is still closed in that case (cli-db-seed spec: close on any failure).
|
|
101
|
-
|
|
101
|
+
//
|
|
102
|
+
// v2.4.8 — target the resolved database (`--database` >
|
|
103
|
+
// `database.database` > NEO4J_DATABASE), as `db push` does. Pre-2.4.8
|
|
104
|
+
// the OGM had no database option and the seed always ran against the
|
|
105
|
+
// server's default database.
|
|
106
|
+
const ogm = new OGM({
|
|
107
|
+
typeDefs,
|
|
108
|
+
driver,
|
|
109
|
+
...(connection.database ? { database: connection.database } : {}),
|
|
110
|
+
});
|
|
102
111
|
await ogm.init();
|
|
103
112
|
io.out(`running seed ${seedPath}`);
|
|
104
113
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-seed.js","sourceRoot":"","sources":["../../../../src/cli/commands/db-seed.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"db-seed.js","sourceRoot":"","sources":["../../../../src/cli/commands/db-seed.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Driver } from 'neo4j-driver';
|
|
2
2
|
import type { LiveSchema } from './push-planner';
|
|
3
3
|
/**
|
|
4
4
|
* Fetch the live constraint/index state for the push planner. Read-only —
|
|
5
|
-
* runs exactly `SHOW CONSTRAINTS` and `SHOW INDEXES
|
|
5
|
+
* runs exactly `SHOW CONSTRAINTS` and `SHOW INDEXES YIELD *`.
|
|
6
6
|
*/
|
|
7
7
|
export declare function fetchLiveSchema(driver: Driver, database?: string): Promise<LiveSchema>;
|
|
8
8
|
//# sourceMappingURL=introspect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"introspect.d.ts","sourceRoot":"","sources":["../../../src/cli/introspect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"introspect.d.ts","sourceRoot":"","sources":["../../../src/cli/introspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,gBAAgB,CAAC;AAgGjE;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,CAAC,CAkBrB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isInt } from 'neo4j-driver';
|
|
1
2
|
/**
|
|
2
3
|
* Normalize one SHOW CONSTRAINTS / SHOW INDEXES record. Both commands
|
|
3
4
|
* expose `name` and `type` columns across the Neo4j 5.x line, but column
|
|
@@ -35,8 +36,47 @@ function toLiveItem(record) {
|
|
|
35
36
|
item.labelsOrTypes = labels;
|
|
36
37
|
if (props)
|
|
37
38
|
item.properties = props;
|
|
39
|
+
// v2.4.8 — SHOW INDEXES only: the constraint a backing index belongs to.
|
|
40
|
+
const owner = optionalGet(record, 'owningConstraint');
|
|
41
|
+
if (typeof owner === 'string' && owner.length > 0)
|
|
42
|
+
item.owningConstraint = owner;
|
|
43
|
+
// v2.4.8 — definition detail for the planner's "changed" check.
|
|
44
|
+
const entityType = optionalGet(record, 'entityType');
|
|
45
|
+
if (typeof entityType === 'string')
|
|
46
|
+
item.entityType = entityType;
|
|
47
|
+
const indexConfig = readIndexConfig(optionalGet(record, 'options'));
|
|
48
|
+
if (indexConfig)
|
|
49
|
+
item.indexConfig = indexConfig;
|
|
38
50
|
return item;
|
|
39
51
|
}
|
|
52
|
+
/** `record.get(key)`, or undefined when the server has no such column. */
|
|
53
|
+
function optionalGet(record, key) {
|
|
54
|
+
try {
|
|
55
|
+
return record.get(key);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* `options.indexConfig` as a plain object, with neo4j `Integer` / bigint
|
|
63
|
+
* values converted to numbers so the planner can compare dimensions.
|
|
64
|
+
*/
|
|
65
|
+
function readIndexConfig(options) {
|
|
66
|
+
if (!options || typeof options !== 'object')
|
|
67
|
+
return undefined;
|
|
68
|
+
const config = options.indexConfig;
|
|
69
|
+
if (!config || typeof config !== 'object')
|
|
70
|
+
return undefined;
|
|
71
|
+
const out = {};
|
|
72
|
+
for (const [key, value] of Object.entries(config))
|
|
73
|
+
out[key] = isInt(value)
|
|
74
|
+
? value.toNumber()
|
|
75
|
+
: typeof value === 'bigint'
|
|
76
|
+
? Number(value)
|
|
77
|
+
: value;
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
40
80
|
function stringList(record, key) {
|
|
41
81
|
let value;
|
|
42
82
|
try {
|
|
@@ -51,13 +91,15 @@ function stringList(record, key) {
|
|
|
51
91
|
}
|
|
52
92
|
/**
|
|
53
93
|
* Fetch the live constraint/index state for the push planner. Read-only —
|
|
54
|
-
* runs exactly `SHOW CONSTRAINTS` and `SHOW INDEXES
|
|
94
|
+
* runs exactly `SHOW CONSTRAINTS` and `SHOW INDEXES YIELD *`.
|
|
55
95
|
*/
|
|
56
96
|
export async function fetchLiveSchema(driver, database) {
|
|
57
97
|
const session = driver.session(database ? { database } : undefined);
|
|
58
98
|
try {
|
|
59
99
|
const constraintsResult = await session.run('SHOW CONSTRAINTS');
|
|
60
|
-
|
|
100
|
+
// `YIELD *` (v2.4.8): the default SHOW INDEXES columns omit `options`,
|
|
101
|
+
// which carries the vector dimensions / similarity the planner compares.
|
|
102
|
+
const indexesResult = await session.run('SHOW INDEXES YIELD *');
|
|
61
103
|
return {
|
|
62
104
|
constraints: constraintsResult.records
|
|
63
105
|
.map(toLiveItem)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"introspect.js","sourceRoot":"","sources":["../../../src/cli/introspect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"introspect.js","sourceRoot":"","sources":["../../../src/cli/introspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,19 @@ export interface LiveSchemaItem {
|
|
|
12
12
|
labelsOrTypes?: string[];
|
|
13
13
|
/** SHOW `properties` column, when the server exposes it. */
|
|
14
14
|
properties?: string[];
|
|
15
|
+
/**
|
|
16
|
+
* SHOW INDEXES `owningConstraint` column — set on the index that backs a
|
|
17
|
+
* constraint. Such a row is part of the constraint, not an index of its
|
|
18
|
+
* own (v2.4.8).
|
|
19
|
+
*/
|
|
20
|
+
owningConstraint?: string;
|
|
21
|
+
/** SHOW `entityType` column (NODE / RELATIONSHIP), when exposed. */
|
|
22
|
+
entityType?: string;
|
|
23
|
+
/**
|
|
24
|
+
* SHOW INDEXES `options.indexConfig`, with integer values as JS numbers
|
|
25
|
+
* (v2.4.8). Used to compare vector dimensions / similarity.
|
|
26
|
+
*/
|
|
27
|
+
indexConfig?: Record<string, unknown>;
|
|
15
28
|
}
|
|
16
29
|
export interface LiveSchema {
|
|
17
30
|
constraints: LiveSchemaItem[];
|
|
@@ -21,11 +34,50 @@ export interface PushPlanOrphan {
|
|
|
21
34
|
name: string;
|
|
22
35
|
dropCypher: string;
|
|
23
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* An index present under the SDL name whose live definition differs from
|
|
39
|
+
* the SDL (v2.4.8). `CREATE … IF NOT EXISTS` is a silent no-op on an
|
|
40
|
+
* existing name, so the only way to apply it is drop + create — which
|
|
41
|
+
* `db push` does only under `--force-drop` with its consent rules.
|
|
42
|
+
*/
|
|
43
|
+
export interface PushPlanChange {
|
|
44
|
+
statement: SchemaStatement;
|
|
45
|
+
/** Human-readable `what: live → SDL` lines. */
|
|
46
|
+
differences: string[];
|
|
47
|
+
dropCypher: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A desired unique constraint satisfied by an equivalent live constraint
|
|
51
|
+
* under another name (v2.4.8) — e.g. a DBA's `sx_dba_isbn` on
|
|
52
|
+
* `(:Book).isbn`. Neo4j treats `CREATE CONSTRAINT Book_isbn_unique IF NOT
|
|
53
|
+
* EXISTS` as a no-op then, so it is in sync, not something to create.
|
|
54
|
+
*/
|
|
55
|
+
export interface PushPlanCovered {
|
|
56
|
+
statement: SchemaStatement;
|
|
57
|
+
/** Live constraint name (from introspection — sanitize before printing). */
|
|
58
|
+
by: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* A desired unique constraint Neo4j will refuse to create because a plain
|
|
62
|
+
* index already covers the same label + property (v2.4.8). grafeo never
|
|
63
|
+
* drops an index it does not manage, so it is reported, not attempted.
|
|
64
|
+
*/
|
|
65
|
+
export interface PushPlanBlocked {
|
|
66
|
+
statement: SchemaStatement;
|
|
67
|
+
/** Live index name (from introspection — sanitize before printing). */
|
|
68
|
+
by: string;
|
|
69
|
+
}
|
|
24
70
|
export interface PushPlan {
|
|
25
71
|
/** Declared in SDL, missing in the database. */
|
|
26
72
|
create: SchemaStatement[];
|
|
27
|
-
/** Declared in SDL and already present. */
|
|
73
|
+
/** Declared in SDL and already present with the declared definition. */
|
|
28
74
|
inSync: SchemaStatement[];
|
|
75
|
+
/** Declared in SDL, present by name, but with a different definition. */
|
|
76
|
+
changed: PushPlanChange[];
|
|
77
|
+
/** Subset of `inSync` satisfied by an equivalent item under another name. */
|
|
78
|
+
covered: PushPlanCovered[];
|
|
79
|
+
/** Declared in SDL, missing, and not creatable as the database stands. */
|
|
80
|
+
blocked: PushPlanBlocked[];
|
|
29
81
|
/**
|
|
30
82
|
* Present in the database, attributable to grafeo by naming convention
|
|
31
83
|
* (`{Label}_{prop}_unique` over a label the schema still defines), but
|
|
@@ -43,7 +95,10 @@ export interface PushPlan {
|
|
|
43
95
|
* normalized SHOW output, tests feed it fixtures.
|
|
44
96
|
*
|
|
45
97
|
* Matching is BY NAME: grafeo names unique constraints itself, and
|
|
46
|
-
* fulltext/vector index names come verbatim from the SDL directives.
|
|
98
|
+
* fulltext/vector index names come verbatim from the SDL directives. Since
|
|
99
|
+
* v2.4.8 a name match is then checked against the live DEFINITION (labels,
|
|
100
|
+
* properties, index type, vector dimensions / similarity) when the server
|
|
101
|
+
* reports it; a mismatch is `changed`, not `inSync`.
|
|
47
102
|
*
|
|
48
103
|
* Orphan scoping (design decision): SDL index names are user-chosen, so a
|
|
49
104
|
* live index absent from the SDL cannot be attributed to grafeo — those
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-planner.d.ts","sourceRoot":"","sources":["../../../src/cli/push-planner.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"push-planner.d.ts","sourceRoot":"","sources":["../../../src/cli/push-planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,eAAe,EAEf,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAmBtD,2DAA2D;AAC3D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,eAAe,CAAC;IAC3B,+CAA+C;IAC/C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,eAAe,CAAC;IAC3B,4EAA4E;IAC5E,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,eAAe,CAAC;IAC3B,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,QAAQ;IACvB,gDAAgD;IAChD,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,wEAAwE;IACxE,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,yEAAyE;IACzE,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,6EAA6E;IAC7E,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,0EAA0E;IAC1E,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B;;;;OAIG;IACH,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,wEAAwE;IACxE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,0EAA0E;IAC1E,WAAW,EAAE,wBAAwB,EAAE,CAAC;CACzC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,UAAU,EAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,GACvD,QAAQ,CA+HV"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildNodeFulltextStatements, buildRelationshipFulltextStatements, buildUniqueConstraintStatements, buildVectorIndexStatements, uniqueConstraintName, } from '../schema/index-statements';
|
|
1
|
+
import { buildNodeFulltextStatements, buildRelationshipFulltextStatements, buildUniqueConstraintStatements, buildVectorIndexStatements, resolveRelTypeForProps, uniqueConstraintName, } from '../schema/index-statements';
|
|
2
2
|
import { assertSafeIdentifier } from '../utils/validation';
|
|
3
3
|
/**
|
|
4
4
|
* Non-throwing safe-identifier check, reusing the canonical validator. The
|
|
@@ -22,7 +22,10 @@ function isSafeIdentifier(name) {
|
|
|
22
22
|
* normalized SHOW output, tests feed it fixtures.
|
|
23
23
|
*
|
|
24
24
|
* Matching is BY NAME: grafeo names unique constraints itself, and
|
|
25
|
-
* fulltext/vector index names come verbatim from the SDL directives.
|
|
25
|
+
* fulltext/vector index names come verbatim from the SDL directives. Since
|
|
26
|
+
* v2.4.8 a name match is then checked against the live DEFINITION (labels,
|
|
27
|
+
* properties, index type, vector dimensions / similarity) when the server
|
|
28
|
+
* reports it; a mismatch is `changed`, not `inSync`.
|
|
26
29
|
*
|
|
27
30
|
* Orphan scoping (design decision): SDL index names are user-chosen, so a
|
|
28
31
|
* live index absent from the SDL cannot be attributed to grafeo — those
|
|
@@ -41,13 +44,58 @@ export function planSchemaSync(schema, live, vectorConfig) {
|
|
|
41
44
|
];
|
|
42
45
|
const liveConstraintNames = new Set(live.constraints.map((c) => c.name));
|
|
43
46
|
const liveIndexNames = new Set(live.indexes.map((i) => i.name));
|
|
47
|
+
const definitions = describeDesired(schema, vectorConfig);
|
|
48
|
+
const liveIndexesByName = new Map(live.indexes.map((i) => [i.name, i]));
|
|
44
49
|
const create = [];
|
|
45
50
|
const inSync = [];
|
|
51
|
+
const changed = [];
|
|
52
|
+
const covered = [];
|
|
53
|
+
const blocked = [];
|
|
46
54
|
for (const statement of desired) {
|
|
47
|
-
const
|
|
55
|
+
const isConstraint = statement.kind === 'unique-constraint';
|
|
56
|
+
const present = isConstraint
|
|
48
57
|
? liveConstraintNames.has(statement.name)
|
|
49
58
|
: liveIndexNames.has(statement.name);
|
|
50
|
-
(present
|
|
59
|
+
if (!present) {
|
|
60
|
+
const definition = definitions.get(statement.name);
|
|
61
|
+
if (isConstraint && definition) {
|
|
62
|
+
// v2.4.8 — match by definition, not only by name.
|
|
63
|
+
const equivalent = live.constraints.find((c) => c.type === 'UNIQUENESS' && sameSchema(definition, c));
|
|
64
|
+
if (equivalent) {
|
|
65
|
+
inSync.push(statement);
|
|
66
|
+
covered.push({ statement, by: equivalent.name });
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const blocker = live.indexes.find((i) => i.type === 'RANGE' &&
|
|
70
|
+
!i.owningConstraint &&
|
|
71
|
+
!liveConstraintNames.has(i.name) &&
|
|
72
|
+
sameSchema(definition, i));
|
|
73
|
+
if (blocker) {
|
|
74
|
+
blocked.push({ statement, by: blocker.name });
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
create.push(statement);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
// Constraints stay name-matched: grafeo names them `{Label}_{prop}_unique`
|
|
82
|
+
// itself, and a same-named constraint with another definition is not
|
|
83
|
+
// provably grafeo's, so it must never become a drop (v2.4.7 rule).
|
|
84
|
+
const definition = isConstraint
|
|
85
|
+
? undefined
|
|
86
|
+
: definitions.get(statement.name);
|
|
87
|
+
const liveItem = liveIndexesByName.get(statement.name);
|
|
88
|
+
const differences = liveItem && definition ? diffDefinition(definition, liveItem) : [];
|
|
89
|
+
if (differences.length === 0)
|
|
90
|
+
inSync.push(statement);
|
|
91
|
+
else
|
|
92
|
+
changed.push({
|
|
93
|
+
statement,
|
|
94
|
+
differences,
|
|
95
|
+
// The name is SDL-derived and already passed assertSafeIdentifier
|
|
96
|
+
// in the statement builders.
|
|
97
|
+
dropCypher: `DROP INDEX ${statement.name} IF EXISTS`,
|
|
98
|
+
});
|
|
51
99
|
}
|
|
52
100
|
const desiredConstraintNames = new Set(desired.filter((s) => s.kind === 'unique-constraint').map((s) => s.name));
|
|
53
101
|
const desiredIndexNames = new Set(desired.filter((s) => s.kind !== 'unique-constraint').map((s) => s.name));
|
|
@@ -79,11 +127,21 @@ export function planSchemaSync(schema, live, vectorConfig) {
|
|
|
79
127
|
continue;
|
|
80
128
|
if (index.type === 'LOOKUP')
|
|
81
129
|
continue;
|
|
130
|
+
// v2.4.8 — a constraint's backing index is reported by SHOW INDEXES
|
|
131
|
+
// too. It is accounted for with its constraint (in sync, orphan or
|
|
132
|
+
// unmanaged), so listing it again made every in-sync grafeo constraint
|
|
133
|
+
// show up as "Unmanaged — ignored" on rerun. Matching the live
|
|
134
|
+
// constraint name covers servers without `owningConstraint`.
|
|
135
|
+
if (index.owningConstraint || liveConstraintNames.has(index.name))
|
|
136
|
+
continue;
|
|
82
137
|
unmanaged.push(index.name);
|
|
83
138
|
}
|
|
84
139
|
return {
|
|
85
140
|
create,
|
|
86
141
|
inSync,
|
|
142
|
+
changed,
|
|
143
|
+
covered,
|
|
144
|
+
blocked,
|
|
87
145
|
orphans,
|
|
88
146
|
// Dedup: a name can surface in both SHOW CONSTRAINTS and SHOW INDEXES.
|
|
89
147
|
unmanaged: Array.from(new Set(unmanaged)),
|
|
@@ -115,4 +173,104 @@ function isGrafeoConstraint(constraint, knownLabels) {
|
|
|
115
173
|
return (knownLabels.has(label) &&
|
|
116
174
|
constraint.name === uniqueConstraintName(label, prop));
|
|
117
175
|
}
|
|
176
|
+
/**
|
|
177
|
+
* Definition of every desired statement, keyed by statement name. Walks
|
|
178
|
+
* the same schema metadata the statement builders in
|
|
179
|
+
* `schema/index-statements.ts` walk (and is fed the same vector config),
|
|
180
|
+
* so names and definitions line up one-to-one with `desired`.
|
|
181
|
+
*/
|
|
182
|
+
function describeDesired(schema, vectorConfig) {
|
|
183
|
+
const defs = new Map();
|
|
184
|
+
for (const [, nodeDef] of schema.nodes) {
|
|
185
|
+
for (const [, prop] of nodeDef.properties)
|
|
186
|
+
if (prop.isUnique)
|
|
187
|
+
defs.set(uniqueConstraintName(nodeDef.label, prop.name), {
|
|
188
|
+
type: 'UNIQUENESS',
|
|
189
|
+
entityType: 'NODE',
|
|
190
|
+
labelsOrTypes: [nodeDef.label],
|
|
191
|
+
properties: [prop.name],
|
|
192
|
+
});
|
|
193
|
+
for (const ftIndex of nodeDef.fulltextIndexes)
|
|
194
|
+
if (ftIndex.fields.length > 0)
|
|
195
|
+
defs.set(ftIndex.name, {
|
|
196
|
+
type: 'FULLTEXT',
|
|
197
|
+
entityType: 'NODE',
|
|
198
|
+
labelsOrTypes: [nodeDef.label],
|
|
199
|
+
properties: [...ftIndex.fields],
|
|
200
|
+
unorderedProperties: true,
|
|
201
|
+
});
|
|
202
|
+
for (const vIndex of nodeDef.vectorIndexes ?? []) {
|
|
203
|
+
const cfg = vectorConfig?.[vIndex.indexName];
|
|
204
|
+
if (!cfg)
|
|
205
|
+
continue;
|
|
206
|
+
defs.set(vIndex.indexName, {
|
|
207
|
+
type: 'VECTOR',
|
|
208
|
+
entityType: 'NODE',
|
|
209
|
+
labelsOrTypes: [nodeDef.label],
|
|
210
|
+
properties: [vIndex.embeddingProperty],
|
|
211
|
+
vector: {
|
|
212
|
+
dimensions: cfg.dimensions,
|
|
213
|
+
similarity: cfg.similarity ?? 'cosine',
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
for (const [, relPropsDef] of schema.relationshipProperties)
|
|
219
|
+
for (const ftIndex of relPropsDef.fulltextIndexes ?? [])
|
|
220
|
+
defs.set(ftIndex.name, {
|
|
221
|
+
type: 'FULLTEXT',
|
|
222
|
+
entityType: 'RELATIONSHIP',
|
|
223
|
+
labelsOrTypes: [resolveRelTypeForProps(schema, relPropsDef.typeName)],
|
|
224
|
+
properties: [...ftIndex.fields],
|
|
225
|
+
unorderedProperties: true,
|
|
226
|
+
});
|
|
227
|
+
return defs;
|
|
228
|
+
}
|
|
229
|
+
const fmt = (list) => `[${list.join(', ')}]`;
|
|
230
|
+
/**
|
|
231
|
+
* Compare a desired definition with the live row. Only columns the server
|
|
232
|
+
* actually reported are compared — a server (or fixture) without them
|
|
233
|
+
* keeps the pre-2.4.8 name-only behaviour, never a false "changed".
|
|
234
|
+
*/
|
|
235
|
+
function diffDefinition(want, live) {
|
|
236
|
+
const diffs = [];
|
|
237
|
+
if (live.type && live.type !== want.type)
|
|
238
|
+
diffs.push(`type: ${live.type} → ${want.type}`);
|
|
239
|
+
if (live.entityType && live.entityType !== want.entityType)
|
|
240
|
+
diffs.push(`entity: ${live.entityType} → ${want.entityType}`);
|
|
241
|
+
if (live.labelsOrTypes && !sameList(live.labelsOrTypes, want.labelsOrTypes))
|
|
242
|
+
diffs.push(`labels: ${fmt(live.labelsOrTypes)} → ${fmt(want.labelsOrTypes)}`);
|
|
243
|
+
if (live.properties &&
|
|
244
|
+
!sameList(live.properties, want.properties, want.unorderedProperties))
|
|
245
|
+
diffs.push(`properties: ${fmt(live.properties)} → ${fmt(want.properties)}`);
|
|
246
|
+
if (want.vector && live.indexConfig) {
|
|
247
|
+
const dims = live.indexConfig['vector.dimensions'];
|
|
248
|
+
if (typeof dims === 'number' && dims !== want.vector.dimensions)
|
|
249
|
+
diffs.push(`dimensions: ${dims} → ${want.vector.dimensions}`);
|
|
250
|
+
const sim = live.indexConfig['vector.similarity_function'];
|
|
251
|
+
if (typeof sim === 'string' &&
|
|
252
|
+
sim.toLowerCase() !== want.vector.similarity.toLowerCase())
|
|
253
|
+
diffs.push(`similarity: ${sim.toLowerCase()} → ${want.vector.similarity.toLowerCase()}`);
|
|
254
|
+
}
|
|
255
|
+
return diffs;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Same entity, labels and properties? Requires the live row to report its
|
|
259
|
+
* definition columns — without them nothing is ever called equivalent.
|
|
260
|
+
*/
|
|
261
|
+
function sameSchema(want, live) {
|
|
262
|
+
if (!live.labelsOrTypes || !live.properties)
|
|
263
|
+
return false;
|
|
264
|
+
if (live.entityType && live.entityType !== want.entityType)
|
|
265
|
+
return false;
|
|
266
|
+
return (sameList(live.labelsOrTypes, want.labelsOrTypes) &&
|
|
267
|
+
sameList(live.properties, want.properties));
|
|
268
|
+
}
|
|
269
|
+
function sameList(a, b, unordered = false) {
|
|
270
|
+
if (a.length !== b.length)
|
|
271
|
+
return false;
|
|
272
|
+
const x = unordered ? [...a].sort() : a;
|
|
273
|
+
const y = unordered ? [...b].sort() : b;
|
|
274
|
+
return x.every((v, i) => v === y[i]);
|
|
275
|
+
}
|
|
118
276
|
//# sourceMappingURL=push-planner.js.map
|