@x12i/analytix-tiers 1.0.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/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/package.json +19 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CataloxCommonFields } from "@x12i/analytix-contracts";
|
|
2
|
+
export interface TierDefinition extends CataloxCommonFields {
|
|
3
|
+
tierId: string;
|
|
4
|
+
levels: Array<{
|
|
5
|
+
level: number;
|
|
6
|
+
analytics: string[];
|
|
7
|
+
}>;
|
|
8
|
+
materialization: {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
storeIntermediateOutputs: boolean;
|
|
11
|
+
reuseWithinRun: boolean;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export declare class TierEngine {
|
|
15
|
+
static compileTierDag(tierDef: TierDefinition, resolveDependencies: (id: string) => string[]): string[];
|
|
16
|
+
static executeTier(tierDef: TierDefinition, executionOrder: string[], runNode: (id: string) => Promise<any>, materializationStore: Map<string, any>): Promise<Record<string, any>>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,WAAW,cAAe,SAAQ,mBAAmB;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC,CAAC;IACH,eAAe,EAAE;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,wBAAwB,EAAE,OAAO,CAAC;QAClC,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;CACH;AAED,qBAAa,UAAU;IACrB,MAAM,CAAC,cAAc,CACnB,OAAO,EAAE,cAAc,EACvB,mBAAmB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,EAAE,GAC5C,MAAM,EAAE;WAuFE,WAAW,CACtB,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,EAAE,EACxB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,EACrC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CA8BhC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TierEngine = void 0;
|
|
4
|
+
class TierEngine {
|
|
5
|
+
static compileTierDag(tierDef, resolveDependencies) {
|
|
6
|
+
// 1. Validation: levels are contiguous starting at 1
|
|
7
|
+
const levels = [...tierDef.levels].sort((a, b) => a.level - b.level);
|
|
8
|
+
for (let i = 0; i < levels.length; i++) {
|
|
9
|
+
if (levels[i].level !== i + 1) {
|
|
10
|
+
throw new Error("CATALOX_VALIDATION_FAILED");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
// 2. Collect all nodes in this tier
|
|
14
|
+
const allNodes = new Set();
|
|
15
|
+
const nodeToLevel = new Map();
|
|
16
|
+
for (const lvl of levels) {
|
|
17
|
+
for (const ref of lvl.analytics) {
|
|
18
|
+
if (allNodes.has(ref)) {
|
|
19
|
+
throw new Error("CATALOX_VALIDATION_FAILED"); // Analytic in multiple levels
|
|
20
|
+
}
|
|
21
|
+
allNodes.add(ref);
|
|
22
|
+
nodeToLevel.set(ref, lvl.level);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const inDegree = new Map();
|
|
26
|
+
const graph = new Map();
|
|
27
|
+
for (const node of allNodes) {
|
|
28
|
+
inDegree.set(node, 0);
|
|
29
|
+
graph.set(node, []);
|
|
30
|
+
}
|
|
31
|
+
// 3. Build adjacency list and in-degrees
|
|
32
|
+
for (const node of allNodes) {
|
|
33
|
+
const deps = resolveDependencies(node);
|
|
34
|
+
const level = nodeToLevel.get(node);
|
|
35
|
+
for (const dep of deps) {
|
|
36
|
+
// Ignore tier-0 source database refs
|
|
37
|
+
if (dep === "main-events-db" || dep.startsWith("source:")) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
// Dependency must be in the tier
|
|
41
|
+
if (!allNodes.has(dep)) {
|
|
42
|
+
throw new Error("TIER_DEPENDENCY_MISSING");
|
|
43
|
+
}
|
|
44
|
+
// Dependency level must be strictly less than node level
|
|
45
|
+
const depLevel = nodeToLevel.get(dep);
|
|
46
|
+
if (depLevel >= level) {
|
|
47
|
+
throw new Error("TIER_DEPENDENCY_MISSING");
|
|
48
|
+
}
|
|
49
|
+
// dep -> node edge
|
|
50
|
+
graph.get(dep).push(node);
|
|
51
|
+
inDegree.set(node, inDegree.get(node) + 1);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// 4. Kahn's Algorithm
|
|
55
|
+
const queue = [];
|
|
56
|
+
for (const node of allNodes) {
|
|
57
|
+
if (inDegree.get(node) === 0) {
|
|
58
|
+
queue.push(node);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const order = [];
|
|
62
|
+
while (queue.length > 0) {
|
|
63
|
+
const u = queue.shift();
|
|
64
|
+
order.push(u);
|
|
65
|
+
const neighbors = graph.get(u) || [];
|
|
66
|
+
for (const v of neighbors) {
|
|
67
|
+
inDegree.set(v, inDegree.get(v) - 1);
|
|
68
|
+
if (inDegree.get(v) === 0) {
|
|
69
|
+
queue.push(v);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (order.length !== allNodes.size) {
|
|
74
|
+
throw new Error("TIER_CYCLE_DETECTED");
|
|
75
|
+
}
|
|
76
|
+
return order;
|
|
77
|
+
}
|
|
78
|
+
static async executeTier(tierDef, executionOrder, runNode, materializationStore) {
|
|
79
|
+
const results = {};
|
|
80
|
+
for (const id of executionOrder) {
|
|
81
|
+
// Sibling reuse within run check
|
|
82
|
+
if (tierDef.materialization.reuseWithinRun && materializationStore.has(id)) {
|
|
83
|
+
results[id] = materializationStore.get(id);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const output = await runNode(id);
|
|
88
|
+
results[id] = output;
|
|
89
|
+
if (tierDef.materialization.storeIntermediateOutputs) {
|
|
90
|
+
materializationStore.set(id, output);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
const errorDetails = {
|
|
95
|
+
code: "TIER_DEPENDENCY_MISSING",
|
|
96
|
+
message: `Tier execution failed at dependency: ${id}`,
|
|
97
|
+
failedDependency: id,
|
|
98
|
+
upstreamError: err.message,
|
|
99
|
+
};
|
|
100
|
+
throw new Error(JSON.stringify(errorDetails));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return results;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.TierEngine = TierEngine;
|
|
107
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@x12i/analytix-tiers",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"types": "dist/index.d.ts",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"@x12i/analytix-contracts": "^1.0.0"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public",
|
|
14
|
+
"registry": "https://registry.npmjs.org/"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc -p tsconfig.json"
|
|
18
|
+
}
|
|
19
|
+
}
|