@linklabjs/core 0.1.2 → 0.1.3
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 +1 -1
- package/dist/scenarios/test-metro-paris/config.json +0 -6
- package/dist/scenarios/test-metro-paris/graph.json +0 -16325
- package/dist/scenarios/test-metro-paris/queries.d.ts +0 -22
- package/dist/scenarios/test-metro-paris/queries.d.ts.map +0 -1
- package/dist/scenarios/test-metro-paris/queries.js +0 -128
- package/dist/scenarios/test-metro-paris/queries.js.map +0 -1
- package/dist/scenarios/test-metro-paris/stack.json +0 -1
- package/dist/scenarios/test-musicians/config.json +0 -10
- package/dist/scenarios/test-musicians/graph.json +0 -20
- package/dist/scenarios/test-musicians/stack.json +0 -1
- package/dist/scenarios/test-netflix/actions.d.ts +0 -14
- package/dist/scenarios/test-netflix/actions.d.ts.map +0 -1
- package/dist/scenarios/test-netflix/actions.js +0 -86
- package/dist/scenarios/test-netflix/actions.js.map +0 -1
- package/dist/scenarios/test-netflix/config.json +0 -6
- package/dist/scenarios/test-netflix/data/categories.json +0 -1
- package/dist/scenarios/test-netflix/data/companies.json +0 -1
- package/dist/scenarios/test-netflix/data/credits.json +0 -19797
- package/dist/scenarios/test-netflix/data/departments.json +0 -18
- package/dist/scenarios/test-netflix/data/jobs.json +0 -142
- package/dist/scenarios/test-netflix/data/movies.json +0 -3497
- package/dist/scenarios/test-netflix/data/people.json +0 -1
- package/dist/scenarios/test-netflix/data/synonyms.json +0 -7
- package/dist/scenarios/test-netflix/data/users.json +0 -70
- package/dist/scenarios/test-netflix/graph.json +0 -1017
- package/dist/scenarios/test-netflix/queries.d.ts +0 -29
- package/dist/scenarios/test-netflix/queries.d.ts.map +0 -1
- package/dist/scenarios/test-netflix/queries.js +0 -134
- package/dist/scenarios/test-netflix/queries.js.map +0 -1
- package/dist/scenarios/test-netflix/stack.json +0 -14
- package/dist/scripts/dictionary.json +0 -796
- package/dist/scripts/graph.json +0 -664
- package/dist/scripts/regenerate.d.ts +0 -23
- package/dist/scripts/regenerate.d.ts.map +0 -1
- package/dist/scripts/regenerate.js +0 -206
- package/dist/scripts/regenerate.js.map +0 -1
- package/src/scenarios/test-metro-paris/config.json +0 -6
- package/src/scenarios/test-metro-paris/graph.json +0 -16325
- package/src/scenarios/test-metro-paris/queries.ts +0 -152
- package/src/scenarios/test-metro-paris/stack.json +0 -1
- package/src/scenarios/test-musicians/config.json +0 -10
- package/src/scenarios/test-musicians/graph.json +0 -20
- package/src/scenarios/test-musicians/stack.json +0 -1
- package/src/scenarios/test-netflix/MIGRATION.md +0 -23
- package/src/scenarios/test-netflix/README.md +0 -138
- package/src/scenarios/test-netflix/actions.ts +0 -92
- package/src/scenarios/test-netflix/config.json +0 -6
- package/src/scenarios/test-netflix/data/categories.json +0 -1
- package/src/scenarios/test-netflix/data/companies.json +0 -1
- package/src/scenarios/test-netflix/data/credits.json +0 -19797
- package/src/scenarios/test-netflix/data/departments.json +0 -18
- package/src/scenarios/test-netflix/data/jobs.json +0 -142
- package/src/scenarios/test-netflix/data/movies.json +0 -3497
- package/src/scenarios/test-netflix/data/people.json +0 -1
- package/src/scenarios/test-netflix/data/synonyms.json +0 -8
- package/src/scenarios/test-netflix/data/users.json +0 -70
- package/src/scenarios/test-netflix/graph.json +0 -1017
- package/src/scenarios/test-netflix/queries.ts +0 -159
- package/src/scenarios/test-netflix/stack.json +0 -14
- package/src/scripts/dictionary.json +0 -796
- package/src/scripts/graph.json +0 -664
- package/src/scripts/regenerate.ts +0 -248
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* regenerate.ts — Script de régénération des graphes compilés
|
|
3
|
-
*
|
|
4
|
-
* Usage :
|
|
5
|
-
* npx tsx regenerate.ts netflix
|
|
6
|
-
* npx tsx regenerate.ts dvdrental --pg host=localhost user=postgres password=secret
|
|
7
|
-
* npx tsx regenerate.ts all
|
|
8
|
-
*
|
|
9
|
-
* Régénère compiled-graph.json pour chaque scénario.
|
|
10
|
-
* Bumpe automatiquement la version dans le fichier produit.
|
|
11
|
-
*
|
|
12
|
-
* Versioning :
|
|
13
|
-
* - Graphes générés (netflix, dvdrental) : version dans compiled-graph.json
|
|
14
|
-
* format : MAJOR.MINOR.PATCH ex: 2.0.0
|
|
15
|
-
* MAJOR = version du GraphCompiler (structure breaking)
|
|
16
|
-
* MINOR = changement de schéma (nouvelles tables/relations)
|
|
17
|
-
* PATCH = recompilation (nouveaux poids, métriques)
|
|
18
|
-
*
|
|
19
|
-
* - Graphes manuels (metro, musicians) : version dans raw-graph.json + compiled
|
|
20
|
-
* Patch manuel dans raw-graph.json, puis npx tsx regenerate.ts metro
|
|
21
|
-
*/
|
|
22
|
-
import * as fs from 'fs';
|
|
23
|
-
import * as path from 'path';
|
|
24
|
-
import { fileURLToPath } from 'url';
|
|
25
|
-
import { dirname } from 'path';
|
|
26
|
-
import { JsonSchemaExtractor } from '../schema/JsonSchemaExtractor.js';
|
|
27
|
-
import { SchemaAnalyzer } from '../schema/SchemaAnalyzer.js';
|
|
28
|
-
import { GraphBuilder } from '../schema/GraphBuilder.js';
|
|
29
|
-
import { GraphAssembler } from '../graph/GraphAssembler.js';
|
|
30
|
-
import { GraphCompiler } from '../graph/GraphCompiler.js';
|
|
31
|
-
import { PathFinder } from '../core/PathFinder.js';
|
|
32
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
33
|
-
const __dirname = dirname(__filename);
|
|
34
|
-
const ROOT = path.join(__dirname, '..', 'examples');
|
|
35
|
-
const CONFIG_DIR = path.join(__dirname, '..', '..', 'config');
|
|
36
|
-
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
37
|
-
function save(filepath, data) {
|
|
38
|
-
fs.writeFileSync(filepath, JSON.stringify(data, null, 2));
|
|
39
|
-
const kb = (fs.statSync(filepath).size / 1024).toFixed(1);
|
|
40
|
-
console.log(` 💾 ${path.basename(filepath).padEnd(25)} ${kb} KB`);
|
|
41
|
-
}
|
|
42
|
-
function bumpPatch(current) {
|
|
43
|
-
const parts = current.split('.').map(Number);
|
|
44
|
-
if (parts.length !== 3 || parts.some(isNaN))
|
|
45
|
-
return '2.0.0';
|
|
46
|
-
parts[2]++;
|
|
47
|
-
return parts.join('.');
|
|
48
|
-
}
|
|
49
|
-
function readCurrentVersion(compiledPath) {
|
|
50
|
-
try {
|
|
51
|
-
const c = JSON.parse(fs.readFileSync(compiledPath, 'utf-8'));
|
|
52
|
-
return c.version ?? '2.0.0';
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
return '2.0.0';
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
// ── Entraînement local (sans provider externe) ────────────────────────────────
|
|
59
|
-
function trainLocal(graph, useCases) {
|
|
60
|
-
const metrics = new Map();
|
|
61
|
-
const finder = new PathFinder(graph);
|
|
62
|
-
for (const uc of useCases) {
|
|
63
|
-
const paths = finder.findAllPaths(uc.from, uc.to);
|
|
64
|
-
for (const p of paths) {
|
|
65
|
-
metrics.set(p.join('→'), {
|
|
66
|
-
path: p,
|
|
67
|
-
executions: 10,
|
|
68
|
-
successes: 10,
|
|
69
|
-
totalTime: 100,
|
|
70
|
-
avgTime: 10,
|
|
71
|
-
minTime: 8,
|
|
72
|
-
maxTime: 12,
|
|
73
|
-
used: true,
|
|
74
|
-
failed: false
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return metrics;
|
|
79
|
-
}
|
|
80
|
-
// ── Pipeline JSON (netflix, cinema, etc.) ─────────────────────────────────────
|
|
81
|
-
async function regenerateFromJSON(scenario) {
|
|
82
|
-
const dir = path.join(ROOT, scenario);
|
|
83
|
-
const dataDir = path.join(dir, 'data');
|
|
84
|
-
const compiledOut = path.join(dir, 'compiled-graph.json');
|
|
85
|
-
if (!fs.existsSync(dataDir)) {
|
|
86
|
-
console.error(` ❌ data/ not found: ${dataDir}`);
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
console.log(`\n🔄 ${scenario} — pipeline JSON`);
|
|
90
|
-
console.log('─'.repeat(50));
|
|
91
|
-
// Step 1 : Extraction
|
|
92
|
-
const extractor = new JsonSchemaExtractor(dataDir);
|
|
93
|
-
const techSchema = await extractor.extract();
|
|
94
|
-
save(path.join(dir, 'schema.json'), techSchema);
|
|
95
|
-
// Step 2 : Analyse
|
|
96
|
-
const analyzer = new SchemaAnalyzer(CONFIG_DIR, dataDir);
|
|
97
|
-
const analyzedSchema = analyzer.analyze(techSchema);
|
|
98
|
-
save(path.join(dir, 'analyzed-schema.json'), analyzedSchema);
|
|
99
|
-
// Step 3 : Dictionnaire
|
|
100
|
-
const builder = new GraphBuilder();
|
|
101
|
-
const dictionary = builder.build(analyzedSchema, dataDir);
|
|
102
|
-
save(path.join(dir, 'dictionary.json'), dictionary);
|
|
103
|
-
// Step 4 : Graphe brut
|
|
104
|
-
const assembler = new GraphAssembler();
|
|
105
|
-
const rawGraph = assembler.assemble(dictionary);
|
|
106
|
-
save(path.join(dir, 'raw-graph.json'), rawGraph);
|
|
107
|
-
console.log(` 📊 ${rawGraph.nodes.length} nœuds · ${rawGraph.edges.length} arêtes`);
|
|
108
|
-
// Step 5 : Use cases (lire depuis use-cases.json si présent, sinon défaut)
|
|
109
|
-
const ucFile = path.join(dir, 'use-cases.json');
|
|
110
|
-
const useCases = fs.existsSync(ucFile)
|
|
111
|
-
? JSON.parse(fs.readFileSync(ucFile, 'utf-8'))
|
|
112
|
-
: buildDefaultUseCases(rawGraph);
|
|
113
|
-
const metrics = trainLocal(rawGraph, useCases);
|
|
114
|
-
save(path.join(dir, 'metrics.json'), Object.fromEntries(metrics));
|
|
115
|
-
// Step 6 : Compilation
|
|
116
|
-
const prevVersion = readCurrentVersion(compiledOut);
|
|
117
|
-
const newVersion = bumpPatch(prevVersion);
|
|
118
|
-
const compiler = new GraphCompiler({ weightThreshold: 1000, keepFallbacks: true });
|
|
119
|
-
const compiledGraph = compiler.compile(rawGraph, metrics);
|
|
120
|
-
compiledGraph.version = newVersion;
|
|
121
|
-
compiledGraph.scenario = scenario;
|
|
122
|
-
save(compiledOut, compiledGraph);
|
|
123
|
-
const stats = GraphCompiler.getStats(compiledGraph);
|
|
124
|
-
console.log(`\n ✅ ${stats.totalRoutes} routes (${stats.physical} physical · ${stats.semantic} semantic)`);
|
|
125
|
-
console.log(` 📌 version: ${prevVersion} → ${newVersion}`);
|
|
126
|
-
}
|
|
127
|
-
// ── Pipeline manuel (metro, musicians) ───────────────────────────────────────
|
|
128
|
-
// raw-graph.json édité à la main → on recompile seulement
|
|
129
|
-
async function recompileManual(scenario) {
|
|
130
|
-
const dir = path.join(ROOT, scenario);
|
|
131
|
-
const rawPath = path.join(dir, 'raw-graph.json');
|
|
132
|
-
const compiledOut = path.join(dir, 'compiled-graph.json');
|
|
133
|
-
if (!fs.existsSync(rawPath)) {
|
|
134
|
-
console.error(` ❌ raw-graph.json not found: ${rawPath}`);
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
console.log(`\n🔄 ${scenario} — recompile manual graph`);
|
|
138
|
-
console.log('─'.repeat(50));
|
|
139
|
-
const rawGraph = JSON.parse(fs.readFileSync(rawPath, 'utf-8'));
|
|
140
|
-
const ucFile = path.join(dir, 'use-cases.json');
|
|
141
|
-
const useCases = fs.existsSync(ucFile)
|
|
142
|
-
? JSON.parse(fs.readFileSync(ucFile, 'utf-8'))
|
|
143
|
-
: buildDefaultUseCases(rawGraph);
|
|
144
|
-
const metrics = trainLocal(rawGraph, useCases);
|
|
145
|
-
const prevVersion = readCurrentVersion(compiledOut);
|
|
146
|
-
const newVersion = bumpPatch(prevVersion);
|
|
147
|
-
const compiler = new GraphCompiler({ weightThreshold: 1000, keepFallbacks: true });
|
|
148
|
-
const compiledGraph = compiler.compile(rawGraph, metrics);
|
|
149
|
-
compiledGraph.version = newVersion;
|
|
150
|
-
compiledGraph.scenario = scenario;
|
|
151
|
-
save(compiledOut, compiledGraph);
|
|
152
|
-
const stats = GraphCompiler.getStats(compiledGraph);
|
|
153
|
-
console.log(` ✅ ${stats.totalRoutes} routes (${stats.physical} physical · ${stats.semantic} semantic)`);
|
|
154
|
-
console.log(` 📌 version: ${prevVersion} → ${newVersion}`);
|
|
155
|
-
}
|
|
156
|
-
// ── Déterminer le type de scénario ────────────────────────────────────────────
|
|
157
|
-
function scenarioType(scenario) {
|
|
158
|
-
const dir = path.join(ROOT, scenario);
|
|
159
|
-
if (fs.existsSync(path.join(dir, 'data')))
|
|
160
|
-
return 'json';
|
|
161
|
-
if (fs.existsSync(path.join(dir, 'raw-graph.json')))
|
|
162
|
-
return 'manual';
|
|
163
|
-
return 'unknown';
|
|
164
|
-
}
|
|
165
|
-
function buildDefaultUseCases(graph) {
|
|
166
|
-
// Générer des use cases par défaut depuis les nœuds du graphe
|
|
167
|
-
const nodes = graph.nodes.map((n) => n.id);
|
|
168
|
-
const cases = [];
|
|
169
|
-
for (let i = 0; i < Math.min(nodes.length, 4); i++) {
|
|
170
|
-
for (let j = 0; j < Math.min(nodes.length, 4); j++) {
|
|
171
|
-
if (i !== j)
|
|
172
|
-
cases.push({ from: nodes[i], to: nodes[j], description: `${nodes[i]}→${nodes[j]}` });
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
return cases;
|
|
176
|
-
}
|
|
177
|
-
// ── Main ──────────────────────────────────────────────────────────────────────
|
|
178
|
-
async function main() {
|
|
179
|
-
const args = process.argv.slice(2);
|
|
180
|
-
const scenarios = args[0] === 'all'
|
|
181
|
-
? fs.readdirSync(ROOT).filter(d => fs.statSync(path.join(ROOT, d)).isDirectory())
|
|
182
|
-
: args.filter(a => !a.startsWith('--'));
|
|
183
|
-
if (!scenarios.length) {
|
|
184
|
-
console.log('Usage: npx tsx regenerate.ts <scenario|all> [--pg ...]');
|
|
185
|
-
console.log('Examples:');
|
|
186
|
-
console.log(' npx tsx regenerate.ts netflix');
|
|
187
|
-
console.log(' npx tsx regenerate.ts metro musicians');
|
|
188
|
-
console.log(' npx tsx regenerate.ts all');
|
|
189
|
-
process.exit(0);
|
|
190
|
-
}
|
|
191
|
-
for (const scenario of scenarios) {
|
|
192
|
-
const type = scenarioType(scenario);
|
|
193
|
-
if (type === 'json')
|
|
194
|
-
await regenerateFromJSON(scenario);
|
|
195
|
-
else if (type === 'manual')
|
|
196
|
-
await recompileManual(scenario);
|
|
197
|
-
else
|
|
198
|
-
console.warn(` ⚠️ ${scenario}: unknown scenario type (no data/ nor raw-graph.json)`);
|
|
199
|
-
}
|
|
200
|
-
console.log('\n✅ Done\n');
|
|
201
|
-
}
|
|
202
|
-
main().catch(err => {
|
|
203
|
-
console.error('❌', err);
|
|
204
|
-
process.exit(1);
|
|
205
|
-
});
|
|
206
|
-
//# sourceMappingURL=regenerate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"regenerate.js","sourceRoot":"","sources":["../../src/scripts/regenerate.ts"],"names":[],"mappings":"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"}
|