@paradigma-inc/flywheel 0.2.50 → 0.2.51
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/package.json
CHANGED
|
@@ -1,21 +1,67 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { assertAllSemanticEdgesValid, } from "../projection/rules.js";
|
|
2
2
|
import { RepositoryStoreError } from "../sqlite/errors.js";
|
|
3
|
-
import { allRows, runSql } from "../sqlite/rows.js";
|
|
3
|
+
import { allRows, iterateRows, runSql } from "../sqlite/rows.js";
|
|
4
4
|
import { SNAPSHOT_DELETE_ORDER, SNAPSHOT_TABLES } from "./schema.js";
|
|
5
5
|
import { validateSnapshotTables } from "./validate.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Validate one whole relation in O(V + E) time, retaining O(V + E) graph state
|
|
8
|
+
* until this check returns. This trades memory for avoiding repeated descendant
|
|
9
|
+
* walks for every edge; V and E are the local relation's vertices and edges.
|
|
10
|
+
*/
|
|
11
|
+
function assertAcyclicGraph(database, repositoryId, relation) {
|
|
12
|
+
const rows = iterateRows(database.prepare(relation === "lineage"
|
|
13
|
+
? "SELECT parent_node_id AS parent, child_node_id AS child FROM repository_lineage WHERE repository_id = ? AND parent_repository_id = repository_id"
|
|
14
|
+
: "SELECT container_node_id AS parent, child_node_id AS child FROM repository_containments WHERE repository_id = ?"), repositoryId);
|
|
15
|
+
const children = new Map();
|
|
16
|
+
const incoming = new Map();
|
|
17
|
+
for (const row of rows) {
|
|
18
|
+
const parent = row.parent;
|
|
19
|
+
const child = row.child;
|
|
20
|
+
const siblings = children.get(parent);
|
|
21
|
+
if (siblings === undefined)
|
|
22
|
+
children.set(parent, [child]);
|
|
23
|
+
else
|
|
24
|
+
siblings.push(child);
|
|
25
|
+
if (!incoming.has(parent))
|
|
26
|
+
incoming.set(parent, 0);
|
|
27
|
+
incoming.set(child, (incoming.get(child) ?? 0) + 1);
|
|
28
|
+
}
|
|
29
|
+
const ready = [];
|
|
30
|
+
for (const [node, count] of incoming) {
|
|
31
|
+
if (count === 0)
|
|
32
|
+
ready.push(node);
|
|
33
|
+
}
|
|
34
|
+
for (let index = 0; index < ready.length; index++) {
|
|
35
|
+
const descendants = children.get(ready[index]);
|
|
36
|
+
if (descendants === undefined)
|
|
37
|
+
continue;
|
|
38
|
+
for (const child of descendants) {
|
|
39
|
+
const remaining = incoming.get(child) - 1;
|
|
40
|
+
incoming.set(child, remaining);
|
|
41
|
+
if (remaining === 0)
|
|
42
|
+
ready.push(child);
|
|
14
43
|
}
|
|
15
44
|
}
|
|
16
|
-
|
|
17
|
-
|
|
45
|
+
if (ready.length !== incoming.size) {
|
|
46
|
+
throw new RepositoryStoreError(`${relation} cycle is invalid`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function assertProjectionInvariants(database, repositoryId) {
|
|
50
|
+
if (allRows(database.prepare(`
|
|
51
|
+
SELECT 1 FROM repository_lineage AS relation
|
|
52
|
+
LEFT JOIN repository_nodes AS child
|
|
53
|
+
ON child.repository_id = relation.repository_id AND child.node_id = relation.child_node_id
|
|
54
|
+
LEFT JOIN repository_nodes AS parent
|
|
55
|
+
ON parent.repository_id = relation.repository_id AND parent.node_id = relation.parent_node_id
|
|
56
|
+
WHERE relation.repository_id = ? AND (
|
|
57
|
+
child.lifecycle_state IS NOT 'live' OR
|
|
58
|
+
(relation.parent_repository_id = relation.repository_id AND parent.lifecycle_state IS NOT 'live')
|
|
59
|
+
) LIMIT 1
|
|
60
|
+
`), repositoryId).length > 0) {
|
|
61
|
+
throw new RepositoryStoreError("structural relation requires live repository nodes");
|
|
18
62
|
}
|
|
63
|
+
assertAcyclicGraph(database, repositoryId, "lineage");
|
|
64
|
+
assertAcyclicGraph(database, repositoryId, "containment");
|
|
19
65
|
// Migration 008 dropped the assignments→definitions foreign key to permit
|
|
20
66
|
// boundary scopes; local-scoped assignments must still resolve locally.
|
|
21
67
|
if (allRows(database.prepare("SELECT 1 FROM repository_tag_assignments"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replace.js","sourceRoot":"","sources":["../../../../src/local/store/snapshot/replace.ts"],"names":[],"mappings":"AACA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"replace.js","sourceRoot":"","sources":["../../../../src/local/store/snapshot/replace.ts"],"names":[],"mappings":"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"}
|