@memberjunction/db-auto-doc 2.117.0 → 2.119.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/README.md +803 -165
- package/bin/run.js +7 -0
- package/dist/api/DBAutoDocAPI.d.ts +252 -0
- package/dist/api/DBAutoDocAPI.d.ts.map +1 -0
- package/dist/api/DBAutoDocAPI.js +530 -0
- package/dist/api/DBAutoDocAPI.js.map +1 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +10 -0
- package/dist/api/index.js.map +1 -0
- package/dist/commands/analyze.d.ts +6 -4
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +58 -71
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/export.d.ts +14 -4
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +156 -61
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/generate-queries.d.ts +17 -0
- package/dist/commands/generate-queries.d.ts.map +1 -0
- package/dist/commands/generate-queries.js +182 -0
- package/dist/commands/generate-queries.js.map +1 -0
- package/dist/commands/init.d.ts +3 -4
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +206 -144
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/reset.d.ts +4 -1
- package/dist/commands/reset.d.ts.map +1 -1
- package/dist/commands/reset.js +33 -19
- package/dist/commands/reset.js.map +1 -1
- package/dist/commands/status.d.ts +10 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +66 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/AnalysisEngine.d.ts +108 -0
- package/dist/core/AnalysisEngine.d.ts.map +1 -0
- package/dist/core/AnalysisEngine.js +716 -0
- package/dist/core/AnalysisEngine.js.map +1 -0
- package/dist/core/AnalysisOrchestrator.d.ts +41 -0
- package/dist/core/AnalysisOrchestrator.d.ts.map +1 -0
- package/dist/core/AnalysisOrchestrator.js +377 -0
- package/dist/core/AnalysisOrchestrator.js.map +1 -0
- package/dist/core/BackpropagationEngine.d.ts +32 -0
- package/dist/core/BackpropagationEngine.d.ts.map +1 -0
- package/dist/core/BackpropagationEngine.js +121 -0
- package/dist/core/BackpropagationEngine.js.map +1 -0
- package/dist/core/ConvergenceDetector.d.ts +27 -0
- package/dist/core/ConvergenceDetector.d.ts.map +1 -0
- package/dist/core/ConvergenceDetector.js +92 -0
- package/dist/core/ConvergenceDetector.js.map +1 -0
- package/dist/core/GuardrailsManager.d.ts +78 -0
- package/dist/core/GuardrailsManager.d.ts.map +1 -0
- package/dist/core/GuardrailsManager.js +367 -0
- package/dist/core/GuardrailsManager.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/database/Database.d.ts +56 -0
- package/dist/database/Database.d.ts.map +1 -0
- package/dist/database/Database.js +172 -0
- package/dist/database/Database.js.map +1 -0
- package/dist/database/TopologicalSorter.d.ts +25 -0
- package/dist/database/TopologicalSorter.d.ts.map +1 -0
- package/dist/database/TopologicalSorter.js +150 -0
- package/dist/database/TopologicalSorter.js.map +1 -0
- package/dist/database/index.d.ts +6 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +14 -0
- package/dist/database/index.js.map +1 -0
- package/dist/discovery/ColumnStatsCache.d.ts +91 -0
- package/dist/discovery/ColumnStatsCache.d.ts.map +1 -0
- package/dist/discovery/ColumnStatsCache.js +231 -0
- package/dist/discovery/ColumnStatsCache.js.map +1 -0
- package/dist/discovery/DiscoveryEngine.d.ts +100 -0
- package/dist/discovery/DiscoveryEngine.d.ts.map +1 -0
- package/dist/discovery/DiscoveryEngine.js +726 -0
- package/dist/discovery/DiscoveryEngine.js.map +1 -0
- package/dist/discovery/DiscoveryTriggerAnalyzer.d.ts +57 -0
- package/dist/discovery/DiscoveryTriggerAnalyzer.d.ts.map +1 -0
- package/dist/discovery/DiscoveryTriggerAnalyzer.js +186 -0
- package/dist/discovery/DiscoveryTriggerAnalyzer.js.map +1 -0
- package/dist/discovery/FKDetector.d.ts +47 -0
- package/dist/discovery/FKDetector.d.ts.map +1 -0
- package/dist/discovery/FKDetector.js +317 -0
- package/dist/discovery/FKDetector.js.map +1 -0
- package/dist/discovery/LLMDiscoveryValidator.d.ts +64 -0
- package/dist/discovery/LLMDiscoveryValidator.d.ts.map +1 -0
- package/dist/discovery/LLMDiscoveryValidator.js +431 -0
- package/dist/discovery/LLMDiscoveryValidator.js.map +1 -0
- package/dist/discovery/LLMSanityChecker.d.ts +38 -0
- package/dist/discovery/LLMSanityChecker.d.ts.map +1 -0
- package/dist/discovery/LLMSanityChecker.js +156 -0
- package/dist/discovery/LLMSanityChecker.js.map +1 -0
- package/dist/discovery/PKDetector.d.ts +62 -0
- package/dist/discovery/PKDetector.d.ts.map +1 -0
- package/dist/discovery/PKDetector.js +436 -0
- package/dist/discovery/PKDetector.js.map +1 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +25 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/drivers/BaseAutoDocDriver.d.ts +132 -0
- package/dist/drivers/BaseAutoDocDriver.d.ts.map +1 -0
- package/dist/drivers/BaseAutoDocDriver.js +121 -0
- package/dist/drivers/BaseAutoDocDriver.js.map +1 -0
- package/dist/drivers/MySQLDriver.d.ts +61 -0
- package/dist/drivers/MySQLDriver.d.ts.map +1 -0
- package/dist/drivers/MySQLDriver.js +668 -0
- package/dist/drivers/MySQLDriver.js.map +1 -0
- package/dist/drivers/PostgreSQLDriver.d.ts +65 -0
- package/dist/drivers/PostgreSQLDriver.d.ts.map +1 -0
- package/dist/drivers/PostgreSQLDriver.js +704 -0
- package/dist/drivers/PostgreSQLDriver.js.map +1 -0
- package/dist/drivers/SQLServerDriver.d.ts +61 -0
- package/dist/drivers/SQLServerDriver.d.ts.map +1 -0
- package/dist/drivers/SQLServerDriver.js +667 -0
- package/dist/drivers/SQLServerDriver.js.map +1 -0
- package/dist/generators/CSVGenerator.d.ts +35 -0
- package/dist/generators/CSVGenerator.d.ts.map +1 -0
- package/dist/generators/CSVGenerator.js +154 -0
- package/dist/generators/CSVGenerator.js.map +1 -0
- package/dist/generators/HTMLGenerator.d.ts +29 -0
- package/dist/generators/HTMLGenerator.d.ts.map +1 -0
- package/dist/generators/HTMLGenerator.js +710 -0
- package/dist/generators/HTMLGenerator.js.map +1 -0
- package/dist/generators/MarkdownGenerator.d.ts +27 -0
- package/dist/generators/MarkdownGenerator.d.ts.map +1 -0
- package/dist/generators/MarkdownGenerator.js +361 -0
- package/dist/generators/MarkdownGenerator.js.map +1 -0
- package/dist/generators/MermaidGenerator.d.ts +35 -0
- package/dist/generators/MermaidGenerator.d.ts.map +1 -0
- package/dist/generators/MermaidGenerator.js +321 -0
- package/dist/generators/MermaidGenerator.js.map +1 -0
- package/dist/generators/ReportGenerator.d.ts +22 -0
- package/dist/generators/ReportGenerator.d.ts.map +1 -0
- package/dist/generators/ReportGenerator.js +176 -0
- package/dist/generators/ReportGenerator.js.map +1 -0
- package/dist/generators/SQLGenerator.d.ts +31 -0
- package/dist/generators/SQLGenerator.d.ts.map +1 -0
- package/dist/generators/SQLGenerator.js +168 -0
- package/dist/generators/SQLGenerator.js.map +1 -0
- package/dist/generators/SampleQueryGenerator.d.ts +64 -0
- package/dist/generators/SampleQueryGenerator.d.ts.map +1 -0
- package/dist/generators/SampleQueryGenerator.js +500 -0
- package/dist/generators/SampleQueryGenerator.js.map +1 -0
- package/dist/generators/index.d.ts +10 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +19 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/index.d.ts +11 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -20
- package/dist/index.js.map +1 -1
- package/dist/prompts/PromptEngine.d.ts +65 -0
- package/dist/prompts/PromptEngine.d.ts.map +1 -0
- package/dist/prompts/PromptEngine.js +305 -0
- package/dist/prompts/PromptEngine.js.map +1 -0
- package/dist/prompts/PromptFileLoader.d.ts +21 -0
- package/dist/prompts/PromptFileLoader.d.ts.map +1 -0
- package/dist/prompts/PromptFileLoader.js +74 -0
- package/dist/prompts/PromptFileLoader.js.map +1 -0
- package/dist/prompts/index.d.ts +6 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +11 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/state/IterationTracker.d.ts +64 -0
- package/dist/state/IterationTracker.d.ts.map +1 -0
- package/dist/state/IterationTracker.js +136 -0
- package/dist/state/IterationTracker.js.map +1 -0
- package/dist/state/StateManager.d.ts +79 -0
- package/dist/state/StateManager.d.ts.map +1 -0
- package/dist/state/StateManager.js +348 -0
- package/dist/state/StateManager.js.map +1 -0
- package/dist/state/StateValidator.d.ts +24 -0
- package/dist/state/StateValidator.d.ts.map +1 -0
- package/dist/state/StateValidator.js +147 -0
- package/dist/state/StateValidator.js.map +1 -0
- package/dist/state/index.d.ts +7 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +13 -0
- package/dist/state/index.js.map +1 -0
- package/dist/types/analysis.d.ts +76 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +6 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/config.d.ts +143 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +7 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/discovery.d.ts +277 -0
- package/dist/types/discovery.d.ts.map +1 -0
- package/dist/types/discovery.js +7 -0
- package/dist/types/discovery.js.map +1 -0
- package/dist/types/driver.d.ts +148 -0
- package/dist/types/driver.d.ts.map +1 -0
- package/dist/types/driver.js +7 -0
- package/dist/types/driver.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/prompts.d.ts +158 -0
- package/dist/types/prompts.d.ts.map +1 -0
- package/dist/types/prompts.js +6 -0
- package/dist/types/prompts.js.map +1 -0
- package/dist/types/sample-queries.d.ts +172 -0
- package/dist/types/sample-queries.d.ts.map +1 -0
- package/dist/types/sample-queries.js +7 -0
- package/dist/types/sample-queries.js.map +1 -0
- package/dist/types/state.d.ts +291 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +7 -0
- package/dist/types/state.js.map +1 -0
- package/dist/utils/config-loader.d.ts +29 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +163 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +28 -3
- package/dist/ai/simple-ai-client.d.ts +0 -70
- package/dist/ai/simple-ai-client.d.ts.map +0 -1
- package/dist/ai/simple-ai-client.js +0 -181
- package/dist/ai/simple-ai-client.js.map +0 -1
- package/dist/analyzers/analyzer.d.ts +0 -23
- package/dist/analyzers/analyzer.d.ts.map +0 -1
- package/dist/analyzers/analyzer.js +0 -127
- package/dist/analyzers/analyzer.js.map +0 -1
- package/dist/cli-old/cli.d.ts +0 -3
- package/dist/cli-old/cli.d.ts.map +0 -1
- package/dist/cli-old/cli.js +0 -388
- package/dist/cli-old/cli.js.map +0 -1
- package/dist/commands/review.d.ts +0 -11
- package/dist/commands/review.d.ts.map +0 -1
- package/dist/commands/review.js +0 -82
- package/dist/commands/review.js.map +0 -1
- package/dist/database/connection.d.ts +0 -40
- package/dist/database/connection.d.ts.map +0 -1
- package/dist/database/connection.js +0 -136
- package/dist/database/connection.js.map +0 -1
- package/dist/database/introspection.d.ts +0 -59
- package/dist/database/introspection.d.ts.map +0 -1
- package/dist/database/introspection.js +0 -124
- package/dist/database/introspection.js.map +0 -1
- package/dist/generators/markdown-generator.d.ts +0 -8
- package/dist/generators/markdown-generator.d.ts.map +0 -1
- package/dist/generators/markdown-generator.js +0 -106
- package/dist/generators/markdown-generator.js.map +0 -1
- package/dist/generators/sql-generator.d.ts +0 -20
- package/dist/generators/sql-generator.d.ts.map +0 -1
- package/dist/generators/sql-generator.js +0 -83
- package/dist/generators/sql-generator.js.map +0 -1
- package/dist/state/state-manager.d.ts +0 -95
- package/dist/state/state-manager.d.ts.map +0 -1
- package/dist/state/state-manager.js +0 -236
- package/dist/state/state-manager.js.map +0 -1
- package/dist/types/state-file.d.ts +0 -124
- package/dist/types/state-file.d.ts.map +0 -1
- package/dist/types/state-file.js +0 -79
- package/dist/types/state-file.js.map +0 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Topological sorting of database tables based on foreign key dependencies
|
|
3
|
+
* Implements Kahn's algorithm
|
|
4
|
+
*/
|
|
5
|
+
import { SchemaDefinition } from '../types/state.js';
|
|
6
|
+
import { DependencyGraph, TableNode } from '../types/analysis.js';
|
|
7
|
+
export declare class TopologicalSorter {
|
|
8
|
+
/**
|
|
9
|
+
* Build dependency graph and sort topologically
|
|
10
|
+
*/
|
|
11
|
+
buildAndSort(schemas: SchemaDefinition[]): DependencyGraph;
|
|
12
|
+
/**
|
|
13
|
+
* Build dependency graph from schemas
|
|
14
|
+
*/
|
|
15
|
+
private buildGraph;
|
|
16
|
+
/**
|
|
17
|
+
* Perform topological sort using Kahn's algorithm
|
|
18
|
+
*/
|
|
19
|
+
private sort;
|
|
20
|
+
/**
|
|
21
|
+
* Detect cycles in the dependency graph
|
|
22
|
+
*/
|
|
23
|
+
detectCycles(nodes: Map<string, TableNode>): string[][];
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=TopologicalSorter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TopologicalSorter.d.ts","sourceRoot":"","sources":["../../src/database/TopologicalSorter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAElE,qBAAa,iBAAiB;IAC5B;;OAEG;IACI,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,eAAe;IAUjE;;OAEG;IACH,OAAO,CAAC,UAAU;IAyClB;;OAEG;IACH,OAAO,CAAC,IAAI;IAsEZ;;OAEG;IACI,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,EAAE,EAAE;CAiC/D"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Topological sorting of database tables based on foreign key dependencies
|
|
4
|
+
* Implements Kahn's algorithm
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.TopologicalSorter = void 0;
|
|
8
|
+
class TopologicalSorter {
|
|
9
|
+
/**
|
|
10
|
+
* Build dependency graph and sort topologically
|
|
11
|
+
*/
|
|
12
|
+
buildAndSort(schemas) {
|
|
13
|
+
// Build graph from schemas
|
|
14
|
+
const nodes = this.buildGraph(schemas);
|
|
15
|
+
// Perform topological sort
|
|
16
|
+
const levels = this.sort(nodes);
|
|
17
|
+
return { nodes, levels };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build dependency graph from schemas
|
|
21
|
+
*/
|
|
22
|
+
buildGraph(schemas) {
|
|
23
|
+
const nodes = new Map();
|
|
24
|
+
// Create all nodes first
|
|
25
|
+
for (const schema of schemas) {
|
|
26
|
+
for (const table of schema.tables) {
|
|
27
|
+
const fullName = `${schema.name}.${table.name}`;
|
|
28
|
+
nodes.set(fullName, {
|
|
29
|
+
schema: schema.name,
|
|
30
|
+
table: table.name,
|
|
31
|
+
fullName,
|
|
32
|
+
dependsOn: [],
|
|
33
|
+
dependents: [],
|
|
34
|
+
level: -1,
|
|
35
|
+
tableDefinition: table
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Wire up dependencies
|
|
40
|
+
for (const schema of schemas) {
|
|
41
|
+
for (const table of schema.tables) {
|
|
42
|
+
const fullName = `${schema.name}.${table.name}`;
|
|
43
|
+
const node = nodes.get(fullName);
|
|
44
|
+
// Add dependencies
|
|
45
|
+
for (const dep of table.dependsOn) {
|
|
46
|
+
const depFullName = `${dep.schema}.${dep.table}`;
|
|
47
|
+
const depNode = nodes.get(depFullName);
|
|
48
|
+
if (depNode) {
|
|
49
|
+
node.dependsOn.push(depNode);
|
|
50
|
+
depNode.dependents.push(node);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return nodes;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Perform topological sort using Kahn's algorithm
|
|
59
|
+
*/
|
|
60
|
+
sort(nodes) {
|
|
61
|
+
const levels = [];
|
|
62
|
+
const inDegree = new Map();
|
|
63
|
+
const processed = new Set();
|
|
64
|
+
// Calculate in-degrees
|
|
65
|
+
for (const [fullName, node] of nodes) {
|
|
66
|
+
inDegree.set(fullName, node.dependsOn.length);
|
|
67
|
+
}
|
|
68
|
+
let currentLevel = 0;
|
|
69
|
+
while (processed.size < nodes.size) {
|
|
70
|
+
// Find all nodes with in-degree 0 (no unprocessed dependencies)
|
|
71
|
+
const currentLevelNodes = [];
|
|
72
|
+
for (const [fullName, node] of nodes) {
|
|
73
|
+
if (!processed.has(fullName) && inDegree.get(fullName) === 0) {
|
|
74
|
+
currentLevelNodes.push(node);
|
|
75
|
+
node.level = currentLevel;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Check for cycles
|
|
79
|
+
if (currentLevelNodes.length === 0 && processed.size < nodes.size) {
|
|
80
|
+
// We have a cycle - find remaining nodes and assign them to current level
|
|
81
|
+
const remaining = [];
|
|
82
|
+
for (const [fullName, node] of nodes) {
|
|
83
|
+
if (!processed.has(fullName)) {
|
|
84
|
+
node.level = currentLevel;
|
|
85
|
+
remaining.push(node);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (remaining.length > 0) {
|
|
89
|
+
levels.push(remaining);
|
|
90
|
+
}
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
// Add current level to results
|
|
94
|
+
if (currentLevelNodes.length > 0) {
|
|
95
|
+
levels.push(currentLevelNodes);
|
|
96
|
+
// Mark nodes as processed
|
|
97
|
+
for (const node of currentLevelNodes) {
|
|
98
|
+
processed.add(node.fullName);
|
|
99
|
+
// Decrement in-degree for dependents
|
|
100
|
+
for (const dependent of node.dependents) {
|
|
101
|
+
const currentInDegree = inDegree.get(dependent.fullName);
|
|
102
|
+
inDegree.set(dependent.fullName, currentInDegree - 1);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
currentLevel++;
|
|
107
|
+
}
|
|
108
|
+
// Update table definitions with dependency level
|
|
109
|
+
for (const [fullName, node] of nodes) {
|
|
110
|
+
if (node.tableDefinition) {
|
|
111
|
+
node.tableDefinition.dependencyLevel = node.level;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return levels;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Detect cycles in the dependency graph
|
|
118
|
+
*/
|
|
119
|
+
detectCycles(nodes) {
|
|
120
|
+
const cycles = [];
|
|
121
|
+
const visited = new Set();
|
|
122
|
+
const recursionStack = new Set();
|
|
123
|
+
const dfs = (node, path) => {
|
|
124
|
+
visited.add(node.fullName);
|
|
125
|
+
recursionStack.add(node.fullName);
|
|
126
|
+
path.push(node.fullName);
|
|
127
|
+
for (const dep of node.dependsOn) {
|
|
128
|
+
if (!visited.has(dep.fullName)) {
|
|
129
|
+
dfs(dep, [...path]);
|
|
130
|
+
}
|
|
131
|
+
else if (recursionStack.has(dep.fullName)) {
|
|
132
|
+
// Found a cycle
|
|
133
|
+
const cycleStart = path.indexOf(dep.fullName);
|
|
134
|
+
const cycle = path.slice(cycleStart);
|
|
135
|
+
cycle.push(dep.fullName);
|
|
136
|
+
cycles.push(cycle);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
recursionStack.delete(node.fullName);
|
|
140
|
+
};
|
|
141
|
+
for (const [fullName, node] of nodes) {
|
|
142
|
+
if (!visited.has(fullName)) {
|
|
143
|
+
dfs(node, []);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return cycles;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.TopologicalSorter = TopologicalSorter;
|
|
150
|
+
//# sourceMappingURL=TopologicalSorter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TopologicalSorter.js","sourceRoot":"","sources":["../../src/database/TopologicalSorter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Exports for database module
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TopologicalSorter = exports.createDriver = exports.DataSampler = exports.Introspector = exports.DatabaseConnection = void 0;
|
|
7
|
+
var Database_js_1 = require("./Database.js");
|
|
8
|
+
Object.defineProperty(exports, "DatabaseConnection", { enumerable: true, get: function () { return Database_js_1.DatabaseConnection; } });
|
|
9
|
+
Object.defineProperty(exports, "Introspector", { enumerable: true, get: function () { return Database_js_1.Introspector; } });
|
|
10
|
+
Object.defineProperty(exports, "DataSampler", { enumerable: true, get: function () { return Database_js_1.DataSampler; } });
|
|
11
|
+
Object.defineProperty(exports, "createDriver", { enumerable: true, get: function () { return Database_js_1.createDriver; } });
|
|
12
|
+
var TopologicalSorter_js_1 = require("./TopologicalSorter.js");
|
|
13
|
+
Object.defineProperty(exports, "TopologicalSorter", { enumerable: true, get: function () { return TopologicalSorter_js_1.TopologicalSorter; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,6CAA4F;AAAnF,iHAAA,kBAAkB,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,0GAAA,WAAW,OAAA;AAAE,2GAAA,YAAY,OAAA;AACpE,+DAA2D;AAAlD,yHAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Column Statistics Cache
|
|
3
|
+
* Stores pre-computed column statistics to avoid redundant database queries
|
|
4
|
+
* Used across discovery and analysis phases
|
|
5
|
+
*/
|
|
6
|
+
import { CachedColumnStats, TableStatsCache } from '../types/discovery.js';
|
|
7
|
+
export declare class ColumnStatsCache {
|
|
8
|
+
private tableCache;
|
|
9
|
+
/**
|
|
10
|
+
* Get table key for cache lookup
|
|
11
|
+
*/
|
|
12
|
+
private getTableKey;
|
|
13
|
+
/**
|
|
14
|
+
* Get column key for cache lookup
|
|
15
|
+
*/
|
|
16
|
+
private getColumnKey;
|
|
17
|
+
/**
|
|
18
|
+
* Store column statistics
|
|
19
|
+
*/
|
|
20
|
+
setColumnStats(stats: CachedColumnStats): void;
|
|
21
|
+
/**
|
|
22
|
+
* Get column statistics
|
|
23
|
+
*/
|
|
24
|
+
getColumnStats(schemaName: string, tableName: string, columnName: string): CachedColumnStats | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Get all column statistics for a table
|
|
27
|
+
*/
|
|
28
|
+
getTableStats(schemaName: string, tableName: string): TableStatsCache | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Get all columns in a table
|
|
31
|
+
*/
|
|
32
|
+
getTableColumns(schemaName: string, tableName: string): CachedColumnStats[];
|
|
33
|
+
/**
|
|
34
|
+
* Check if column stats exist
|
|
35
|
+
*/
|
|
36
|
+
hasColumnStats(schemaName: string, tableName: string, columnName: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Check if table stats exist
|
|
39
|
+
*/
|
|
40
|
+
hasTableStats(schemaName: string, tableName: string): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Get all tables with cached stats
|
|
43
|
+
*/
|
|
44
|
+
getAllTables(): TableStatsCache[];
|
|
45
|
+
/**
|
|
46
|
+
* Find columns matching a pattern across all tables
|
|
47
|
+
* Useful for finding potential FK relationships
|
|
48
|
+
*/
|
|
49
|
+
findColumnsMatching(predicate: (stats: CachedColumnStats) => boolean): CachedColumnStats[];
|
|
50
|
+
/**
|
|
51
|
+
* Find columns with similar names across tables
|
|
52
|
+
* Example: Find all columns named "*_id" or "*ID"
|
|
53
|
+
*/
|
|
54
|
+
findColumnsByNamePattern(pattern: RegExp): CachedColumnStats[];
|
|
55
|
+
/**
|
|
56
|
+
* Find highly unique columns (potential PKs)
|
|
57
|
+
*/
|
|
58
|
+
findUniqueColumns(minUniqueness?: number): CachedColumnStats[];
|
|
59
|
+
/**
|
|
60
|
+
* Find columns with same name across multiple tables
|
|
61
|
+
* Returns Map of columnName -> array of CachedColumnStats
|
|
62
|
+
*/
|
|
63
|
+
findDuplicateColumnNames(): Map<string, CachedColumnStats[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Get cache statistics
|
|
66
|
+
*/
|
|
67
|
+
getCacheStats(): {
|
|
68
|
+
totalTables: number;
|
|
69
|
+
totalColumns: number;
|
|
70
|
+
totalStatsBytes: number;
|
|
71
|
+
avgColumnsPerTable: number;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Clear all cached stats
|
|
75
|
+
*/
|
|
76
|
+
clear(): void;
|
|
77
|
+
/**
|
|
78
|
+
* Export cache to JSON for persistence in state file
|
|
79
|
+
*/
|
|
80
|
+
toStateJSON(): import('../types/state.js').ColumnStatisticsCache;
|
|
81
|
+
/**
|
|
82
|
+
* Import cache from state JSON
|
|
83
|
+
*/
|
|
84
|
+
fromStateJSON(data: import('../types/state.js').ColumnStatisticsCache): void;
|
|
85
|
+
/**
|
|
86
|
+
* Merge cached stats into schema column definitions
|
|
87
|
+
* Replaces separate columnStatistics cache with embedded stats
|
|
88
|
+
*/
|
|
89
|
+
mergeIntoSchemas(schemas: import('../types/state.js').SchemaDefinition[]): void;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=ColumnStatsCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColumnStatsCache.d.ts","sourceRoot":"","sources":["../../src/discovery/ColumnStatsCache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE3E,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAA2C;IAE7D;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAkBrD;;OAEG;IACI,cAAc,CACnB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,iBAAiB,GAAG,SAAS;IAMhC;;OAEG;IACI,aAAa,CAClB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,eAAe,GAAG,SAAS;IAK9B;;OAEG;IACI,eAAe,CACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,iBAAiB,EAAE;IAKtB;;OAEG;IACI,cAAc,CACnB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO;IAIV;;OAEG;IACI,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpE;;OAEG;IACI,YAAY,IAAI,eAAe,EAAE;IAIxC;;;OAGG;IACI,mBAAmB,CACxB,SAAS,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,GAC/C,iBAAiB,EAAE;IActB;;;OAGG;IACI,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAIrE;;OAEG;IACI,iBAAiB,CAAC,aAAa,GAAE,MAAa,GAAG,iBAAiB,EAAE;IAM3E;;;OAGG;IACI,wBAAwB,IAAI,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAiBnE;;OAEG;IACI,aAAa,IAAI;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,EAAE,MAAM,CAAC;KAC5B;IAmBD;;OAEG;IACI,KAAK,IAAI,IAAI;IAIpB;;OAEG;IACI,WAAW,IAAI,OAAO,mBAAmB,EAAE,qBAAqB;IA2BvE;;OAEG;IACI,aAAa,CAAC,IAAI,EAAE,OAAO,mBAAmB,EAAE,qBAAqB,GAAG,IAAI;IAmBnF;;;OAGG;IACI,gBAAgB,CAAC,OAAO,EAAE,OAAO,mBAAmB,EAAE,gBAAgB,EAAE,GAAG,IAAI;CAgCvF"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Column Statistics Cache
|
|
4
|
+
* Stores pre-computed column statistics to avoid redundant database queries
|
|
5
|
+
* Used across discovery and analysis phases
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.ColumnStatsCache = void 0;
|
|
9
|
+
class ColumnStatsCache {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.tableCache = new Map();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get table key for cache lookup
|
|
15
|
+
*/
|
|
16
|
+
getTableKey(schemaName, tableName) {
|
|
17
|
+
return `${schemaName}.${tableName}`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get column key for cache lookup
|
|
21
|
+
*/
|
|
22
|
+
getColumnKey(schemaName, tableName, columnName) {
|
|
23
|
+
return `${schemaName}.${tableName}.${columnName}`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Store column statistics
|
|
27
|
+
*/
|
|
28
|
+
setColumnStats(stats) {
|
|
29
|
+
const tableKey = this.getTableKey(stats.schemaName, stats.tableName);
|
|
30
|
+
let tableStats = this.tableCache.get(tableKey);
|
|
31
|
+
if (!tableStats) {
|
|
32
|
+
tableStats = {
|
|
33
|
+
schemaName: stats.schemaName,
|
|
34
|
+
tableName: stats.tableName,
|
|
35
|
+
totalRows: stats.totalRows,
|
|
36
|
+
columns: new Map(),
|
|
37
|
+
computedAt: stats.computedAt
|
|
38
|
+
};
|
|
39
|
+
this.tableCache.set(tableKey, tableStats);
|
|
40
|
+
}
|
|
41
|
+
tableStats.columns.set(stats.columnName, stats);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get column statistics
|
|
45
|
+
*/
|
|
46
|
+
getColumnStats(schemaName, tableName, columnName) {
|
|
47
|
+
const tableKey = this.getTableKey(schemaName, tableName);
|
|
48
|
+
const tableStats = this.tableCache.get(tableKey);
|
|
49
|
+
return tableStats?.columns.get(columnName);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get all column statistics for a table
|
|
53
|
+
*/
|
|
54
|
+
getTableStats(schemaName, tableName) {
|
|
55
|
+
const tableKey = this.getTableKey(schemaName, tableName);
|
|
56
|
+
return this.tableCache.get(tableKey);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get all columns in a table
|
|
60
|
+
*/
|
|
61
|
+
getTableColumns(schemaName, tableName) {
|
|
62
|
+
const tableStats = this.getTableStats(schemaName, tableName);
|
|
63
|
+
return tableStats ? Array.from(tableStats.columns.values()) : [];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Check if column stats exist
|
|
67
|
+
*/
|
|
68
|
+
hasColumnStats(schemaName, tableName, columnName) {
|
|
69
|
+
return this.getColumnStats(schemaName, tableName, columnName) !== undefined;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if table stats exist
|
|
73
|
+
*/
|
|
74
|
+
hasTableStats(schemaName, tableName) {
|
|
75
|
+
return this.getTableStats(schemaName, tableName) !== undefined;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get all tables with cached stats
|
|
79
|
+
*/
|
|
80
|
+
getAllTables() {
|
|
81
|
+
return Array.from(this.tableCache.values());
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Find columns matching a pattern across all tables
|
|
85
|
+
* Useful for finding potential FK relationships
|
|
86
|
+
*/
|
|
87
|
+
findColumnsMatching(predicate) {
|
|
88
|
+
const results = [];
|
|
89
|
+
for (const tableStats of this.tableCache.values()) {
|
|
90
|
+
for (const columnStats of tableStats.columns.values()) {
|
|
91
|
+
if (predicate(columnStats)) {
|
|
92
|
+
results.push(columnStats);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return results;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Find columns with similar names across tables
|
|
100
|
+
* Example: Find all columns named "*_id" or "*ID"
|
|
101
|
+
*/
|
|
102
|
+
findColumnsByNamePattern(pattern) {
|
|
103
|
+
return this.findColumnsMatching(stats => pattern.test(stats.columnName));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Find highly unique columns (potential PKs)
|
|
107
|
+
*/
|
|
108
|
+
findUniqueColumns(minUniqueness = 0.95) {
|
|
109
|
+
return this.findColumnsMatching(stats => stats.uniqueness >= minUniqueness && stats.nullCount === 0);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Find columns with same name across multiple tables
|
|
113
|
+
* Returns Map of columnName -> array of CachedColumnStats
|
|
114
|
+
*/
|
|
115
|
+
findDuplicateColumnNames() {
|
|
116
|
+
const columnMap = new Map();
|
|
117
|
+
for (const tableStats of this.tableCache.values()) {
|
|
118
|
+
for (const columnStats of tableStats.columns.values()) {
|
|
119
|
+
const existing = columnMap.get(columnStats.columnName) || [];
|
|
120
|
+
existing.push(columnStats);
|
|
121
|
+
columnMap.set(columnStats.columnName, existing);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Filter to only columns that appear in multiple tables
|
|
125
|
+
return new Map(Array.from(columnMap.entries()).filter(([_, stats]) => stats.length > 1));
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get cache statistics
|
|
129
|
+
*/
|
|
130
|
+
getCacheStats() {
|
|
131
|
+
let totalColumns = 0;
|
|
132
|
+
let totalStatsBytes = 0;
|
|
133
|
+
for (const tableStats of this.tableCache.values()) {
|
|
134
|
+
totalColumns += tableStats.columns.size;
|
|
135
|
+
// Rough estimate of memory usage
|
|
136
|
+
totalStatsBytes += JSON.stringify(Array.from(tableStats.columns.values())).length;
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
totalTables: this.tableCache.size,
|
|
140
|
+
totalColumns,
|
|
141
|
+
totalStatsBytes,
|
|
142
|
+
avgColumnsPerTable: this.tableCache.size > 0 ? totalColumns / this.tableCache.size : 0
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Clear all cached stats
|
|
147
|
+
*/
|
|
148
|
+
clear() {
|
|
149
|
+
this.tableCache.clear();
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Export cache to JSON for persistence in state file
|
|
153
|
+
*/
|
|
154
|
+
toStateJSON() {
|
|
155
|
+
let totalColumns = 0;
|
|
156
|
+
const tables = {};
|
|
157
|
+
for (const [key, tableStats] of this.tableCache.entries()) {
|
|
158
|
+
const columns = Array.from(tableStats.columns.values());
|
|
159
|
+
totalColumns += columns.length;
|
|
160
|
+
tables[key] = {
|
|
161
|
+
schemaName: tableStats.schemaName,
|
|
162
|
+
tableName: tableStats.tableName,
|
|
163
|
+
totalRows: tableStats.totalRows,
|
|
164
|
+
columns
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
computedAt: new Date().toISOString(),
|
|
169
|
+
totalSchemas: new Set(Array.from(this.tableCache.values()).map(t => t.schemaName)).size,
|
|
170
|
+
totalTables: this.tableCache.size,
|
|
171
|
+
totalColumns,
|
|
172
|
+
tables
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Import cache from state JSON
|
|
177
|
+
*/
|
|
178
|
+
fromStateJSON(data) {
|
|
179
|
+
this.clear();
|
|
180
|
+
for (const [key, tableEntry] of Object.entries(data.tables)) {
|
|
181
|
+
const columnMap = new Map();
|
|
182
|
+
for (const col of tableEntry.columns) {
|
|
183
|
+
columnMap.set(col.columnName, col);
|
|
184
|
+
}
|
|
185
|
+
this.tableCache.set(key, {
|
|
186
|
+
schemaName: tableEntry.schemaName,
|
|
187
|
+
tableName: tableEntry.tableName,
|
|
188
|
+
totalRows: tableEntry.totalRows,
|
|
189
|
+
columns: columnMap,
|
|
190
|
+
computedAt: data.computedAt
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Merge cached stats into schema column definitions
|
|
196
|
+
* Replaces separate columnStatistics cache with embedded stats
|
|
197
|
+
*/
|
|
198
|
+
mergeIntoSchemas(schemas) {
|
|
199
|
+
for (const schema of schemas) {
|
|
200
|
+
for (const table of schema.tables) {
|
|
201
|
+
const cacheKey = `${schema.name}.${table.name}`;
|
|
202
|
+
const tableStats = this.tableCache.get(cacheKey);
|
|
203
|
+
if (!tableStats)
|
|
204
|
+
continue;
|
|
205
|
+
for (const column of table.columns) {
|
|
206
|
+
const cachedStats = tableStats.columns.get(column.name);
|
|
207
|
+
if (!cachedStats)
|
|
208
|
+
continue;
|
|
209
|
+
// Merge cached stats into column.statistics
|
|
210
|
+
column.statistics = {
|
|
211
|
+
totalRows: cachedStats.totalRows,
|
|
212
|
+
distinctCount: cachedStats.distinctCount,
|
|
213
|
+
uniquenessRatio: cachedStats.uniqueness,
|
|
214
|
+
nullCount: cachedStats.nullCount,
|
|
215
|
+
nullPercentage: cachedStats.nullPercentage,
|
|
216
|
+
dataPattern: cachedStats.dataPattern,
|
|
217
|
+
sampleValues: cachedStats.sampleValues,
|
|
218
|
+
valueDistribution: cachedStats.valueDistribution,
|
|
219
|
+
minValue: cachedStats.minValue,
|
|
220
|
+
maxValue: cachedStats.maxValue,
|
|
221
|
+
avgLength: cachedStats.avgLength,
|
|
222
|
+
computedAt: cachedStats.computedAt,
|
|
223
|
+
queryTimeMs: cachedStats.queryTimeMs
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
exports.ColumnStatsCache = ColumnStatsCache;
|
|
231
|
+
//# sourceMappingURL=ColumnStatsCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColumnStatsCache.js","sourceRoot":"","sources":["../../src/discovery/ColumnStatsCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discovery Engine
|
|
3
|
+
* Orchestrates relationship discovery with iterative refinement and backpropagation
|
|
4
|
+
*/
|
|
5
|
+
import { BaseAutoDocDriver } from '../drivers/BaseAutoDocDriver.js';
|
|
6
|
+
import { ColumnStatsCache } from './ColumnStatsCache.js';
|
|
7
|
+
import { SchemaDefinition, DatabaseDocumentation } from '../types/state.js';
|
|
8
|
+
import { RelationshipDiscoveryPhase, DiscoveryTriggerAnalysis } from '../types/discovery.js';
|
|
9
|
+
import { RelationshipDiscoveryConfig, AIConfig } from '../types/config.js';
|
|
10
|
+
export interface DiscoveryEngineOptions {
|
|
11
|
+
driver: BaseAutoDocDriver;
|
|
12
|
+
config: RelationshipDiscoveryConfig;
|
|
13
|
+
aiConfig: AIConfig;
|
|
14
|
+
schemas: SchemaDefinition[];
|
|
15
|
+
onProgress?: (message: string, data?: any) => void;
|
|
16
|
+
}
|
|
17
|
+
export interface DiscoveryResult {
|
|
18
|
+
phase: RelationshipDiscoveryPhase;
|
|
19
|
+
guardrailsReached: boolean;
|
|
20
|
+
guardrailReason?: string;
|
|
21
|
+
statsCache: ColumnStatsCache;
|
|
22
|
+
}
|
|
23
|
+
export declare class DiscoveryEngine {
|
|
24
|
+
private driver;
|
|
25
|
+
private config;
|
|
26
|
+
private aiConfig;
|
|
27
|
+
private schemas;
|
|
28
|
+
private onProgress;
|
|
29
|
+
private statsCache;
|
|
30
|
+
private pkDetector;
|
|
31
|
+
private fkDetector;
|
|
32
|
+
private llmValidator?;
|
|
33
|
+
private sanityChecker?;
|
|
34
|
+
constructor(options: DiscoveryEngineOptions);
|
|
35
|
+
/**
|
|
36
|
+
* Get the column statistics cache
|
|
37
|
+
*/
|
|
38
|
+
getStatsCache(): ColumnStatsCache;
|
|
39
|
+
/**
|
|
40
|
+
* Analyze if discovery should be triggered based on schema state
|
|
41
|
+
*/
|
|
42
|
+
analyzeTrigger(): DiscoveryTriggerAnalysis;
|
|
43
|
+
/**
|
|
44
|
+
* Execute the discovery process
|
|
45
|
+
*/
|
|
46
|
+
discover(maxTokens: number, triggerAnalysis: DiscoveryTriggerAnalysis): Promise<DiscoveryResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Initialize discovery phase
|
|
49
|
+
*/
|
|
50
|
+
private initializePhase;
|
|
51
|
+
/**
|
|
52
|
+
* Determine trigger reason from analysis
|
|
53
|
+
*/
|
|
54
|
+
private determineTriggerReason;
|
|
55
|
+
/**
|
|
56
|
+
* Execute a single discovery iteration
|
|
57
|
+
*/
|
|
58
|
+
private executeIteration;
|
|
59
|
+
/**
|
|
60
|
+
* Detect primary keys in all tables without PKs
|
|
61
|
+
*/
|
|
62
|
+
private detectPrimaryKeys;
|
|
63
|
+
/**
|
|
64
|
+
* Detect foreign keys across all schemas
|
|
65
|
+
*/
|
|
66
|
+
private detectForeignKeys;
|
|
67
|
+
/**
|
|
68
|
+
* Perform LLM validation on PK/FK candidates
|
|
69
|
+
*/
|
|
70
|
+
private performLLMValidation;
|
|
71
|
+
/**
|
|
72
|
+
* Check if backpropagation should be triggered
|
|
73
|
+
*/
|
|
74
|
+
private shouldTriggerBackprop;
|
|
75
|
+
/**
|
|
76
|
+
* Perform backpropagation to update confidence scores
|
|
77
|
+
*/
|
|
78
|
+
private performBackpropagation;
|
|
79
|
+
/**
|
|
80
|
+
* Merge iteration discoveries into phase
|
|
81
|
+
*/
|
|
82
|
+
private mergeDiscoveries;
|
|
83
|
+
/**
|
|
84
|
+
* Check if discovery should continue
|
|
85
|
+
*/
|
|
86
|
+
private shouldContinueDiscovery;
|
|
87
|
+
/**
|
|
88
|
+
* Check guardrails
|
|
89
|
+
*/
|
|
90
|
+
private checkGuardrails;
|
|
91
|
+
/**
|
|
92
|
+
* Calculate final summary statistics
|
|
93
|
+
*/
|
|
94
|
+
private calculateSummary;
|
|
95
|
+
/**
|
|
96
|
+
* Apply discovered relationships to state
|
|
97
|
+
*/
|
|
98
|
+
applyDiscoveriesToState(state: DatabaseDocumentation, phase: RelationshipDiscoveryPhase): void;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=DiscoveryEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiscoveryEngine.d.ts","sourceRoot":"","sources":["../../src/discovery/DiscoveryEngine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAKpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EACL,0BAA0B,EAI1B,wBAAwB,EACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,2BAA2B,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE3E,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,2BAA2B,CAAC;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,0BAA0B,CAAC;IAClC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,gBAAgB,CAAC;CAC9B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAwC;IAC1D,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAC,CAAwB;IAC7C,OAAO,CAAC,aAAa,CAAC,CAAmB;gBAE7B,OAAO,EAAE,sBAAsB;IA2B3C;;OAEG;IACI,aAAa,IAAI,gBAAgB;IAIxC;;OAEG;IACI,cAAc,IAAI,wBAAwB;IA6DjD;;OAEG;IACU,QAAQ,CACnB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,wBAAwB,GACxC,OAAO,CAAC,eAAe,CAAC;IA2E3B;;OAEG;IACH,OAAO,CAAC,eAAe;IA6CvB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiB9B;;OAEG;YACW,gBAAgB;IAwK9B;;OAEG;YACW,iBAAiB;IAoC/B;;OAEG;YACW,iBAAiB;IAqC/B;;OAEG;YACW,oBAAoB;IAuJlC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAuB7B;;OAEG;YACW,sBAAsB;IA4DpC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA6B/B;;OAEG;IACH,OAAO,CAAC,eAAe;IAiCvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgDxB;;OAEG;IACI,uBAAuB,CAC5B,KAAK,EAAE,qBAAqB,EAC5B,KAAK,EAAE,0BAA0B,GAChC,IAAI;CA4CR"}
|