@memberjunction/db-auto-doc 6.2.0-edge.5 → 6.2.0-edge.6
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 +10 -0
- package/dist/api/DBAutoDocAPI.d.ts +2 -0
- package/dist/api/DBAutoDocAPI.d.ts.map +1 -1
- package/dist/api/DBAutoDocAPI.js +2 -1
- package/dist/api/DBAutoDocAPI.js.map +1 -1
- package/dist/core/AnalysisEngine.d.ts +24 -0
- package/dist/core/AnalysisEngine.d.ts.map +1 -1
- package/dist/core/AnalysisEngine.js +104 -11
- package/dist/core/AnalysisEngine.js.map +1 -1
- package/dist/core/AnalysisOrchestrator.d.ts.map +1 -1
- package/dist/core/AnalysisOrchestrator.js +17 -5
- package/dist/core/AnalysisOrchestrator.js.map +1 -1
- package/dist/discovery/ColumnNormalizer.d.ts +31 -0
- package/dist/discovery/ColumnNormalizer.d.ts.map +1 -1
- package/dist/discovery/ColumnNormalizer.js +68 -2
- package/dist/discovery/ColumnNormalizer.js.map +1 -1
- package/dist/discovery/Composer.d.ts +33 -2
- package/dist/discovery/Composer.d.ts.map +1 -1
- package/dist/discovery/Composer.js +126 -5
- package/dist/discovery/Composer.js.map +1 -1
- package/dist/discovery/DiscoveryEngine.d.ts +3 -0
- package/dist/discovery/DiscoveryEngine.d.ts.map +1 -1
- package/dist/discovery/DiscoveryEngine.js +1 -1
- package/dist/discovery/DiscoveryEngine.js.map +1 -1
- package/dist/discovery/EmbeddingProvider.d.ts +6 -1
- package/dist/discovery/EmbeddingProvider.d.ts.map +1 -1
- package/dist/discovery/EmbeddingProvider.js +11 -1
- package/dist/discovery/EmbeddingProvider.js.map +1 -1
- package/dist/discovery/IndexKeyEvidence.d.ts +36 -0
- package/dist/discovery/IndexKeyEvidence.d.ts.map +1 -0
- package/dist/discovery/IndexKeyEvidence.js +42 -0
- package/dist/discovery/IndexKeyEvidence.js.map +1 -0
- package/dist/discovery/JoinProbe.d.ts +148 -0
- package/dist/discovery/JoinProbe.d.ts.map +1 -0
- package/dist/discovery/JoinProbe.js +233 -0
- package/dist/discovery/JoinProbe.js.map +1 -0
- package/dist/discovery/LLMDiscoveryValidator.d.ts +8 -1
- package/dist/discovery/LLMDiscoveryValidator.d.ts.map +1 -1
- package/dist/discovery/LLMDiscoveryValidator.js +24 -3
- package/dist/discovery/LLMDiscoveryValidator.js.map +1 -1
- package/dist/discovery/LLMSanityChecker.d.ts.map +1 -1
- package/dist/discovery/LLMSanityChecker.js +10 -1
- package/dist/discovery/LLMSanityChecker.js.map +1 -1
- package/dist/discovery/OrganicKeyDetector.d.ts +29 -1
- package/dist/discovery/OrganicKeyDetector.d.ts.map +1 -1
- package/dist/discovery/OrganicKeyDetector.js +26 -3
- package/dist/discovery/OrganicKeyDetector.js.map +1 -1
- package/dist/discovery/OrganicKeyTranslator.d.ts +24 -5
- package/dist/discovery/OrganicKeyTranslator.d.ts.map +1 -1
- package/dist/discovery/OrganicKeyTranslator.js +32 -14
- package/dist/discovery/OrganicKeyTranslator.js.map +1 -1
- package/dist/discovery/PKDetector.d.ts +9 -0
- package/dist/discovery/PKDetector.d.ts.map +1 -1
- package/dist/discovery/PKDetector.js +86 -8
- package/dist/discovery/PKDetector.js.map +1 -1
- package/dist/discovery/SemanticPhase.d.ts +25 -0
- package/dist/discovery/SemanticPhase.d.ts.map +1 -1
- package/dist/discovery/SemanticPhase.js +55 -11
- package/dist/discovery/SemanticPhase.js.map +1 -1
- package/dist/discovery/embedding-provider-default.d.ts +25 -0
- package/dist/discovery/embedding-provider-default.d.ts.map +1 -0
- package/dist/discovery/embedding-provider-default.js +47 -0
- package/dist/discovery/embedding-provider-default.js.map +1 -0
- package/dist/drivers/BaseAutoDocDriver.d.ts +63 -0
- package/dist/drivers/BaseAutoDocDriver.d.ts.map +1 -1
- package/dist/drivers/BaseAutoDocDriver.js.map +1 -1
- package/dist/drivers/MySQLDriver.d.ts +21 -1
- package/dist/drivers/MySQLDriver.d.ts.map +1 -1
- package/dist/drivers/MySQLDriver.js +64 -0
- package/dist/drivers/MySQLDriver.js.map +1 -1
- package/dist/drivers/PostgreSQLDriver.d.ts +34 -1
- package/dist/drivers/PostgreSQLDriver.d.ts.map +1 -1
- package/dist/drivers/PostgreSQLDriver.js +91 -0
- package/dist/drivers/PostgreSQLDriver.js.map +1 -1
- package/dist/drivers/SQLServerDriver.d.ts +28 -1
- package/dist/drivers/SQLServerDriver.d.ts.map +1 -1
- package/dist/drivers/SQLServerDriver.js +106 -0
- package/dist/drivers/SQLServerDriver.js.map +1 -1
- package/dist/drivers/probeErrors.d.ts +30 -0
- package/dist/drivers/probeErrors.d.ts.map +1 -0
- package/dist/drivers/probeErrors.js +94 -0
- package/dist/drivers/probeErrors.js.map +1 -0
- package/dist/generators/AdditionalSchemaInfoGenerator.d.ts +0 -18
- package/dist/generators/AdditionalSchemaInfoGenerator.d.ts.map +1 -1
- package/dist/generators/AdditionalSchemaInfoGenerator.js +45 -4
- package/dist/generators/AdditionalSchemaInfoGenerator.js.map +1 -1
- package/dist/prompts/PromptEngine.d.ts.map +1 -1
- package/dist/prompts/PromptEngine.js +10 -1
- package/dist/prompts/PromptEngine.js.map +1 -1
- package/dist/types/config.d.ts +82 -4
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/discovery.d.ts +39 -0
- package/dist/types/discovery.d.ts.map +1 -1
- package/dist/types/state.d.ts +2 -0
- package/dist/types/state.d.ts.map +1 -1
- package/dist/utils/call-deadline.d.ts +43 -0
- package/dist/utils/call-deadline.d.ts.map +1 -0
- package/dist/utils/call-deadline.js +81 -0
- package/dist/utils/call-deadline.js.map +1 -0
- package/dist/utils/index-hints.d.ts +8 -1
- package/dist/utils/index-hints.d.ts.map +1 -1
- package/dist/utils/index-hints.js +15 -0
- package/dist/utils/index-hints.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/seed-context.d.ts +23 -0
- package/dist/utils/seed-context.d.ts.map +1 -0
- package/dist/utils/seed-context.js +38 -0
- package/dist/utils/seed-context.js.map +1 -0
- package/package.json +5 -5
- package/prompts/fk-pruning-holistic.md +7 -0
- package/prompts/fk-pruning-table.md +7 -0
- package/prompts/pk-pruning-holistic.md +7 -0
- package/prompts/pk-pruning-table.md +7 -0
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
*/
|
|
28
28
|
import { CreateLLMInstance } from '../utils/llm-factory.js';
|
|
29
29
|
import { CleanAndParseJSON } from '../utils/json.js';
|
|
30
|
+
import { ResolveCallTimeoutMs, WithCallDeadline } from '../utils/call-deadline.js';
|
|
30
31
|
export class TableNormalizer {
|
|
31
32
|
constructor(aiConfig) {
|
|
32
33
|
this.aiConfig = aiConfig;
|
|
@@ -50,17 +51,24 @@ export class TableNormalizer {
|
|
|
50
51
|
};
|
|
51
52
|
let lastError = '';
|
|
52
53
|
let cumTokens = { total: 0, input: 0, output: 0 };
|
|
54
|
+
const what = `normalizer for ${input.schema}.${input.table}`;
|
|
53
55
|
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
54
56
|
let result;
|
|
55
57
|
try {
|
|
56
|
-
|
|
58
|
+
// Bounded, like every other live call site. A provider that accepts the socket and
|
|
59
|
+
// then stops sending never settles the promise, and this loop only runs once one
|
|
60
|
+
// settles — so without the deadline a single stalled table parks a worker for the
|
|
61
|
+
// rest of the run, and with concurrency N, N stalls park the whole pass.
|
|
62
|
+
result = await WithCallDeadline(ResolveCallTimeoutMs(this.aiConfig.callTimeoutMs), what, (signal) => this.llm.ChatCompletion({ ...params, cancellationToken: signal }));
|
|
57
63
|
}
|
|
58
64
|
catch (err) {
|
|
59
65
|
lastError = `LLM call threw: ${err.message}`;
|
|
66
|
+
await this.waitBeforeRetry(attempt, maxRetries);
|
|
60
67
|
continue;
|
|
61
68
|
}
|
|
62
69
|
if (!result.success) {
|
|
63
70
|
lastError = `LLM call failed: ${result.errorMessage ?? 'unknown'}`;
|
|
71
|
+
await this.waitBeforeRetry(attempt, maxRetries);
|
|
64
72
|
continue;
|
|
65
73
|
}
|
|
66
74
|
const content = result.data?.choices?.[0]?.message?.content ?? '';
|
|
@@ -110,6 +118,35 @@ export class TableNormalizer {
|
|
|
110
118
|
}
|
|
111
119
|
return { normalized: [], tokens: cumTokens, errorMessage: lastError || 'unknown failure after retries' };
|
|
112
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* Wait before retrying a TRANSPORT failure — a thrown call or an unsuccessful result.
|
|
123
|
+
*
|
|
124
|
+
* The retry loop had no delay at all: a rate-limited or failing provider was hit again
|
|
125
|
+
* immediately, three times per table, across every worker at once. That is the shape that
|
|
126
|
+
* turns one 429 into a burst of them.
|
|
127
|
+
*
|
|
128
|
+
* Parse and shape failures deliberately do NOT come here. Nothing upstream is recovering from
|
|
129
|
+
* a malformed JSON body, so waiting only makes the run longer.
|
|
130
|
+
*
|
|
131
|
+
* The knobs are `ai.retry`, shared with `PromptEngine` so one configuration governs both. Its
|
|
132
|
+
* defaults are tuned for a 5-retry documentation call, so when nothing is configured this uses
|
|
133
|
+
* its own smaller ones: a per-table normalizer with concurrency 8 and 2 retries should not sit
|
|
134
|
+
* out 30 seconds on the first failure.
|
|
135
|
+
*/
|
|
136
|
+
async waitBeforeRetry(attempt, maxRetries) {
|
|
137
|
+
if (attempt >= maxRetries) {
|
|
138
|
+
return; // the loop is about to end; a delay here only postpones the error
|
|
139
|
+
}
|
|
140
|
+
const retry = this.aiConfig.retry;
|
|
141
|
+
const initialDelayMs = retry?.initialDelayMs ?? 1_000;
|
|
142
|
+
const maxDelayMs = retry?.maxDelayMs ?? 30_000;
|
|
143
|
+
const multiplier = retry?.backoffMultiplier ?? 2;
|
|
144
|
+
const base = Math.min(initialDelayMs * Math.pow(multiplier, attempt), maxDelayMs);
|
|
145
|
+
// ±20% jitter, as in PromptEngine: concurrent workers that back off in lockstep re-converge
|
|
146
|
+
// on the provider together and reproduce the burst the backoff exists to break up.
|
|
147
|
+
const delay = Math.round(base + Math.random() * 0.2 * base);
|
|
148
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
149
|
+
}
|
|
113
150
|
/** @deprecated Use {@link NormalizeTable}. */
|
|
114
151
|
async normalizeTable(input, maxRetries = 2) {
|
|
115
152
|
return this.NormalizeTable(input, maxRetries);
|
|
@@ -118,6 +155,13 @@ export class TableNormalizer {
|
|
|
118
155
|
async NormalizeAll(tables, opts = {}) {
|
|
119
156
|
const concurrency = Math.max(1, opts.Concurrency ?? 8);
|
|
120
157
|
const maxRetries = Math.max(0, opts.MaxRetries ?? 2);
|
|
158
|
+
// One place decides what "has a budget" means, and it is the `> 0` test at the check below:
|
|
159
|
+
// absent, 0, negative and NaN all fail it, so every one of them means unlimited — which is
|
|
160
|
+
// exactly what this pass did before. Normalising here as well would be a second rule that
|
|
161
|
+
// could disagree with that one.
|
|
162
|
+
const tokenBudget = opts.TokenBudget ?? 0;
|
|
163
|
+
let budgetExhausted = false;
|
|
164
|
+
let tablesSkippedForBudget = 0;
|
|
121
165
|
const allNormalized = [];
|
|
122
166
|
let rejected = 0;
|
|
123
167
|
let errors = 0;
|
|
@@ -131,6 +175,16 @@ export class TableNormalizer {
|
|
|
131
175
|
const idx = cursor++;
|
|
132
176
|
if (idx >= tables.length)
|
|
133
177
|
return;
|
|
178
|
+
// Checked here, before the call, so the budget can only be overshot by requests
|
|
179
|
+
// already in flight. `total` is read across workers without a lock: a single-
|
|
180
|
+
// threaded event loop makes this read-then-act safe, and the only cost of a stale
|
|
181
|
+
// read would be one more table, which is inside the overshoot this already allows.
|
|
182
|
+
if (tokenBudget > 0 && total >= tokenBudget) {
|
|
183
|
+
budgetExhausted = true;
|
|
184
|
+
tablesSkippedForBudget += tables.length - idx;
|
|
185
|
+
cursor = tables.length; // stop the other workers too, rather than each finding out
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
134
188
|
const r = await this.NormalizeTable(tables[idx], maxRetries);
|
|
135
189
|
total += r.tokens.total;
|
|
136
190
|
input += r.tokens.input;
|
|
@@ -151,7 +205,19 @@ export class TableNormalizer {
|
|
|
151
205
|
}
|
|
152
206
|
});
|
|
153
207
|
await Promise.all(runners);
|
|
154
|
-
|
|
208
|
+
if (budgetExhausted) {
|
|
209
|
+
console.warn(`[TableNormalizer] token budget of ${tokenBudget} reached after ${completed} of ` +
|
|
210
|
+
`${tables.length} tables (${total} tokens used). ${tablesSkippedForBudget} table(s) were ` +
|
|
211
|
+
`not normalized — organic-key results from this run are PARTIAL.`);
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
Normalized: allNormalized,
|
|
215
|
+
rejected,
|
|
216
|
+
errors,
|
|
217
|
+
tokens: { total, input, output },
|
|
218
|
+
BudgetExhausted: budgetExhausted,
|
|
219
|
+
TablesSkippedForBudget: tablesSkippedForBudget,
|
|
220
|
+
};
|
|
155
221
|
}
|
|
156
222
|
/** @deprecated Use {@link NormalizeAll}. */
|
|
157
223
|
async normalizeAll(tables, opts = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnNormalizer.js","sourceRoot":"","sources":["../../src/discovery/ColumnNormalizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"ColumnNormalizer.js","sourceRoot":"","sources":["../../src/discovery/ColumnNormalizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,15 +15,24 @@
|
|
|
15
15
|
import { OrganicKeyCluster, OrganicKeyClusterMember } from '../types/organic-keys.js';
|
|
16
16
|
import { DetectedOrganicKeysOutput } from './OrganicKeyTranslator.js';
|
|
17
17
|
import { TransitiveBridgeFinding } from './TransitiveBridgeDetector.js';
|
|
18
|
+
import { JoinProbeResult, KeyVerifier } from './JoinProbe.js';
|
|
18
19
|
/** Output of the compose step: the PR #2193 JSON, the FK-redundancy-annotated clusters, and emit counts. */
|
|
19
20
|
export interface ComposerResult {
|
|
20
21
|
output: DetectedOrganicKeysOutput;
|
|
22
|
+
/** Per-cluster record of what the value-overlap probe concluded, for reporting. */
|
|
23
|
+
Verification: ClusterVerification[];
|
|
21
24
|
/** Clusters with isFKRedundant filled in — callers that persist the cluster list
|
|
22
25
|
* (e.g. detector → state.json → dashboard) should use THIS, not the pre-compose
|
|
23
26
|
* input, otherwise the flag is silently lost. */
|
|
24
27
|
AnnotatedClusters: OrganicKeyCluster[];
|
|
25
28
|
Emitted: number;
|
|
26
29
|
FlaggedFKRedundant: number;
|
|
30
|
+
/** Clusters dropped because the probe refuted the shared value space. */
|
|
31
|
+
DroppedUnverified: number;
|
|
32
|
+
/** Individual members dropped for not sharing the anchor's value space. */
|
|
33
|
+
DroppedMembers: number;
|
|
34
|
+
/** Concepts not emitted because no member is its table's primary key (every pair would be a co-reference). */
|
|
35
|
+
SkippedUnanchored: number;
|
|
27
36
|
Summary: {
|
|
28
37
|
outputSchemas: number;
|
|
29
38
|
outputTables: number;
|
|
@@ -31,6 +40,23 @@ export interface ComposerResult {
|
|
|
31
40
|
outputSpokes: number;
|
|
32
41
|
};
|
|
33
42
|
}
|
|
43
|
+
/** What the probe concluded about one cluster. */
|
|
44
|
+
export interface ClusterVerification {
|
|
45
|
+
ClusterId: string;
|
|
46
|
+
Concept: string;
|
|
47
|
+
/** `schema.table.column` of the member every other member was probed against. */
|
|
48
|
+
Anchor: string;
|
|
49
|
+
MembersIn: number;
|
|
50
|
+
MembersKept: number;
|
|
51
|
+
/** One entry per probed member. */
|
|
52
|
+
Results: Array<{
|
|
53
|
+
member: string;
|
|
54
|
+
status: JoinProbeResult['Status'];
|
|
55
|
+
reason: string;
|
|
56
|
+
}>;
|
|
57
|
+
/** True when the cluster was not emitted at all. */
|
|
58
|
+
Dropped: boolean;
|
|
59
|
+
}
|
|
34
60
|
/**
|
|
35
61
|
* Compose detected clusters + transitive bridges into the PR #2193 emit JSON.
|
|
36
62
|
*
|
|
@@ -38,9 +64,14 @@ export interface ComposerResult {
|
|
|
38
64
|
* declared foreign key — kept but flagged, not dropped). Matching transitive bridges are
|
|
39
65
|
* attached as spokes. Returns the JSON plus the annotated clusters and emit counts.
|
|
40
66
|
*/
|
|
41
|
-
export declare function Compose(clusters: OrganicKeyCluster[], bridges: TransitiveBridgeFinding[]): ComposerResult
|
|
67
|
+
export declare function Compose(clusters: OrganicKeyCluster[], bridges: TransitiveBridgeFinding[], verifier?: KeyVerifier | null, options?: ComposeOptions): Promise<ComposerResult>;
|
|
68
|
+
/** Emit-time options threaded through to the translator. */
|
|
69
|
+
export interface ComposeOptions {
|
|
70
|
+
/** See {@link import('./OrganicKeyTranslator.js').TranslateOptions}. Default false. */
|
|
71
|
+
AutoCreateRelatedViewOnForm?: boolean;
|
|
72
|
+
}
|
|
42
73
|
/** @deprecated Use {@link Compose}. */
|
|
43
|
-
export declare function compose(clusters: OrganicKeyCluster[], bridges: TransitiveBridgeFinding[]): ComposerResult
|
|
74
|
+
export declare function compose(clusters: OrganicKeyCluster[], bridges: TransitiveBridgeFinding[], verifier?: KeyVerifier | null, options?: ComposeOptions): Promise<ComposerResult>;
|
|
44
75
|
/**
|
|
45
76
|
* A cluster is FK-redundant when ALL non-PK members are declared FKs pointing
|
|
46
77
|
* at the same target column (typically the PK member of the cluster). PR #2193
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../src/discovery/Composer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../src/discovery/Composer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAkD,MAAM,0BAA0B,CAAC;AACtI,OAAO,EACH,yBAAyB,EAI5B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9D,4GAA4G;AAC5G,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,yBAAyB,CAAC;IAClC,mFAAmF;IACnF,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC;;sDAEkD;IAClD,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,yEAAyE;IACzE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,cAAc,EAAE,MAAM,CAAC;IACvB,8GAA8G;IAC9G,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACtG;AAED,kDAAkD;AAClD,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtF,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CACzB,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,OAAO,EAAE,uBAAuB,EAAE,EAClC,QAAQ,GAAE,WAAW,GAAG,IAAW,EACnC,OAAO,GAAE,cAAmB,GAC7B,OAAO,CAAC,cAAc,CAAC,CAsEzB;AAED,4DAA4D;AAC5D,MAAM,WAAW,cAAc;IAC3B,uFAAuF;IACvF,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACzC;AA4GD,uCAAuC;AACvC,wBAAgB,OAAO,CACnB,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,OAAO,EAAE,uBAAuB,EAAE,EAClC,QAAQ,GAAE,WAAW,GAAG,IAAW,EACnC,OAAO,GAAE,cAAmB,GAC7B,OAAO,CAAC,cAAc,CAAC,CAEzB;AAED;;;;;;;;;;GAUG;AACH,iBAAS,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAiB1D;AAED,2CAA2C;AAC3C,eAAO,MAAM,SAAS;;CAAoB,CAAC;AAE3C,yCAAyC;AACzC,eAAO,MAAM,MAAM;;CAAY,CAAC;AAEhC,yCAAyC;AACzC,eAAO,MAAM,QAAQ;;CAAY,CAAC;AAClC,YAAY,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* The dashboard surfaces a "hide FK-redundant" filter so users get the lookup-
|
|
13
13
|
* table-PK noise out of view without losing the underlying candidates.
|
|
14
14
|
*/
|
|
15
|
+
import { memberColumns } from '../types/organic-keys.js';
|
|
15
16
|
import { TranslateClusters, CountOutputEntries, } from './OrganicKeyTranslator.js';
|
|
16
17
|
/**
|
|
17
18
|
* Compose detected clusters + transitive bridges into the PR #2193 emit JSON.
|
|
@@ -20,14 +21,32 @@ import { TranslateClusters, CountOutputEntries, } from './OrganicKeyTranslator.j
|
|
|
20
21
|
* declared foreign key — kept but flagged, not dropped). Matching transitive bridges are
|
|
21
22
|
* attached as spokes. Returns the JSON plus the annotated clusters and emit counts.
|
|
22
23
|
*/
|
|
23
|
-
export function Compose(clusters, bridges) {
|
|
24
|
+
export async function Compose(clusters, bridges, verifier = null, options = {}) {
|
|
24
25
|
let flaggedCount = 0;
|
|
25
|
-
const
|
|
26
|
+
const preVerify = clusters.map((c) => {
|
|
26
27
|
const redundant = isFKRedundant(c);
|
|
27
28
|
if (redundant)
|
|
28
29
|
flaggedCount += 1;
|
|
29
30
|
return { ...c, isFKRedundant: redundant };
|
|
30
31
|
});
|
|
32
|
+
// ── Value-overlap gate ───────────────────────────────────────────────────────
|
|
33
|
+
//
|
|
34
|
+
// A cluster asserts that its member columns share a value space: that two rows
|
|
35
|
+
// holding the same value refer to the same real-world entity. Nothing checked
|
|
36
|
+
// that. Membership was decided by LLM concept naming and embedding distance, so
|
|
37
|
+
// columns that merely SOUND alike were emitted as a key — and the emitted key
|
|
38
|
+
// becomes a related-record view that value-joins them, producing "related" rows
|
|
39
|
+
// that are not related.
|
|
40
|
+
//
|
|
41
|
+
// Each member is probed against ONE anchor rather than against every other
|
|
42
|
+
// member: N-1 probes per cluster instead of N², and it tests the cluster's actual
|
|
43
|
+
// claim, since sharing a value space is transitive through the anchor. Both sides
|
|
44
|
+
// are normalized as the emitted key will normalize them, so an email key matched
|
|
45
|
+
// with LowerCaseTrim is not refuted for differing in case. The anchor
|
|
46
|
+
// is a PK member when the cluster has one (a PK is the canonical, unique value
|
|
47
|
+
// space), otherwise the first member.
|
|
48
|
+
const { clusters: annotated, verification, droppedMembers } = await verifyClusters(preVerify, verifier);
|
|
49
|
+
const droppedUnverified = preVerify.length - annotated.length;
|
|
31
50
|
const hubKeys = new Set();
|
|
32
51
|
for (const c of annotated) {
|
|
33
52
|
for (const m of c.members)
|
|
@@ -47,13 +66,21 @@ export function Compose(clusters, bridges) {
|
|
|
47
66
|
relatedEntityJoinFieldName: b.View.SpokeJoinField,
|
|
48
67
|
hubConcept: b.HubConcept,
|
|
49
68
|
}));
|
|
50
|
-
|
|
69
|
+
let skippedUnanchored = 0;
|
|
70
|
+
const output = TranslateClusters(annotated, spokes, {
|
|
71
|
+
AutoCreateRelatedViewOnForm: options.AutoCreateRelatedViewOnForm,
|
|
72
|
+
OnUnanchored: () => { skippedUnanchored++; },
|
|
73
|
+
});
|
|
51
74
|
const counts = CountOutputEntries(output);
|
|
52
75
|
return {
|
|
53
76
|
output,
|
|
54
77
|
AnnotatedClusters: annotated,
|
|
78
|
+
Verification: verification,
|
|
55
79
|
Emitted: annotated.length,
|
|
56
80
|
FlaggedFKRedundant: flaggedCount,
|
|
81
|
+
DroppedUnverified: droppedUnverified,
|
|
82
|
+
DroppedMembers: droppedMembers,
|
|
83
|
+
SkippedUnanchored: skippedUnanchored,
|
|
57
84
|
Summary: {
|
|
58
85
|
outputSchemas: counts.schemas,
|
|
59
86
|
outputTables: counts.tables,
|
|
@@ -62,9 +89,103 @@ export function Compose(clusters, bridges) {
|
|
|
62
89
|
},
|
|
63
90
|
};
|
|
64
91
|
}
|
|
92
|
+
/** `schema.table.col[,col]` for a cluster member. */
|
|
93
|
+
function memberLabel(m) {
|
|
94
|
+
return `${m.schema}.${m.table}.${memberColumns(m).join(',')}`;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Pick the member every other member is probed against.
|
|
98
|
+
*
|
|
99
|
+
* A PK member is preferred: its value space is canonical and unique, so containment
|
|
100
|
+
* into it is a meaningful measure. Failing that, the first member — arbitrary but
|
|
101
|
+
* stable, and the probe is symmetric enough that the choice does not change which
|
|
102
|
+
* clusters survive, only which member is reported as the reference.
|
|
103
|
+
*/
|
|
104
|
+
function pickAnchorMember(members) {
|
|
105
|
+
return members.find((m) => m.isPrimaryKey) ?? members[0];
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The strategy a member's values are compared with at match time: its own, else the
|
|
109
|
+
* cluster's. The same fallback the translator writes into the emitted key.
|
|
110
|
+
*/
|
|
111
|
+
function matchNormalization(m, cluster) {
|
|
112
|
+
return m.normalizationStrategy ?? cluster.normalization;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Drop cluster members whose values do not overlap the anchor's, and drop any cluster
|
|
116
|
+
* left with fewer than two members or spanning fewer than two tables.
|
|
117
|
+
*
|
|
118
|
+
* `Unprobed` members are KEPT. Refusing to emit whenever a probe cannot run would turn
|
|
119
|
+
* a permissions or budget problem into silent total key loss; the member stays and the
|
|
120
|
+
* per-cluster record says it was never checked. Only a measured refutation removes
|
|
121
|
+
* anything.
|
|
122
|
+
*/
|
|
123
|
+
async function verifyClusters(clusters, verifier) {
|
|
124
|
+
const out = [];
|
|
125
|
+
const verification = [];
|
|
126
|
+
let droppedMembers = 0;
|
|
127
|
+
for (const cluster of clusters) {
|
|
128
|
+
if (!verifier || cluster.members.length < 2) {
|
|
129
|
+
// Nothing to probe against, or no probe available: emit unchanged and say so.
|
|
130
|
+
verification.push({
|
|
131
|
+
ClusterId: cluster.id,
|
|
132
|
+
Concept: cluster.concept,
|
|
133
|
+
Anchor: cluster.members.length > 0 ? memberLabel(pickAnchorMember(cluster.members)) : '',
|
|
134
|
+
MembersIn: cluster.members.length,
|
|
135
|
+
MembersKept: cluster.members.length,
|
|
136
|
+
Results: [],
|
|
137
|
+
Dropped: false,
|
|
138
|
+
});
|
|
139
|
+
out.push(cluster);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const anchorMember = pickAnchorMember(cluster.members);
|
|
143
|
+
const kept = [];
|
|
144
|
+
const results = [];
|
|
145
|
+
for (const member of cluster.members) {
|
|
146
|
+
if (member === anchorMember) {
|
|
147
|
+
kept.push(member);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const probe = await verifier.Verify({
|
|
151
|
+
Child: { Schema: member.schema, Table: member.table, Column: member.column },
|
|
152
|
+
Parent: { Schema: anchorMember.schema, Table: anchorMember.table, Column: anchorMember.column },
|
|
153
|
+
Normalization: {
|
|
154
|
+
Child: matchNormalization(member, cluster),
|
|
155
|
+
Parent: matchNormalization(anchorMember, cluster),
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
results.push({ member: memberLabel(member), status: probe.Status, reason: probe.Reason });
|
|
159
|
+
if (probe.Status === 'Refuted') {
|
|
160
|
+
droppedMembers += 1;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
kept.push(member);
|
|
164
|
+
}
|
|
165
|
+
const distinctTables = new Set(kept.map((m) => `${m.schema}.${m.table}`));
|
|
166
|
+
const dropped = kept.length < 2 || distinctTables.size < 2;
|
|
167
|
+
verification.push({
|
|
168
|
+
ClusterId: cluster.id,
|
|
169
|
+
Concept: cluster.concept,
|
|
170
|
+
Anchor: memberLabel(anchorMember),
|
|
171
|
+
MembersIn: cluster.members.length,
|
|
172
|
+
MembersKept: dropped ? 0 : kept.length,
|
|
173
|
+
Results: results,
|
|
174
|
+
Dropped: dropped,
|
|
175
|
+
});
|
|
176
|
+
if (dropped) {
|
|
177
|
+
// Everything but the anchor was refuted, or what survives no longer spans
|
|
178
|
+
// two tables — there is no cross-table organic key left to emit.
|
|
179
|
+
droppedMembers += kept.length;
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
out.push({ ...cluster, members: kept });
|
|
183
|
+
}
|
|
184
|
+
return { clusters: out, verification, droppedMembers };
|
|
185
|
+
}
|
|
65
186
|
/** @deprecated Use {@link Compose}. */
|
|
66
|
-
export function compose(clusters, bridges) {
|
|
67
|
-
return Compose(clusters, bridges);
|
|
187
|
+
export function compose(clusters, bridges, verifier = null, options = {}) {
|
|
188
|
+
return Compose(clusters, bridges, verifier, options);
|
|
68
189
|
}
|
|
69
190
|
/**
|
|
70
191
|
* A cluster is FK-redundant when ALL non-PK members are declared FKs pointing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../src/discovery/Composer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../src/discovery/Composer.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { ColumnStatsCache } from './ColumnStatsCache.js';
|
|
|
7
7
|
import { SchemaDefinition, DatabaseDocumentation } from '../types/state.js';
|
|
8
8
|
import { RelationshipDiscoveryPhase, DiscoveryTriggerAnalysis } from '../types/discovery.js';
|
|
9
9
|
import { RelationshipDiscoveryConfig, AIConfig } from '../types/config.js';
|
|
10
|
+
import { SeedContextText } from '../utils/seed-context.js';
|
|
10
11
|
export interface DiscoveryEngineOptions {
|
|
11
12
|
Driver: BaseAutoDocDriver;
|
|
12
13
|
Config: RelationshipDiscoveryConfig;
|
|
@@ -14,6 +15,8 @@ export interface DiscoveryEngineOptions {
|
|
|
14
15
|
schemas: SchemaDefinition[];
|
|
15
16
|
OnProgress?: (message: string, data?: any) => void;
|
|
16
17
|
OnCheckpoint?: (phase: RelationshipDiscoveryPhase) => Promise<void>;
|
|
18
|
+
/** The operator's seed context, passed to the LLM validator. */
|
|
19
|
+
SeedContext?: SeedContextText;
|
|
17
20
|
}
|
|
18
21
|
export interface DiscoveryResult {
|
|
19
22
|
Phase: RelationshipDiscoveryPhase;
|
|
@@ -1 +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,EAAmB,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EACL,0BAA0B,EAI1B,wBAAwB,EACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,2BAA2B,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"DiscoveryEngine.d.ts","sourceRoot":"","sources":["../../src/discovery/DiscoveryEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,7 +23,7 @@ export class DiscoveryEngine {
|
|
|
23
23
|
this.sanityChecker = new LLMSanityChecker(this.aiConfig, this.statsCache);
|
|
24
24
|
// Create LLM validator if enabled (runs per-table validation)
|
|
25
25
|
if (this.config.llmValidation?.enabled) {
|
|
26
|
-
this.llmValidator = new LLMDiscoveryValidator(this.driver, this.config, this.aiConfig, this.statsCache, this.schemas);
|
|
26
|
+
this.llmValidator = new LLMDiscoveryValidator(this.driver, this.config, this.aiConfig, this.statsCache, this.schemas, options.SeedContext);
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
/**
|