@memberjunction/db-auto-doc 2.117.0 → 2.118.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 +652 -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/init.d.ts +3 -4
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +155 -146
- 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 +37 -0
- package/dist/core/AnalysisOrchestrator.d.ts.map +1 -0
- package/dist/core/AnalysisOrchestrator.js +294 -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/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 +282 -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 +132 -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/state.d.ts +278 -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 +24 -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,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Database connection and introspection classes
|
|
4
|
+
* Primary interface for all database operations
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DataSampler = exports.Introspector = exports.DatabaseConnection = exports.createDriver = void 0;
|
|
8
|
+
const global_1 = require("@memberjunction/global");
|
|
9
|
+
const BaseAutoDocDriver_js_1 = require("../drivers/BaseAutoDocDriver.js");
|
|
10
|
+
require("../drivers/SQLServerDriver.js"); // Import to ensure registration
|
|
11
|
+
require("../drivers/MySQLDriver.js"); // Import to ensure registration
|
|
12
|
+
require("../drivers/PostgreSQLDriver.js"); // Import to ensure registration
|
|
13
|
+
/**
|
|
14
|
+
* Create a database driver instance
|
|
15
|
+
*/
|
|
16
|
+
function createDriver(config) {
|
|
17
|
+
const providerKey = config.provider === 'sqlserver' || !config.provider ? 'SQLServer' :
|
|
18
|
+
config.provider === 'mysql' ? 'MySQL' :
|
|
19
|
+
config.provider === 'postgresql' ? 'PostgreSQL' :
|
|
20
|
+
config.provider === 'oracle' ? 'Oracle' : 'SQLServer';
|
|
21
|
+
const driver = global_1.MJGlobal.Instance.ClassFactory.CreateInstance(BaseAutoDocDriver_js_1.BaseAutoDocDriver, providerKey, config);
|
|
22
|
+
if (!driver) {
|
|
23
|
+
throw new Error(`Database provider '${providerKey}' is not registered`);
|
|
24
|
+
}
|
|
25
|
+
return driver;
|
|
26
|
+
}
|
|
27
|
+
exports.createDriver = createDriver;
|
|
28
|
+
/**
|
|
29
|
+
* Database connection class
|
|
30
|
+
* Provides connection management and query execution
|
|
31
|
+
*/
|
|
32
|
+
class DatabaseConnection {
|
|
33
|
+
constructor(dbConfig) {
|
|
34
|
+
this.driver = createDriver(dbConfig);
|
|
35
|
+
}
|
|
36
|
+
async connect() {
|
|
37
|
+
await this.driver.connect();
|
|
38
|
+
}
|
|
39
|
+
async test() {
|
|
40
|
+
return await this.driver.test();
|
|
41
|
+
}
|
|
42
|
+
async query(queryText, maxRetries = 3) {
|
|
43
|
+
return await this.driver.executeQuery(queryText, maxRetries);
|
|
44
|
+
}
|
|
45
|
+
async close() {
|
|
46
|
+
await this.driver.close();
|
|
47
|
+
}
|
|
48
|
+
// Expose the underlying driver for advanced usage
|
|
49
|
+
getDriver() {
|
|
50
|
+
return this.driver;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.DatabaseConnection = DatabaseConnection;
|
|
54
|
+
/**
|
|
55
|
+
* Database introspector
|
|
56
|
+
* Retrieves schema and table information from the database
|
|
57
|
+
*/
|
|
58
|
+
class Introspector {
|
|
59
|
+
constructor(driver) {
|
|
60
|
+
this.driver = driver;
|
|
61
|
+
}
|
|
62
|
+
async getSchemas(schemaFilter, tableFilter) {
|
|
63
|
+
const autoDocSchemas = await this.driver.getSchemas(schemaFilter, tableFilter);
|
|
64
|
+
// Convert AutoDocSchema[] to SchemaDefinition[]
|
|
65
|
+
const schemas = [];
|
|
66
|
+
for (const autoDocSchema of autoDocSchemas) {
|
|
67
|
+
const tables = [];
|
|
68
|
+
for (const autoDocTable of autoDocSchema.tables) {
|
|
69
|
+
// Convert foreign keys to dependsOn/dependents format
|
|
70
|
+
const dependsOn = autoDocTable.foreignKeys.map(fk => ({
|
|
71
|
+
schema: fk.referencedSchema,
|
|
72
|
+
table: fk.referencedTable,
|
|
73
|
+
column: fk.columnName,
|
|
74
|
+
referencedColumn: fk.referencedColumn
|
|
75
|
+
}));
|
|
76
|
+
// Convert columns
|
|
77
|
+
const columns = autoDocTable.columns.map(col => ({
|
|
78
|
+
name: col.name,
|
|
79
|
+
dataType: col.dataType,
|
|
80
|
+
isNullable: col.isNullable,
|
|
81
|
+
isPrimaryKey: col.isPrimaryKey,
|
|
82
|
+
isForeignKey: col.isForeignKey,
|
|
83
|
+
checkConstraint: col.checkConstraint,
|
|
84
|
+
defaultValue: col.defaultValue,
|
|
85
|
+
descriptionIterations: []
|
|
86
|
+
}));
|
|
87
|
+
tables.push({
|
|
88
|
+
name: autoDocTable.tableName,
|
|
89
|
+
rowCount: autoDocTable.rowCount,
|
|
90
|
+
dependsOn,
|
|
91
|
+
dependents: [], // Will be populated later
|
|
92
|
+
columns,
|
|
93
|
+
descriptionIterations: []
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
schemas.push({
|
|
97
|
+
name: autoDocSchema.name,
|
|
98
|
+
tables,
|
|
99
|
+
descriptionIterations: []
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// Populate dependents (reverse FKs)
|
|
103
|
+
for (const schema of schemas) {
|
|
104
|
+
for (const table of schema.tables) {
|
|
105
|
+
for (const dep of table.dependsOn) {
|
|
106
|
+
const parentSchema = schemas.find(s => s.name === dep.schema);
|
|
107
|
+
if (parentSchema) {
|
|
108
|
+
const parentTable = parentSchema.tables.find(t => t.name === dep.table);
|
|
109
|
+
if (parentTable) {
|
|
110
|
+
if (!parentTable.dependents.some(d => d.schema === schema.name && d.table === table.name)) {
|
|
111
|
+
parentTable.dependents.push({
|
|
112
|
+
schema: schema.name,
|
|
113
|
+
table: table.name,
|
|
114
|
+
column: dep.referencedColumn,
|
|
115
|
+
referencedColumn: dep.column
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return schemas;
|
|
124
|
+
}
|
|
125
|
+
async getExistingDescriptions(schemaName, tableName) {
|
|
126
|
+
const descriptions = await this.driver.getExistingDescriptions(schemaName, tableName);
|
|
127
|
+
const map = new Map();
|
|
128
|
+
for (const desc of descriptions) {
|
|
129
|
+
const key = desc.target === 'table' ? '__TABLE__' : desc.targetName;
|
|
130
|
+
map.set(key, desc.description);
|
|
131
|
+
}
|
|
132
|
+
return map;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.Introspector = Introspector;
|
|
136
|
+
/**
|
|
137
|
+
* Data sampler
|
|
138
|
+
* Analyzes table data and gathers column statistics
|
|
139
|
+
*/
|
|
140
|
+
class DataSampler {
|
|
141
|
+
constructor(driver, config) {
|
|
142
|
+
this.driver = driver;
|
|
143
|
+
this.config = config;
|
|
144
|
+
}
|
|
145
|
+
async analyzeTable(schemaName, tableName, columns) {
|
|
146
|
+
for (const column of columns) {
|
|
147
|
+
const stats = await this.driver.getColumnStatistics(schemaName, tableName, column.name, column.dataType, this.config.cardinalityThreshold, this.config.sampleSize);
|
|
148
|
+
// Convert AutoDocColumnStatistics to ColumnStatistics
|
|
149
|
+
column.statistics = {
|
|
150
|
+
totalRows: stats.totalRows,
|
|
151
|
+
distinctCount: stats.distinctCount,
|
|
152
|
+
uniquenessRatio: stats.uniquenessRatio,
|
|
153
|
+
nullCount: stats.nullCount,
|
|
154
|
+
nullPercentage: stats.nullPercentage,
|
|
155
|
+
sampleValues: stats.sampleValues,
|
|
156
|
+
min: stats.min,
|
|
157
|
+
max: stats.max,
|
|
158
|
+
avg: stats.avg,
|
|
159
|
+
stdDev: stats.stdDev,
|
|
160
|
+
avgLength: stats.avgLength,
|
|
161
|
+
maxLength: stats.maxLength,
|
|
162
|
+
minLength: stats.minLength
|
|
163
|
+
};
|
|
164
|
+
// Set possible values if low cardinality
|
|
165
|
+
if (stats.valueDistribution && stats.valueDistribution.length > 0) {
|
|
166
|
+
column.possibleValues = stats.valueDistribution.map(v => v.value);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
exports.DataSampler = DataSampler;
|
|
172
|
+
//# sourceMappingURL=Database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Database.js","sourceRoot":"","sources":["../../src/database/Database.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,mDAAkD;AAClD,0EAAoE;AAIpE,yCAAuC,CAAC,gCAAgC;AACxE,qCAAmC,CAAC,gCAAgC;AACpE,0CAAwC,CAAC,gCAAgC;AAEzE;;GAEG;AACH,SAAgB,YAAY,CAAC,MAA+B;IAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACnE,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBACjD,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;IAE1E,MAAM,MAAM,GAAG,iBAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAC1D,wCAAiB,EACjB,WAAW,EACX,MAAM,CACP,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,sBAAsB,WAAW,qBAAqB,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAjBD,oCAiBC;AAED;;;GAGG;AACH,MAAa,kBAAkB;IAG7B,YAAY,QAAiC;QAC3C,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,KAAK,CAChB,SAAiB,EACjB,aAAqB,CAAC;QAEtB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAI,SAAS,EAAE,UAAU,CAAC,CAAC;IAClE,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,kDAAkD;IAC3C,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AA9BD,gDA8BC;AAED;;;GAGG;AACH,MAAa,YAAY;IACvB,YAAoB,MAAyB;QAAzB,WAAM,GAAN,MAAM,CAAmB;IAAG,CAAC;IAE1C,KAAK,CAAC,UAAU,CACrB,YAAgC,EAChC,WAA8B;QAE9B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAE/E,gDAAgD;QAChD,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAsB,EAAE,CAAC;YAErC,KAAK,MAAM,YAAY,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;gBAChD,sDAAsD;gBACtD,MAAM,SAAS,GAA0B,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC3E,MAAM,EAAE,EAAE,CAAC,gBAAgB;oBAC3B,KAAK,EAAE,EAAE,CAAC,eAAe;oBACzB,MAAM,EAAE,EAAE,CAAC,UAAU;oBACrB,gBAAgB,EAAE,EAAE,CAAC,gBAAgB;iBACtC,CAAC,CAAC,CAAC;gBAEJ,kBAAkB;gBAClB,MAAM,OAAO,GAAuB,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACnE,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,YAAY,EAAE,GAAG,CAAC,YAAY;oBAC9B,YAAY,EAAE,GAAG,CAAC,YAAY;oBAC9B,eAAe,EAAE,GAAG,CAAC,eAAe;oBACpC,YAAY,EAAE,GAAG,CAAC,YAAY;oBAC9B,qBAAqB,EAAE,EAAE;iBAC1B,CAAC,CAAC,CAAC;gBAEJ,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,YAAY,CAAC,SAAS;oBAC5B,QAAQ,EAAE,YAAY,CAAC,QAAQ;oBAC/B,SAAS;oBACT,UAAU,EAAE,EAAE,EAAE,0BAA0B;oBAC1C,OAAO;oBACP,qBAAqB,EAAE,EAAE;iBAC1B,CAAC,CAAC;YACL,CAAC;YAED,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,aAAa,CAAC,IAAI;gBACxB,MAAM;gBACN,qBAAqB,EAAE,EAAE;aAC1B,CAAC,CAAC;QACL,CAAC;QAED,oCAAoC;QACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;oBAClC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC9D,IAAI,YAAY,EAAE,CAAC;wBACjB,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;wBACxE,IAAI,WAAW,EAAE,CAAC;4BAChB,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gCAC1F,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC;oCAC1B,MAAM,EAAE,MAAM,CAAC,IAAI;oCACnB,KAAK,EAAE,KAAK,CAAC,IAAI;oCACjB,MAAM,EAAE,GAAG,CAAC,gBAAgB;oCAC5B,gBAAgB,EAAE,GAAG,CAAC,MAAM;iCAC7B,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,uBAAuB,CAClC,UAAkB,EAClB,SAAiB;QAEjB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACtF,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;QAEtC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;YACpE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AA3FD,oCA2FC;AAED;;;GAGG;AACH,MAAa,WAAW;IACtB,YACU,MAAyB,EACzB,MAAsB;QADtB,WAAM,GAAN,MAAM,CAAmB;QACzB,WAAM,GAAN,MAAM,CAAgB;IAC7B,CAAC;IAEG,KAAK,CAAC,YAAY,CACvB,UAAkB,EAClB,SAAiB,EACjB,OAA2B;QAE3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,CACjD,UAAU,EACV,SAAS,EACT,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,QAAQ,EACf,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAChC,IAAI,CAAC,MAAM,CAAC,UAAU,CACvB,CAAC;YAEF,sDAAsD;YACtD,MAAM,CAAC,UAAU,GAAG;gBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC;YAEF,yCAAyC;YACzC,IAAI,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClE,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA5CD,kCA4CC"}
|
|
@@ -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"}
|