@memberjunction/db-auto-doc 2.116.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.
Files changed (251) hide show
  1. package/README.md +652 -165
  2. package/bin/run.js +7 -0
  3. package/dist/api/DBAutoDocAPI.d.ts +252 -0
  4. package/dist/api/DBAutoDocAPI.d.ts.map +1 -0
  5. package/dist/api/DBAutoDocAPI.js +530 -0
  6. package/dist/api/DBAutoDocAPI.js.map +1 -0
  7. package/dist/api/index.d.ts +7 -0
  8. package/dist/api/index.d.ts.map +1 -0
  9. package/dist/api/index.js +10 -0
  10. package/dist/api/index.js.map +1 -0
  11. package/dist/commands/analyze.d.ts +6 -4
  12. package/dist/commands/analyze.d.ts.map +1 -1
  13. package/dist/commands/analyze.js +58 -71
  14. package/dist/commands/analyze.js.map +1 -1
  15. package/dist/commands/export.d.ts +14 -4
  16. package/dist/commands/export.d.ts.map +1 -1
  17. package/dist/commands/export.js +156 -61
  18. package/dist/commands/export.js.map +1 -1
  19. package/dist/commands/init.d.ts +3 -4
  20. package/dist/commands/init.d.ts.map +1 -1
  21. package/dist/commands/init.js +155 -146
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/reset.d.ts +4 -1
  24. package/dist/commands/reset.d.ts.map +1 -1
  25. package/dist/commands/reset.js +33 -19
  26. package/dist/commands/reset.js.map +1 -1
  27. package/dist/commands/status.d.ts +10 -0
  28. package/dist/commands/status.d.ts.map +1 -0
  29. package/dist/commands/status.js +66 -0
  30. package/dist/commands/status.js.map +1 -0
  31. package/dist/core/AnalysisEngine.d.ts +108 -0
  32. package/dist/core/AnalysisEngine.d.ts.map +1 -0
  33. package/dist/core/AnalysisEngine.js +716 -0
  34. package/dist/core/AnalysisEngine.js.map +1 -0
  35. package/dist/core/AnalysisOrchestrator.d.ts +37 -0
  36. package/dist/core/AnalysisOrchestrator.d.ts.map +1 -0
  37. package/dist/core/AnalysisOrchestrator.js +294 -0
  38. package/dist/core/AnalysisOrchestrator.js.map +1 -0
  39. package/dist/core/BackpropagationEngine.d.ts +32 -0
  40. package/dist/core/BackpropagationEngine.d.ts.map +1 -0
  41. package/dist/core/BackpropagationEngine.js +121 -0
  42. package/dist/core/BackpropagationEngine.js.map +1 -0
  43. package/dist/core/ConvergenceDetector.d.ts +27 -0
  44. package/dist/core/ConvergenceDetector.d.ts.map +1 -0
  45. package/dist/core/ConvergenceDetector.js +92 -0
  46. package/dist/core/ConvergenceDetector.js.map +1 -0
  47. package/dist/core/GuardrailsManager.d.ts +78 -0
  48. package/dist/core/GuardrailsManager.d.ts.map +1 -0
  49. package/dist/core/GuardrailsManager.js +367 -0
  50. package/dist/core/GuardrailsManager.js.map +1 -0
  51. package/dist/core/index.d.ts +7 -0
  52. package/dist/core/index.d.ts.map +1 -0
  53. package/dist/core/index.js +13 -0
  54. package/dist/core/index.js.map +1 -0
  55. package/dist/database/Database.d.ts +56 -0
  56. package/dist/database/Database.d.ts.map +1 -0
  57. package/dist/database/Database.js +172 -0
  58. package/dist/database/Database.js.map +1 -0
  59. package/dist/database/TopologicalSorter.d.ts +25 -0
  60. package/dist/database/TopologicalSorter.d.ts.map +1 -0
  61. package/dist/database/TopologicalSorter.js +150 -0
  62. package/dist/database/TopologicalSorter.js.map +1 -0
  63. package/dist/database/index.d.ts +6 -0
  64. package/dist/database/index.d.ts.map +1 -0
  65. package/dist/database/index.js +14 -0
  66. package/dist/database/index.js.map +1 -0
  67. package/dist/discovery/ColumnStatsCache.d.ts +91 -0
  68. package/dist/discovery/ColumnStatsCache.d.ts.map +1 -0
  69. package/dist/discovery/ColumnStatsCache.js +231 -0
  70. package/dist/discovery/ColumnStatsCache.js.map +1 -0
  71. package/dist/discovery/DiscoveryEngine.d.ts +100 -0
  72. package/dist/discovery/DiscoveryEngine.d.ts.map +1 -0
  73. package/dist/discovery/DiscoveryEngine.js +726 -0
  74. package/dist/discovery/DiscoveryEngine.js.map +1 -0
  75. package/dist/discovery/DiscoveryTriggerAnalyzer.d.ts +57 -0
  76. package/dist/discovery/DiscoveryTriggerAnalyzer.d.ts.map +1 -0
  77. package/dist/discovery/DiscoveryTriggerAnalyzer.js +186 -0
  78. package/dist/discovery/DiscoveryTriggerAnalyzer.js.map +1 -0
  79. package/dist/discovery/FKDetector.d.ts +47 -0
  80. package/dist/discovery/FKDetector.d.ts.map +1 -0
  81. package/dist/discovery/FKDetector.js +317 -0
  82. package/dist/discovery/FKDetector.js.map +1 -0
  83. package/dist/discovery/LLMDiscoveryValidator.d.ts +64 -0
  84. package/dist/discovery/LLMDiscoveryValidator.d.ts.map +1 -0
  85. package/dist/discovery/LLMDiscoveryValidator.js +431 -0
  86. package/dist/discovery/LLMDiscoveryValidator.js.map +1 -0
  87. package/dist/discovery/LLMSanityChecker.d.ts +38 -0
  88. package/dist/discovery/LLMSanityChecker.d.ts.map +1 -0
  89. package/dist/discovery/LLMSanityChecker.js +156 -0
  90. package/dist/discovery/LLMSanityChecker.js.map +1 -0
  91. package/dist/discovery/PKDetector.d.ts +62 -0
  92. package/dist/discovery/PKDetector.d.ts.map +1 -0
  93. package/dist/discovery/PKDetector.js +436 -0
  94. package/dist/discovery/PKDetector.js.map +1 -0
  95. package/dist/discovery/index.d.ts +9 -0
  96. package/dist/discovery/index.d.ts.map +1 -0
  97. package/dist/discovery/index.js +25 -0
  98. package/dist/discovery/index.js.map +1 -0
  99. package/dist/drivers/BaseAutoDocDriver.d.ts +132 -0
  100. package/dist/drivers/BaseAutoDocDriver.d.ts.map +1 -0
  101. package/dist/drivers/BaseAutoDocDriver.js +121 -0
  102. package/dist/drivers/BaseAutoDocDriver.js.map +1 -0
  103. package/dist/drivers/MySQLDriver.d.ts +61 -0
  104. package/dist/drivers/MySQLDriver.d.ts.map +1 -0
  105. package/dist/drivers/MySQLDriver.js +668 -0
  106. package/dist/drivers/MySQLDriver.js.map +1 -0
  107. package/dist/drivers/PostgreSQLDriver.d.ts +65 -0
  108. package/dist/drivers/PostgreSQLDriver.d.ts.map +1 -0
  109. package/dist/drivers/PostgreSQLDriver.js +704 -0
  110. package/dist/drivers/PostgreSQLDriver.js.map +1 -0
  111. package/dist/drivers/SQLServerDriver.d.ts +61 -0
  112. package/dist/drivers/SQLServerDriver.d.ts.map +1 -0
  113. package/dist/drivers/SQLServerDriver.js +667 -0
  114. package/dist/drivers/SQLServerDriver.js.map +1 -0
  115. package/dist/generators/CSVGenerator.d.ts +35 -0
  116. package/dist/generators/CSVGenerator.d.ts.map +1 -0
  117. package/dist/generators/CSVGenerator.js +154 -0
  118. package/dist/generators/CSVGenerator.js.map +1 -0
  119. package/dist/generators/HTMLGenerator.d.ts +29 -0
  120. package/dist/generators/HTMLGenerator.d.ts.map +1 -0
  121. package/dist/generators/HTMLGenerator.js +710 -0
  122. package/dist/generators/HTMLGenerator.js.map +1 -0
  123. package/dist/generators/MarkdownGenerator.d.ts +27 -0
  124. package/dist/generators/MarkdownGenerator.d.ts.map +1 -0
  125. package/dist/generators/MarkdownGenerator.js +361 -0
  126. package/dist/generators/MarkdownGenerator.js.map +1 -0
  127. package/dist/generators/MermaidGenerator.d.ts +35 -0
  128. package/dist/generators/MermaidGenerator.d.ts.map +1 -0
  129. package/dist/generators/MermaidGenerator.js +321 -0
  130. package/dist/generators/MermaidGenerator.js.map +1 -0
  131. package/dist/generators/ReportGenerator.d.ts +22 -0
  132. package/dist/generators/ReportGenerator.d.ts.map +1 -0
  133. package/dist/generators/ReportGenerator.js +176 -0
  134. package/dist/generators/ReportGenerator.js.map +1 -0
  135. package/dist/generators/SQLGenerator.d.ts +31 -0
  136. package/dist/generators/SQLGenerator.d.ts.map +1 -0
  137. package/dist/generators/SQLGenerator.js +168 -0
  138. package/dist/generators/SQLGenerator.js.map +1 -0
  139. package/dist/generators/index.d.ts +10 -0
  140. package/dist/generators/index.d.ts.map +1 -0
  141. package/dist/generators/index.js +19 -0
  142. package/dist/generators/index.js.map +1 -0
  143. package/dist/index.d.ts +11 -20
  144. package/dist/index.d.ts.map +1 -1
  145. package/dist/index.js +19 -20
  146. package/dist/index.js.map +1 -1
  147. package/dist/prompts/PromptEngine.d.ts +65 -0
  148. package/dist/prompts/PromptEngine.d.ts.map +1 -0
  149. package/dist/prompts/PromptEngine.js +282 -0
  150. package/dist/prompts/PromptEngine.js.map +1 -0
  151. package/dist/prompts/PromptFileLoader.d.ts +21 -0
  152. package/dist/prompts/PromptFileLoader.d.ts.map +1 -0
  153. package/dist/prompts/PromptFileLoader.js +74 -0
  154. package/dist/prompts/PromptFileLoader.js.map +1 -0
  155. package/dist/prompts/index.d.ts +6 -0
  156. package/dist/prompts/index.d.ts.map +1 -0
  157. package/dist/prompts/index.js +11 -0
  158. package/dist/prompts/index.js.map +1 -0
  159. package/dist/state/IterationTracker.d.ts +64 -0
  160. package/dist/state/IterationTracker.d.ts.map +1 -0
  161. package/dist/state/IterationTracker.js +136 -0
  162. package/dist/state/IterationTracker.js.map +1 -0
  163. package/dist/state/StateManager.d.ts +79 -0
  164. package/dist/state/StateManager.d.ts.map +1 -0
  165. package/dist/state/StateManager.js +348 -0
  166. package/dist/state/StateManager.js.map +1 -0
  167. package/dist/state/StateValidator.d.ts +24 -0
  168. package/dist/state/StateValidator.d.ts.map +1 -0
  169. package/dist/state/StateValidator.js +147 -0
  170. package/dist/state/StateValidator.js.map +1 -0
  171. package/dist/state/index.d.ts +7 -0
  172. package/dist/state/index.d.ts.map +1 -0
  173. package/dist/state/index.js +13 -0
  174. package/dist/state/index.js.map +1 -0
  175. package/dist/types/analysis.d.ts +76 -0
  176. package/dist/types/analysis.d.ts.map +1 -0
  177. package/dist/types/analysis.js +6 -0
  178. package/dist/types/analysis.js.map +1 -0
  179. package/dist/types/config.d.ts +132 -0
  180. package/dist/types/config.d.ts.map +1 -0
  181. package/dist/types/config.js +7 -0
  182. package/dist/types/config.js.map +1 -0
  183. package/dist/types/discovery.d.ts +277 -0
  184. package/dist/types/discovery.d.ts.map +1 -0
  185. package/dist/types/discovery.js +7 -0
  186. package/dist/types/discovery.js.map +1 -0
  187. package/dist/types/driver.d.ts +148 -0
  188. package/dist/types/driver.d.ts.map +1 -0
  189. package/dist/types/driver.js +7 -0
  190. package/dist/types/driver.js.map +1 -0
  191. package/dist/types/index.d.ts +8 -0
  192. package/dist/types/index.d.ts.map +1 -0
  193. package/dist/types/index.js +24 -0
  194. package/dist/types/index.js.map +1 -0
  195. package/dist/types/prompts.d.ts +158 -0
  196. package/dist/types/prompts.d.ts.map +1 -0
  197. package/dist/types/prompts.js +6 -0
  198. package/dist/types/prompts.js.map +1 -0
  199. package/dist/types/state.d.ts +278 -0
  200. package/dist/types/state.d.ts.map +1 -0
  201. package/dist/types/state.js +7 -0
  202. package/dist/types/state.js.map +1 -0
  203. package/dist/utils/config-loader.d.ts +29 -0
  204. package/dist/utils/config-loader.d.ts.map +1 -0
  205. package/dist/utils/config-loader.js +163 -0
  206. package/dist/utils/config-loader.js.map +1 -0
  207. package/dist/utils/index.d.ts +5 -0
  208. package/dist/utils/index.d.ts.map +1 -0
  209. package/dist/utils/index.js +9 -0
  210. package/dist/utils/index.js.map +1 -0
  211. package/package.json +24 -3
  212. package/dist/ai/simple-ai-client.d.ts +0 -70
  213. package/dist/ai/simple-ai-client.d.ts.map +0 -1
  214. package/dist/ai/simple-ai-client.js +0 -181
  215. package/dist/ai/simple-ai-client.js.map +0 -1
  216. package/dist/analyzers/analyzer.d.ts +0 -23
  217. package/dist/analyzers/analyzer.d.ts.map +0 -1
  218. package/dist/analyzers/analyzer.js +0 -127
  219. package/dist/analyzers/analyzer.js.map +0 -1
  220. package/dist/cli-old/cli.d.ts +0 -3
  221. package/dist/cli-old/cli.d.ts.map +0 -1
  222. package/dist/cli-old/cli.js +0 -388
  223. package/dist/cli-old/cli.js.map +0 -1
  224. package/dist/commands/review.d.ts +0 -11
  225. package/dist/commands/review.d.ts.map +0 -1
  226. package/dist/commands/review.js +0 -82
  227. package/dist/commands/review.js.map +0 -1
  228. package/dist/database/connection.d.ts +0 -40
  229. package/dist/database/connection.d.ts.map +0 -1
  230. package/dist/database/connection.js +0 -136
  231. package/dist/database/connection.js.map +0 -1
  232. package/dist/database/introspection.d.ts +0 -59
  233. package/dist/database/introspection.d.ts.map +0 -1
  234. package/dist/database/introspection.js +0 -124
  235. package/dist/database/introspection.js.map +0 -1
  236. package/dist/generators/markdown-generator.d.ts +0 -8
  237. package/dist/generators/markdown-generator.d.ts.map +0 -1
  238. package/dist/generators/markdown-generator.js +0 -106
  239. package/dist/generators/markdown-generator.js.map +0 -1
  240. package/dist/generators/sql-generator.d.ts +0 -20
  241. package/dist/generators/sql-generator.d.ts.map +0 -1
  242. package/dist/generators/sql-generator.js +0 -83
  243. package/dist/generators/sql-generator.js.map +0 -1
  244. package/dist/state/state-manager.d.ts +0 -95
  245. package/dist/state/state-manager.d.ts.map +0 -1
  246. package/dist/state/state-manager.js +0 -236
  247. package/dist/state/state-manager.js.map +0 -1
  248. package/dist/types/state-file.d.ts +0 -124
  249. package/dist/types/state-file.d.ts.map +0 -1
  250. package/dist/types/state-file.js +0 -79
  251. package/dist/types/state-file.js.map +0 -1
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Primary Key Detection
3
+ * Analyzes columns to find potential primary keys based on uniqueness,
4
+ * naming patterns, and data characteristics
5
+ */
6
+ import { BaseAutoDocDriver } from '../drivers/BaseAutoDocDriver.js';
7
+ import { TableDefinition } from '../types/state.js';
8
+ import { PKCandidate } from '../types/discovery.js';
9
+ import { RelationshipDiscoveryConfig } from '../types/config.js';
10
+ import { ColumnStatsCache } from './ColumnStatsCache.js';
11
+ export declare class PKDetector {
12
+ private driver;
13
+ private config;
14
+ private statsCache;
15
+ constructor(driver: BaseAutoDocDriver, config: RelationshipDiscoveryConfig, statsCache: ColumnStatsCache);
16
+ /**
17
+ * Detect primary key candidates for a table
18
+ */
19
+ detectPKCandidates(schemaName: string, table: TableDefinition, iteration: number): Promise<PKCandidate[]>;
20
+ /**
21
+ * Check if we have a high-quality surrogate key candidate
22
+ * Surrogate keys are single-column integer keys with "_id" suffix or "id" name
23
+ * that have high uniqueness (>95%)
24
+ */
25
+ private hasSurrogatePKCandidate;
26
+ /**
27
+ * Analyze a single column as potential PK
28
+ */
29
+ private analyzeSingleColumnPK;
30
+ /**
31
+ * Calculate naming score based on PK naming patterns
32
+ */
33
+ private calculateNamingScore;
34
+ /**
35
+ * Calculate data type score - how appropriate is this type for a PK?
36
+ */
37
+ private calculateDataTypeScore;
38
+ /**
39
+ * Detect data pattern (sequential, GUID, etc.)
40
+ */
41
+ private detectDataPattern;
42
+ /**
43
+ * Calculate overall PK confidence score (0-100)
44
+ *
45
+ * Scoring System:
46
+ * - Surrogate keys (id, table_id, etc.) with high uniqueness: 85-100
47
+ * - Natural keys with good uniqueness: 60-85
48
+ * - Composite keys: 50-75
49
+ * - Everything else: <50
50
+ */
51
+ private calculatePKConfidence;
52
+ /**
53
+ * Detect if a column name looks like a foreign key rather than a primary key
54
+ * Returns a score from 0-1 (0 = not FK-like, 1 = very FK-like)
55
+ */
56
+ private detectFKPattern;
57
+ /**
58
+ * Detect composite primary keys
59
+ */
60
+ private detectCompositeKeys;
61
+ }
62
+ //# sourceMappingURL=PKDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PKDetector.d.ts","sourceRoot":"","sources":["../../src/discovery/PKDetector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAoB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAmD,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,qBAAa,UAAU;IAEnB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,UAAU;gBAFV,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,2BAA2B,EACnC,UAAU,EAAE,gBAAgB;IAGtC;;OAEG;IACU,kBAAkB,CAC7B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,EAAE,CAAC;IAqCzB;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAsC/B;;OAEG;YACW,qBAAqB;IA4GnC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsC5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA+B9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+CzB;;;;;;;;OAQG;IACH,OAAO,CAAC,qBAAqB;IAmH7B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAoCvB;;OAEG;YACW,mBAAmB;CAgDlC"}
@@ -0,0 +1,436 @@
1
+ "use strict";
2
+ /**
3
+ * Primary Key Detection
4
+ * Analyzes columns to find potential primary keys based on uniqueness,
5
+ * naming patterns, and data characteristics
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.PKDetector = void 0;
9
+ class PKDetector {
10
+ constructor(driver, config, statsCache) {
11
+ this.driver = driver;
12
+ this.config = config;
13
+ this.statsCache = statsCache;
14
+ }
15
+ /**
16
+ * Detect primary key candidates for a table
17
+ */
18
+ async detectPKCandidates(schemaName, table, iteration) {
19
+ const candidates = [];
20
+ // Single-column PK detection
21
+ for (const column of table.columns) {
22
+ const candidate = await this.analyzeSingleColumnPK(schemaName, table.name, column, iteration);
23
+ if (candidate && candidate.confidence >= this.config.confidence.primaryKeyMinimum * 100) {
24
+ candidates.push(candidate);
25
+ }
26
+ }
27
+ // **IMPORTANT**: Check if we have a high-quality surrogate key candidate
28
+ // If we do, skip composite key detection entirely
29
+ const hasSurrogateKey = this.hasSurrogatePKCandidate(table.name, candidates);
30
+ if (hasSurrogateKey) {
31
+ console.log(`[PKDetector] Table ${table.name} has surrogate key candidate - skipping composite key detection`);
32
+ }
33
+ else {
34
+ // Composite PK detection only if no good surrogate key exists
35
+ const compositeCandidates = await this.detectCompositeKeys(schemaName, table, iteration);
36
+ candidates.push(...compositeCandidates);
37
+ }
38
+ // Sort by confidence descending
39
+ return candidates.sort((a, b) => b.confidence - a.confidence);
40
+ }
41
+ /**
42
+ * Check if we have a high-quality surrogate key candidate
43
+ * Surrogate keys are single-column integer keys with "_id" suffix or "id" name
44
+ * that have high uniqueness (>95%)
45
+ */
46
+ hasSurrogatePKCandidate(tableName, candidates) {
47
+ const tableLower = tableName.toLowerCase();
48
+ for (const candidate of candidates) {
49
+ // Must be single column
50
+ if (candidate.columnNames.length !== 1) {
51
+ continue;
52
+ }
53
+ const columnName = candidate.columnNames[0];
54
+ const columnLower = columnName.toLowerCase();
55
+ // Check for surrogate key naming pattern
56
+ const isSurrogateNaming = columnLower === 'id' || // Generic "id"
57
+ columnLower === `${tableLower}_id` || // Table-specific "table_id"
58
+ columnLower === `${tableLower}id` || // Table-specific "tableid"
59
+ columnLower.endsWith('_id'); // Any "_id" suffix
60
+ // Check for high uniqueness
61
+ const hasHighUniqueness = candidate.evidence.uniqueness >= 0.95;
62
+ // Check for appropriate data type (INT, BIGINT)
63
+ const hasGoodDataType = candidate.evidence.dataTypeScore >= 0.9;
64
+ // Check for high confidence (>= 70)
65
+ const hasGoodConfidence = candidate.confidence >= 70;
66
+ // If all criteria met, this is a good surrogate key candidate
67
+ if (isSurrogateNaming && hasHighUniqueness && hasGoodDataType && hasGoodConfidence) {
68
+ console.log(`[PKDetector] Found surrogate key: ${columnName} (uniqueness: ${(candidate.evidence.uniqueness * 100).toFixed(1)}%, confidence: ${candidate.confidence})`);
69
+ return true;
70
+ }
71
+ }
72
+ return false;
73
+ }
74
+ /**
75
+ * Analyze a single column as potential PK
76
+ */
77
+ async analyzeSingleColumnPK(schemaName, tableName, column, iteration) {
78
+ // Get or compute column statistics
79
+ let cachedStats = this.statsCache.getColumnStats(schemaName, tableName, column.name);
80
+ if (!cachedStats) {
81
+ // Compute and cache the stats
82
+ const startTime = Date.now();
83
+ const stats = await this.driver.getColumnStatisticsForDiscovery(schemaName, tableName, column.name, column.dataType, this.config.sampling.maxRowsPerTable);
84
+ // Detect data pattern
85
+ const dataPattern = this.detectDataPattern(stats.sampleValues, column.dataType);
86
+ cachedStats = {
87
+ schemaName,
88
+ tableName,
89
+ columnName: column.name,
90
+ dataType: column.dataType,
91
+ totalRows: stats.totalRows,
92
+ nullCount: stats.nullCount,
93
+ nullPercentage: stats.totalRows > 0 ? stats.nullCount / stats.totalRows : 0,
94
+ distinctCount: stats.distinctCount,
95
+ uniqueness: stats.totalRows > 0 ? stats.distinctCount / stats.totalRows : 0,
96
+ minValue: stats.minValue,
97
+ maxValue: stats.maxValue,
98
+ avgLength: stats.avgLength,
99
+ dataPattern,
100
+ sampleValues: stats.sampleValues,
101
+ computedAt: new Date().toISOString(),
102
+ queryTimeMs: Date.now() - startTime
103
+ };
104
+ this.statsCache.setColumnStats(cachedStats);
105
+ }
106
+ // Use cached stats for PK analysis
107
+ const uniqueness = cachedStats.uniqueness;
108
+ const hasNulls = cachedStats.nullCount > 0;
109
+ // Analyze naming pattern
110
+ const namingScore = this.calculateNamingScore(column.name);
111
+ // Analyze data type
112
+ const dataTypeScore = this.calculateDataTypeScore(column.dataType);
113
+ // Use cached data pattern
114
+ const dataPattern = cachedStats.dataPattern;
115
+ // Calculate overall confidence
116
+ const confidence = this.calculatePKConfidence({
117
+ uniqueness,
118
+ nullCount: cachedStats.nullCount,
119
+ totalRows: cachedStats.totalRows,
120
+ dataPattern,
121
+ namingScore,
122
+ dataTypeScore,
123
+ warnings: []
124
+ }, tableName, column.name);
125
+ // Build evidence
126
+ const evidence = {
127
+ uniqueness,
128
+ nullCount: cachedStats.nullCount,
129
+ totalRows: cachedStats.totalRows,
130
+ dataPattern,
131
+ namingScore,
132
+ dataTypeScore,
133
+ warnings: []
134
+ };
135
+ // Add warnings
136
+ if (hasNulls) {
137
+ evidence.warnings.push('Column contains NULL values');
138
+ }
139
+ if (uniqueness < 1.0) {
140
+ evidence.warnings.push(`Only ${(uniqueness * 100).toFixed(1)}% unique values`);
141
+ }
142
+ if (namingScore < 0.3) {
143
+ evidence.warnings.push('Column name does not match typical PK naming patterns');
144
+ }
145
+ // Don't return if confidence too low
146
+ if (confidence < 30) {
147
+ return null;
148
+ }
149
+ return {
150
+ schemaName,
151
+ tableName,
152
+ columnNames: [column.name],
153
+ confidence,
154
+ evidence,
155
+ discoveredInIteration: iteration,
156
+ validatedByLLM: false,
157
+ status: 'candidate'
158
+ };
159
+ }
160
+ /**
161
+ * Calculate naming score based on PK naming patterns
162
+ */
163
+ calculateNamingScore(columnName) {
164
+ let score = 0;
165
+ const lowerName = columnName.toLowerCase();
166
+ // Check against configured patterns
167
+ for (const pattern of this.config.patterns.primaryKeyNames) {
168
+ const regex = new RegExp(pattern, 'i');
169
+ if (regex.test(columnName)) {
170
+ score += 0.4;
171
+ }
172
+ }
173
+ // Common PK names
174
+ const commonPKNames = [
175
+ /^id$/i,
176
+ /^.*id$/i,
177
+ /^pk_/i,
178
+ /^.*_key$/i,
179
+ /^key$/i,
180
+ /^.*guid$/i,
181
+ /^.*uuid$/i
182
+ ];
183
+ for (const pattern of commonPKNames) {
184
+ if (pattern.test(columnName)) {
185
+ score += 0.3;
186
+ break;
187
+ }
188
+ }
189
+ // Exact match bonuses
190
+ if (lowerName === 'id')
191
+ score += 0.3;
192
+ if (lowerName.endsWith('id'))
193
+ score += 0.2;
194
+ if (lowerName.startsWith('pk_'))
195
+ score += 0.2;
196
+ return Math.min(score, 1.0);
197
+ }
198
+ /**
199
+ * Calculate data type score - how appropriate is this type for a PK?
200
+ */
201
+ calculateDataTypeScore(dataType) {
202
+ const lowerType = dataType.toLowerCase();
203
+ // Ideal PK types
204
+ if (lowerType.includes('int') ||
205
+ lowerType.includes('bigint') ||
206
+ lowerType.includes('uniqueidentifier') ||
207
+ lowerType.includes('uuid') ||
208
+ lowerType.includes('guid')) {
209
+ return 1.0;
210
+ }
211
+ // Acceptable PK types
212
+ if (lowerType.includes('varchar') ||
213
+ lowerType.includes('char') ||
214
+ lowerType.includes('string')) {
215
+ return 0.6;
216
+ }
217
+ // Poor PK types
218
+ if (lowerType.includes('text') ||
219
+ lowerType.includes('blob') ||
220
+ lowerType.includes('json') ||
221
+ lowerType.includes('xml')) {
222
+ return 0.2;
223
+ }
224
+ // Everything else
225
+ return 0.4;
226
+ }
227
+ /**
228
+ * Detect data pattern (sequential, GUID, etc.)
229
+ */
230
+ detectDataPattern(sampleValues, dataType) {
231
+ // GUID pattern
232
+ if (dataType && (dataType.toLowerCase().includes('uniqueidentifier') ||
233
+ dataType.toLowerCase().includes('uuid') ||
234
+ dataType.toLowerCase().includes('guid'))) {
235
+ return 'guid';
236
+ }
237
+ // Check sample values for patterns
238
+ if (sampleValues && sampleValues.length > 1) {
239
+ const values = sampleValues.filter(v => v != null);
240
+ // Check for GUID pattern in string values
241
+ if (values.length > 0 && typeof values[0] === 'string') {
242
+ const guidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
243
+ if (values.every(v => typeof v === 'string' && guidPattern.test(v))) {
244
+ return 'guid';
245
+ }
246
+ }
247
+ // Check for sequential numeric pattern
248
+ if (values.length > 0 && typeof values[0] === 'number') {
249
+ const numValues = values;
250
+ const sorted = [...numValues].sort((a, b) => a - b);
251
+ const isSequential = sorted.every((val, idx) => idx === 0 || val === sorted[idx - 1] + 1);
252
+ if (isSequential) {
253
+ return 'sequential';
254
+ }
255
+ }
256
+ }
257
+ // Natural key (string based on actual data)
258
+ if (dataType && (dataType.toLowerCase().includes('varchar') ||
259
+ dataType.toLowerCase().includes('char'))) {
260
+ return 'natural';
261
+ }
262
+ return 'unknown';
263
+ }
264
+ /**
265
+ * Calculate overall PK confidence score (0-100)
266
+ *
267
+ * Scoring System:
268
+ * - Surrogate keys (id, table_id, etc.) with high uniqueness: 85-100
269
+ * - Natural keys with good uniqueness: 60-85
270
+ * - Composite keys: 50-75
271
+ * - Everything else: <50
272
+ */
273
+ calculatePKConfidence(evidence, tableName, columnName) {
274
+ let score = 0;
275
+ // **CRITICAL FIX**: Reject obvious non-PK columns immediately
276
+ const blacklistPatterns = [
277
+ // Quantities and counts
278
+ /^qty$/i, /^quantity$/i, /^amount$/i, /^amt$/i,
279
+ /^count$/i, /^cnt$/i, /^num$/i, /^number$/i,
280
+ // Sequences and ordering
281
+ /^seq$/i, /^sequence$/i, /^order$/i, /^sort$/i,
282
+ /^lvl$/i, /^level$/i, /^depth$/i,
283
+ // Financial/numeric values
284
+ /^price$/i, /^prc$/i, /^cost$/i,
285
+ /^total$/i, /^tot$/i, /^sum$/i,
286
+ /^balance$/i, /^bal$/i,
287
+ /^limit$/i, /^lmt$/i, /^capacity$/i, /^cap$/i,
288
+ // Statistical/calculated values
289
+ /^var$/i, /^variance$/i, /^diff$/i, /^delta$/i,
290
+ /^min$/i, /^max$/i, /^avg$/i, /^mean$/i,
291
+ /^rate$/i, /^rtg$/i, /^rating$/i, /^score$/i,
292
+ /^expected$/i, /^exp_/i, /^actual$/i, /^act_/i,
293
+ /^received$/i, /^rcv_/i, /^reserved$/i, /^rsv$/i,
294
+ // Date/time fields - NEVER primary keys
295
+ /_dt$/i, /_date$/i, /^date/i, /^dt$/i,
296
+ /_time$/i, /^time/i, /^timestamp/i,
297
+ /^created/i, /^modified/i, /^updated/i, /^deleted/i,
298
+ /^start/i, /^end/i, /^begin/i, /^finish/i,
299
+ /^ship_dt$/i, /^dlv_dt$/i, /^ord_dt$/i, /^rcv_dt$/i,
300
+ /^lst_ord$/i, /^last_/i,
301
+ // Text/description fields
302
+ /^description$/i, /^dsc$/i, /^desc$/i,
303
+ /^notes$/i, /^note$/i, /^comment$/i, /^txt$/i,
304
+ /^name$/i, /^nm$/i, /^title$/i,
305
+ // Address/location fields
306
+ /^address$/i, /^addr$/i, /^ln1$/i, /^ln2$/i,
307
+ /^city$/i, /^cty$/i, /^state$/i, /^st$/i, /^zip$/i,
308
+ // Flags/booleans
309
+ /^is_/i, /^has_/i, /^flag$/i, /^active$/i, /^enabled$/i,
310
+ /^default$/i, /^dflt$/i, /^primary$/i,
311
+ // Extensions/extra info
312
+ /^ext$/i, /^extension$/i, /^ref$/i, /^reference$/i
313
+ ];
314
+ for (const pattern of blacklistPatterns) {
315
+ if (pattern.test(columnName)) {
316
+ console.log(`[PKDetector] REJECT ${columnName} - matches blacklist pattern ${pattern}`);
317
+ return 0; // Immediate rejection
318
+ }
319
+ }
320
+ // **SURROGATE KEY DETECTION**: Boost score for single-column surrogate keys
321
+ const tableLower = tableName.toLowerCase();
322
+ const colLower = columnName.toLowerCase();
323
+ const isSurrogateKey = colLower === 'id' ||
324
+ colLower === `${tableLower}_id` ||
325
+ colLower === `${tableLower}id` ||
326
+ colLower.endsWith('_id');
327
+ // Uniqueness is critical (50% weight)
328
+ score += evidence.uniqueness * 50;
329
+ // Naming pattern (20% weight)
330
+ score += evidence.namingScore * 20;
331
+ // Data type appropriateness (15% weight)
332
+ score += evidence.dataTypeScore * 15;
333
+ // Data pattern bonus (15% weight)
334
+ const patternScore = {
335
+ 'sequential': 15,
336
+ 'guid': 15,
337
+ 'natural': 10,
338
+ 'composite': 5,
339
+ 'unknown': 5
340
+ }[evidence.dataPattern];
341
+ score += patternScore;
342
+ // FK-pattern detection: penalize columns that look like foreign keys
343
+ const fkLikelihood = this.detectFKPattern(tableName, columnName);
344
+ if (fkLikelihood > 0.5) {
345
+ // Reduce score significantly if column looks like an FK
346
+ score *= (1 - (fkLikelihood * 0.6)); // Up to 60% penalty for strong FK patterns
347
+ }
348
+ // Penalties
349
+ if (evidence.nullCount > 0) {
350
+ score *= 0.7; // 30% penalty for nulls
351
+ }
352
+ // **STRICTER REQUIREMENT**: Require BOTH high uniqueness AND naming score
353
+ if (evidence.uniqueness >= 0.95 && evidence.namingScore < 0.3) {
354
+ score *= 0.5; // 50% penalty if unique but poor naming
355
+ console.log(`[PKDetector] ${columnName}: unique but poor naming (${evidence.namingScore.toFixed(2)}), score penalized`);
356
+ }
357
+ // **SURROGATE KEY BOOST**: Give significant bonus to surrogate keys
358
+ // This ensures single-column surrogate keys score higher than composite keys
359
+ if (isSurrogateKey && evidence.uniqueness >= 0.95 && evidence.dataTypeScore >= 0.9) {
360
+ const boost = 20; // Add 20 points for perfect surrogate key
361
+ score += boost;
362
+ console.log(`[PKDetector] ${columnName}: surrogate key boost +${boost} (final: ${Math.round(Math.min(score, 100))})`);
363
+ }
364
+ return Math.round(Math.min(score, 100));
365
+ }
366
+ /**
367
+ * Detect if a column name looks like a foreign key rather than a primary key
368
+ * Returns a score from 0-1 (0 = not FK-like, 1 = very FK-like)
369
+ */
370
+ detectFKPattern(tableName, columnName) {
371
+ const colLower = columnName.toLowerCase();
372
+ const tableLower = tableName.toLowerCase();
373
+ // Pattern 1: Column ends with _id but doesn't start with table name
374
+ // e.g., cst_id in ord table (FK-like), vs cst_id in cst table (PK-like)
375
+ if (colLower.endsWith('_id') || colLower.endsWith('id')) {
376
+ const prefix = colLower.replace(/_?id$/, '');
377
+ // If column is just "id", it's likely a PK
378
+ if (prefix === '') {
379
+ return 0;
380
+ }
381
+ // If prefix matches table name, likely a PK
382
+ if (tableLower.includes(prefix) || prefix.includes(tableLower)) {
383
+ return 0.1; // Slight FK likelihood (could be self-reference)
384
+ }
385
+ // If prefix doesn't match table name, very likely an FK
386
+ return 0.9;
387
+ }
388
+ // Pattern 2: Column ends with _key or _fk
389
+ if (colLower.endsWith('_key') || colLower.endsWith('_fk')) {
390
+ const prefix = colLower.replace(/_(?:key|fk)$/, '');
391
+ if (tableLower.includes(prefix) || prefix.includes(tableLower)) {
392
+ return 0.2;
393
+ }
394
+ return 0.95;
395
+ }
396
+ // No FK pattern detected
397
+ return 0;
398
+ }
399
+ /**
400
+ * Detect composite primary keys
401
+ */
402
+ async detectCompositeKeys(schemaName, table, iteration) {
403
+ const candidates = [];
404
+ // Look for common composite key patterns
405
+ // 1. Multiple columns ending in "ID"
406
+ const idColumns = table.columns.filter(c => /id$/i.test(c.name) || /key$/i.test(c.name));
407
+ if (idColumns.length >= 2) {
408
+ // Check if combination is unique
409
+ const isUnique = await this.driver.checkColumnCombinationUniqueness(schemaName, table.name, idColumns.map(c => c.name), this.config.sampling.maxRowsPerTable);
410
+ if (isUnique) {
411
+ const evidence = {
412
+ uniqueness: 1.0,
413
+ nullCount: 0, // Assume no nulls if unique
414
+ totalRows: this.config.sampling.maxRowsPerTable,
415
+ dataPattern: 'composite',
416
+ namingScore: 0.8, // Good naming for composite
417
+ dataTypeScore: 0.9,
418
+ warnings: ['Composite key - verify with domain expert']
419
+ };
420
+ candidates.push({
421
+ schemaName,
422
+ tableName: table.name,
423
+ columnNames: idColumns.map(c => c.name),
424
+ confidence: 75, // Moderate confidence for composite keys
425
+ evidence,
426
+ discoveredInIteration: iteration,
427
+ validatedByLLM: false,
428
+ status: 'candidate'
429
+ });
430
+ }
431
+ }
432
+ return candidates;
433
+ }
434
+ }
435
+ exports.PKDetector = PKDetector;
436
+ //# sourceMappingURL=PKDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PKDetector.js","sourceRoot":"","sources":["../../src/discovery/PKDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Relationship Discovery Module
3
+ * Detects primary keys and foreign keys in databases with incomplete metadata
4
+ */
5
+ export * from './DiscoveryTriggerAnalyzer.js';
6
+ export * from './DiscoveryEngine.js';
7
+ export * from './PKDetector.js';
8
+ export * from './FKDetector.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ /**
3
+ * Relationship Discovery Module
4
+ * Detects primary keys and foreign keys in databases with incomplete metadata
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ __exportStar(require("./DiscoveryTriggerAnalyzer.js"), exports);
22
+ __exportStar(require("./DiscoveryEngine.js"), exports);
23
+ __exportStar(require("./PKDetector.js"), exports);
24
+ __exportStar(require("./FKDetector.js"), exports);
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,gEAA8C;AAC9C,uDAAqC;AACrC,kDAAgC;AAChC,kDAAgC"}