@x12i/memorix-hippox 1.32.0 → 1.34.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 +12 -4
- package/dist/field-classification.d.ts +13 -0
- package/dist/field-classification.d.ts.map +1 -0
- package/dist/field-classification.js +64 -0
- package/dist/field-classification.js.map +1 -0
- package/dist/graph-inference.d.ts +43 -0
- package/dist/graph-inference.d.ts.map +1 -0
- package/dist/graph-inference.js +262 -0
- package/dist/graph-inference.js.map +1 -0
- package/dist/http/register-routes.d.ts.map +1 -1
- package/dist/http/register-routes.js +4 -3
- package/dist/http/register-routes.js.map +1 -1
- package/dist/identifier-discovery.d.ts +34 -0
- package/dist/identifier-discovery.d.ts.map +1 -0
- package/dist/identifier-discovery.js +353 -0
- package/dist/identifier-discovery.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/infer-links.d.ts.map +1 -1
- package/dist/infer-links.js +48 -0
- package/dist/infer-links.js.map +1 -1
- package/dist/join-discovery.d.ts.map +1 -1
- package/dist/join-discovery.js +62 -4
- package/dist/join-discovery.js.map +1 -1
- package/dist/legacy-bridge.d.ts +6 -15
- package/dist/legacy-bridge.d.ts.map +1 -1
- package/dist/legacy-bridge.js +4 -35
- package/dist/legacy-bridge.js.map +1 -1
- package/dist/service.d.ts +5 -6
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +4 -0
- package/dist/service.js.map +1 -1
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -77,8 +77,9 @@ When mounted through `memorix-catalox-api`:
|
|
|
77
77
|
|--------|------|---------|
|
|
78
78
|
| `GET` | `/api/hippox/links?sourceObjectType=assets` | List draft + simulated + approved links |
|
|
79
79
|
| `POST` | `/api/hippox/links` | Create draft link |
|
|
80
|
-
| `GET` | `/api/hippox/join-discovery?sourceObjectType=…&targetObjectType=…` | Rank join fields and recommend default pair |
|
|
81
|
-
| `
|
|
80
|
+
| `GET` | `/api/hippox/join-discovery?sourceObjectType=…&targetObjectType=…` | Rank join fields and recommend default pair (`findMode=field-join` default) |
|
|
81
|
+
| `GET` | `/api/hippox/join-discovery?…&findMode=identifier` | Mode A: source value paths → target identity / concept candidates |
|
|
82
|
+
| `POST` | `/api/hippox/join-discovery` | Same as GET with body parameters (`findMode` optional) |
|
|
82
83
|
| `POST` | `/api/hippox/infer-links` | Fuzzy-map joins across object types (`@x12i/helpers` ≥ 2.0) |
|
|
83
84
|
| `POST` | `/api/hippox/links/from-relation-candidate` | Create Hippox draft from schema relation candidate |
|
|
84
85
|
| `POST` | `/api/hippox/links/simulate` | Simulate unsaved definition |
|
|
@@ -88,7 +89,11 @@ When mounted through `memorix-catalox-api`:
|
|
|
88
89
|
|
|
89
90
|
### Join discovery response (summary)
|
|
90
91
|
|
|
91
|
-
Returns ranked `sourceFields`, `targetFields`, `joinCandidates`, and `recommendedJoin` for
|
|
92
|
+
Returns ranked `sourceFields`, `targetFields`, `joinCandidates`, and `recommendedJoin` for Mode B (`findMode=field-join`, default). Each field includes a `classification` of `link-target` | `join-out` | `other`; pure link-target identity fields are demoted so Mode B dropdowns do not treat them as outward join keys.
|
|
93
|
+
|
|
94
|
+
With `findMode=identifier` (Mode A), the response also includes `sourceValuePaths`, `targetIdentityCandidates`, and `recommendedMatch` (or `null` + warnings). Mode A does not require a target `data.*` join path — the target side is identity / concept matching.
|
|
95
|
+
|
|
96
|
+
Discovery is ephemeral (optional in-memory cache); only approved links persist.
|
|
92
97
|
|
|
93
98
|
## Programmatic usage
|
|
94
99
|
|
|
@@ -127,7 +132,10 @@ const resolved = await hippox.resolveContextInput({
|
|
|
127
132
|
|
|
128
133
|
## Legacy relation links
|
|
129
134
|
|
|
130
|
-
|
|
135
|
+
Relation-based `JobContextLink` / `contextLinks` are **not** resolved into
|
|
136
|
+
`jobMemory`. Prefer Hippox approved links (`resolveContext` /
|
|
137
|
+
`resolveContextInput`). `resolveMixedContext()` remains as a deprecated alias
|
|
138
|
+
that only forwards Hippox resolution (no `_legacy` merge).
|
|
131
139
|
|
|
132
140
|
## Retrieval types
|
|
133
141
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type FieldClassification = 'link-target' | 'join-out' | 'other';
|
|
2
|
+
/**
|
|
3
|
+
* Classify a document path for Hippox find modes.
|
|
4
|
+
* - link-target: the record's own identity / concept (what others match against)
|
|
5
|
+
* - join-out: domain fields used as outward join keys (default for data.* scalars)
|
|
6
|
+
* - other: neither clearly identity nor a join-out candidate
|
|
7
|
+
*/
|
|
8
|
+
export declare function classifyFieldPath(path: string): FieldClassification;
|
|
9
|
+
export declare function isPureLinkTargetPath(path: string): boolean;
|
|
10
|
+
/** Target identity kinds / paths for Mode A (identifier / concept matching). */
|
|
11
|
+
export declare function isTargetIdentityPath(path: string): boolean;
|
|
12
|
+
export declare function identityKindFromPath(path: string): string;
|
|
13
|
+
//# sourceMappingURL=field-classification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-classification.d.ts","sourceRoot":"","sources":["../src/field-classification.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG,UAAU,GAAG,OAAO,CAAC;AAMvE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAmBnE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAO1D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYzD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
const IDENTIFIER_KEY_RE = /IdentifierKey$/i;
|
|
2
|
+
const CONCEPT_IDENTIFIER_RE = /^concept\.identifier(?:\.|$)/i;
|
|
3
|
+
const IDENTITY_RECORD_RE = /^(?:identity\.)?recordId$/i;
|
|
4
|
+
/**
|
|
5
|
+
* Classify a document path for Hippox find modes.
|
|
6
|
+
* - link-target: the record's own identity / concept (what others match against)
|
|
7
|
+
* - join-out: domain fields used as outward join keys (default for data.* scalars)
|
|
8
|
+
* - other: neither clearly identity nor a join-out candidate
|
|
9
|
+
*/
|
|
10
|
+
export function classifyFieldPath(path) {
|
|
11
|
+
const trimmed = path.trim();
|
|
12
|
+
if (!trimmed)
|
|
13
|
+
return 'other';
|
|
14
|
+
const leaf = trimmed.includes('.') ? trimmed.slice(trimmed.lastIndexOf('.') + 1) : trimmed;
|
|
15
|
+
if (CONCEPT_IDENTIFIER_RE.test(trimmed))
|
|
16
|
+
return 'link-target';
|
|
17
|
+
if (IDENTITY_RECORD_RE.test(trimmed))
|
|
18
|
+
return 'link-target';
|
|
19
|
+
if (IDENTIFIER_KEY_RE.test(leaf))
|
|
20
|
+
return 'link-target';
|
|
21
|
+
if (leaf.toLowerCase() === 'id' || leaf === '_id')
|
|
22
|
+
return 'link-target';
|
|
23
|
+
if (trimmed.startsWith('data.') || trimmed === 'data')
|
|
24
|
+
return 'join-out';
|
|
25
|
+
// Root-level FK-like names that point outward (not *IdentifierKey — those are link-target).
|
|
26
|
+
if (!trimmed.includes('.') && /(?:Id|_id|Ids|_ids|Code|Codes|Sku|Skus|Ref|_ref)$/i.test(leaf)) {
|
|
27
|
+
return 'join-out';
|
|
28
|
+
}
|
|
29
|
+
return 'other';
|
|
30
|
+
}
|
|
31
|
+
export function isPureLinkTargetPath(path) {
|
|
32
|
+
return classifyFieldPath(path) === 'link-target';
|
|
33
|
+
}
|
|
34
|
+
/** Target identity kinds / paths for Mode A (identifier / concept matching). */
|
|
35
|
+
export function isTargetIdentityPath(path) {
|
|
36
|
+
const trimmed = path.trim();
|
|
37
|
+
if (CONCEPT_IDENTIFIER_RE.test(trimmed))
|
|
38
|
+
return true;
|
|
39
|
+
if (IDENTITY_RECORD_RE.test(trimmed))
|
|
40
|
+
return true;
|
|
41
|
+
if (IDENTIFIER_KEY_RE.test(leafName(trimmed)))
|
|
42
|
+
return true;
|
|
43
|
+
const leaf = leafName(trimmed).toLowerCase();
|
|
44
|
+
return leaf === 'id' || leaf === '_id' || leaf === 'recordid' || leaf === 'targetid';
|
|
45
|
+
}
|
|
46
|
+
export function identityKindFromPath(path) {
|
|
47
|
+
const trimmed = path.trim();
|
|
48
|
+
if (trimmed === 'concept.identifier' || trimmed.startsWith('concept.identifier.')) {
|
|
49
|
+
const rest = trimmed.slice('concept.identifier'.length).replace(/^\./, '');
|
|
50
|
+
return rest || 'identifier';
|
|
51
|
+
}
|
|
52
|
+
if (IDENTITY_RECORD_RE.test(trimmed))
|
|
53
|
+
return 'recordId';
|
|
54
|
+
const leaf = leafName(trimmed);
|
|
55
|
+
if (IDENTIFIER_KEY_RE.test(leaf)) {
|
|
56
|
+
return leaf.replace(/IdentifierKey$/i, '') || leaf;
|
|
57
|
+
}
|
|
58
|
+
return leaf;
|
|
59
|
+
}
|
|
60
|
+
function leafName(path) {
|
|
61
|
+
const segments = path.split('.');
|
|
62
|
+
return segments[segments.length - 1] ?? path;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=field-classification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-classification.js","sourceRoot":"","sources":["../src/field-classification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { MemorixEntityGraphCapability, MemorixGraphDescriptor } from '@x12i/memorix-descriptors';
|
|
2
|
+
import type { MemorixRetrievalClient } from '@x12i/memorix-retrieval';
|
|
3
|
+
import type { InferredContextLink } from './types.js';
|
|
4
|
+
export type GraphDescriptorGuess = {
|
|
5
|
+
descriptor: MemorixGraphDescriptor;
|
|
6
|
+
/** Entity graph capabilities synthesized from Hippox joins (keyed by object type). */
|
|
7
|
+
entityCapabilities: Record<string, MemorixEntityGraphCapability>;
|
|
8
|
+
linksUsed: InferredContextLink[];
|
|
9
|
+
focusObjectType: string;
|
|
10
|
+
warnings: string[];
|
|
11
|
+
};
|
|
12
|
+
export type GuessMemorixGraphDescriptorOptions = {
|
|
13
|
+
retrieval: MemorixRetrievalClient;
|
|
14
|
+
graphId: string;
|
|
15
|
+
focusObjectType?: string;
|
|
16
|
+
objectTypes?: string[];
|
|
17
|
+
maxDepth?: number;
|
|
18
|
+
maxLinks?: number;
|
|
19
|
+
minConfidence?: number;
|
|
20
|
+
sampleLimit?: number;
|
|
21
|
+
minInclusionRatio?: number;
|
|
22
|
+
processEnv?: NodeJS.ProcessEnv;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Guess a focus object type from a graph id stem + known object types.
|
|
26
|
+
* Prefers left-to-right token matches (e.g. asset-topology-… → assets).
|
|
27
|
+
*/
|
|
28
|
+
export declare function guessFocusObjectType(graphId: string, objectTypes: string[]): string | null;
|
|
29
|
+
export declare function buildGraphDescriptorFromLinks(input: {
|
|
30
|
+
graphId: string;
|
|
31
|
+
focusObjectType: string;
|
|
32
|
+
links: InferredContextLink[];
|
|
33
|
+
nodeKinds?: Record<string, string>;
|
|
34
|
+
maxDepth?: number;
|
|
35
|
+
maxLinks?: number;
|
|
36
|
+
minConfidence?: number;
|
|
37
|
+
}): GraphDescriptorGuess;
|
|
38
|
+
/**
|
|
39
|
+
* Use Hippox (schema relations + fuzzy join inference) to guess a Memorix graph descriptor
|
|
40
|
+
* when Catalox has no authored graph item.
|
|
41
|
+
*/
|
|
42
|
+
export declare function guessMemorixGraphDescriptor(options: GuessMemorixGraphDescriptorOptions): Promise<GraphDescriptorGuess | null>;
|
|
43
|
+
//# sourceMappingURL=graph-inference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-inference.d.ts","sourceRoot":"","sources":["../src/graph-inference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAItE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,sBAAsB,CAAC;IACnC,sFAAsF;IACtF,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;IACjE,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,SAAS,EAAE,sBAAsB,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAChC,CAAC;AA0BF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CA2B1F;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,oBAAoB,CAwIvB;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CA6EtC"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { discoverMemorixEntities, loadMemorixEntityDescriptorByName } from '@x12i/memorix-retrieval';
|
|
2
|
+
import { identityKindFromPath } from './field-classification.js';
|
|
3
|
+
import { inferLinksForObjectTypes } from './infer-links.js';
|
|
4
|
+
function humanizeGraphId(graphId) {
|
|
5
|
+
return graphId
|
|
6
|
+
.replace(/-graph$/i, '')
|
|
7
|
+
.split('-')
|
|
8
|
+
.filter(Boolean)
|
|
9
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
10
|
+
.join(' ');
|
|
11
|
+
}
|
|
12
|
+
function slugTemplateId(source, target, sourcePath) {
|
|
13
|
+
const pathSlug = sourcePath
|
|
14
|
+
.replace(/^data\./, '')
|
|
15
|
+
.replace(/[^a-zA-Z0-9]+/g, '-')
|
|
16
|
+
.replace(/^-|-$/g, '')
|
|
17
|
+
.toLowerCase();
|
|
18
|
+
return `hippox-${source}-to-${target}-${pathSlug || 'join'}`;
|
|
19
|
+
}
|
|
20
|
+
function edgeTypeName(targetObjectType) {
|
|
21
|
+
const parts = targetObjectType.split('-').filter(Boolean);
|
|
22
|
+
const pascal = parts.map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('');
|
|
23
|
+
return `linksTo${pascal || 'Neighbor'}`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Guess a focus object type from a graph id stem + known object types.
|
|
27
|
+
* Prefers left-to-right token matches (e.g. asset-topology-… → assets).
|
|
28
|
+
*/
|
|
29
|
+
export function guessFocusObjectType(graphId, objectTypes) {
|
|
30
|
+
if (!objectTypes.length)
|
|
31
|
+
return null;
|
|
32
|
+
const stem = graphId.replace(/-graph$/i, '').toLowerCase();
|
|
33
|
+
if (objectTypes.includes(stem))
|
|
34
|
+
return stem;
|
|
35
|
+
const scored = [];
|
|
36
|
+
for (const ot of objectTypes) {
|
|
37
|
+
const singular = ot.endsWith('s') ? ot.slice(0, -1) : ot;
|
|
38
|
+
const candidates = [ot, singular].filter((c) => c.length >= 3);
|
|
39
|
+
let bestIndex = -1;
|
|
40
|
+
let bestScore = 0;
|
|
41
|
+
for (const candidate of candidates) {
|
|
42
|
+
const idx = stem.indexOf(candidate);
|
|
43
|
+
if (idx < 0)
|
|
44
|
+
continue;
|
|
45
|
+
// Prefer earlier tokens; slight boost for exact OT over singular.
|
|
46
|
+
const score = 1000 - idx + (candidate === ot ? 5 : 0) + candidate.length;
|
|
47
|
+
if (bestIndex < 0 || idx < bestIndex || (idx === bestIndex && score > bestScore)) {
|
|
48
|
+
bestIndex = idx;
|
|
49
|
+
bestScore = score;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (bestIndex >= 0)
|
|
53
|
+
scored.push({ ot, score: bestScore, index: bestIndex });
|
|
54
|
+
}
|
|
55
|
+
scored.sort((a, b) => a.index - b.index || b.score - a.score);
|
|
56
|
+
return scored[0]?.ot ?? objectTypes[0] ?? null;
|
|
57
|
+
}
|
|
58
|
+
export function buildGraphDescriptorFromLinks(input) {
|
|
59
|
+
const maxLinks = input.maxLinks ?? 12;
|
|
60
|
+
const minConfidence = input.minConfidence ?? 0.35;
|
|
61
|
+
const maxDepth = input.maxDepth ?? 2;
|
|
62
|
+
const warnings = [];
|
|
63
|
+
const ranked = [...input.links]
|
|
64
|
+
.filter((link) => link.confidence >= minConfidence)
|
|
65
|
+
.sort((a, b) => b.confidence - a.confidence || a.rank - b.rank);
|
|
66
|
+
// Keep links reachable from focus within maxDepth (undirected BFS on OT graph).
|
|
67
|
+
const adjacency = new Map();
|
|
68
|
+
for (const link of ranked) {
|
|
69
|
+
if (!adjacency.has(link.sourceObjectType))
|
|
70
|
+
adjacency.set(link.sourceObjectType, new Set());
|
|
71
|
+
if (!adjacency.has(link.targetObjectType))
|
|
72
|
+
adjacency.set(link.targetObjectType, new Set());
|
|
73
|
+
adjacency.get(link.sourceObjectType).add(link.targetObjectType);
|
|
74
|
+
adjacency.get(link.targetObjectType).add(link.sourceObjectType);
|
|
75
|
+
}
|
|
76
|
+
const reachable = new Set([input.focusObjectType]);
|
|
77
|
+
const queue = [{ ot: input.focusObjectType, depth: 0 }];
|
|
78
|
+
while (queue.length) {
|
|
79
|
+
const frame = queue.shift();
|
|
80
|
+
if (frame.depth >= maxDepth)
|
|
81
|
+
continue;
|
|
82
|
+
for (const next of adjacency.get(frame.ot) ?? []) {
|
|
83
|
+
if (reachable.has(next))
|
|
84
|
+
continue;
|
|
85
|
+
reachable.add(next);
|
|
86
|
+
queue.push({ ot: next, depth: frame.depth + 1 });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const linksUsed = ranked
|
|
90
|
+
.filter((link) => reachable.has(link.sourceObjectType) && reachable.has(link.targetObjectType))
|
|
91
|
+
.slice(0, maxLinks);
|
|
92
|
+
if (!linksUsed.length) {
|
|
93
|
+
warnings.push('No Hippox links met confidence / reachability thresholds for this focus.');
|
|
94
|
+
}
|
|
95
|
+
const objectTypes = [...reachable].sort((a, b) => {
|
|
96
|
+
if (a === input.focusObjectType)
|
|
97
|
+
return -1;
|
|
98
|
+
if (b === input.focusObjectType)
|
|
99
|
+
return 1;
|
|
100
|
+
return a.localeCompare(b);
|
|
101
|
+
});
|
|
102
|
+
const entityCapabilities = {};
|
|
103
|
+
for (const ot of objectTypes) {
|
|
104
|
+
const kind = input.nodeKinds?.[ot] ?? (ot.replace(/s$/, "") || ot);
|
|
105
|
+
entityCapabilities[ot] = {
|
|
106
|
+
node: {
|
|
107
|
+
kind,
|
|
108
|
+
contentLenses: ['snapshot'],
|
|
109
|
+
directoryFields: [],
|
|
110
|
+
},
|
|
111
|
+
edgeTemplates: [],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const includeEdgeTemplates = [];
|
|
115
|
+
for (const link of linksUsed) {
|
|
116
|
+
const templateId = slugTemplateId(link.sourceObjectType, link.targetObjectType, link.sourcePath);
|
|
117
|
+
includeEdgeTemplates.push(templateId);
|
|
118
|
+
const toKind = input.nodeKinds?.[link.targetObjectType]
|
|
119
|
+
?? identityKindFromPath(link.targetPath)
|
|
120
|
+
?? link.targetObjectType;
|
|
121
|
+
const cap = entityCapabilities[link.sourceObjectType];
|
|
122
|
+
if (!cap)
|
|
123
|
+
continue;
|
|
124
|
+
cap.edgeTemplates = cap.edgeTemplates ?? [];
|
|
125
|
+
cap.edgeTemplates.push({
|
|
126
|
+
id: templateId,
|
|
127
|
+
source: {
|
|
128
|
+
kind: 'queryByField',
|
|
129
|
+
objectType: link.targetObjectType,
|
|
130
|
+
sourcePath: link.sourcePath,
|
|
131
|
+
targetPath: link.targetPath,
|
|
132
|
+
limit: 50,
|
|
133
|
+
},
|
|
134
|
+
edges: [
|
|
135
|
+
{
|
|
136
|
+
type: edgeTypeName(link.targetObjectType),
|
|
137
|
+
from: { source: 'concept' },
|
|
138
|
+
to: { source: 'relatedConcept' },
|
|
139
|
+
toObjectType: link.targetObjectType,
|
|
140
|
+
toKind,
|
|
141
|
+
neighbor: 'to',
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
const related = objectTypes.filter((ot) => ot !== input.focusObjectType);
|
|
147
|
+
const tiers = [
|
|
148
|
+
{
|
|
149
|
+
id: 'focus',
|
|
150
|
+
label: 'Focus',
|
|
151
|
+
objectTypes: [input.focusObjectType],
|
|
152
|
+
},
|
|
153
|
+
...(related.length
|
|
154
|
+
? [{ id: 'related', label: 'Related', objectTypes: related }]
|
|
155
|
+
: []),
|
|
156
|
+
];
|
|
157
|
+
const descriptor = {
|
|
158
|
+
id: input.graphId,
|
|
159
|
+
title: humanizeGraphId(input.graphId),
|
|
160
|
+
focusObjectType: input.focusObjectType,
|
|
161
|
+
maxDepth,
|
|
162
|
+
includeEdgeTemplates,
|
|
163
|
+
tiers,
|
|
164
|
+
nodes: objectTypes.map((ot) => ({
|
|
165
|
+
objectType: ot,
|
|
166
|
+
kind: entityCapabilities[ot]?.node.kind,
|
|
167
|
+
tier: ot === input.focusObjectType ? 'focus' : 'related',
|
|
168
|
+
})),
|
|
169
|
+
directory: {
|
|
170
|
+
defaultObjectTypes: objectTypes,
|
|
171
|
+
searchFields: ['title', 'identifierKey'],
|
|
172
|
+
},
|
|
173
|
+
ui: {
|
|
174
|
+
icon: 'network',
|
|
175
|
+
group: 'inferred',
|
|
176
|
+
order: 100,
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
return {
|
|
180
|
+
descriptor,
|
|
181
|
+
entityCapabilities,
|
|
182
|
+
linksUsed,
|
|
183
|
+
focusObjectType: input.focusObjectType,
|
|
184
|
+
warnings,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Use Hippox (schema relations + fuzzy join inference) to guess a Memorix graph descriptor
|
|
189
|
+
* when Catalox has no authored graph item.
|
|
190
|
+
*/
|
|
191
|
+
export async function guessMemorixGraphDescriptor(options) {
|
|
192
|
+
const discovery = await discoverMemorixEntities(options.retrieval);
|
|
193
|
+
const objectTypes = options.objectTypes?.length
|
|
194
|
+
? options.objectTypes
|
|
195
|
+
: discovery.summaries.map((s) => s.entityName).filter(Boolean);
|
|
196
|
+
if (objectTypes.length < 2)
|
|
197
|
+
return null;
|
|
198
|
+
const focusObjectType = options.focusObjectType
|
|
199
|
+
?? guessFocusObjectType(options.graphId, objectTypes);
|
|
200
|
+
if (!focusObjectType)
|
|
201
|
+
return null;
|
|
202
|
+
const inferred = await inferLinksForObjectTypes({
|
|
203
|
+
retrieval: options.retrieval,
|
|
204
|
+
processEnv: options.processEnv,
|
|
205
|
+
input: {
|
|
206
|
+
objectTypes,
|
|
207
|
+
sampleLimit: options.sampleLimit ?? 200,
|
|
208
|
+
minInclusionRatio: options.minInclusionRatio ?? 0.5,
|
|
209
|
+
candidateConfidenceThreshold: 30,
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
const nodeKinds = {};
|
|
213
|
+
for (const ot of objectTypes) {
|
|
214
|
+
try {
|
|
215
|
+
const entity = await loadMemorixEntityDescriptorByName(options.retrieval, ot);
|
|
216
|
+
const graphKind = entity.graph?.node?.kind;
|
|
217
|
+
if (typeof graphKind === 'string' && graphKind.trim()) {
|
|
218
|
+
nodeKinds[ot] = graphKind;
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const identity = entity.identity;
|
|
222
|
+
if (typeof identity?.conceptIdentifier?.kind === 'string') {
|
|
223
|
+
nodeKinds[ot] = identity.conceptIdentifier.kind;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// ignore missing descriptors
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
const guess = buildGraphDescriptorFromLinks({
|
|
231
|
+
graphId: options.graphId,
|
|
232
|
+
focusObjectType,
|
|
233
|
+
links: inferred.inferredLinks,
|
|
234
|
+
nodeKinds,
|
|
235
|
+
maxDepth: options.maxDepth ?? 2,
|
|
236
|
+
maxLinks: options.maxLinks ?? 12,
|
|
237
|
+
minConfidence: options.minConfidence ?? 0.35,
|
|
238
|
+
});
|
|
239
|
+
for (const w of inferred.warnings) {
|
|
240
|
+
guess.warnings.push(w.message);
|
|
241
|
+
}
|
|
242
|
+
if (!guess.linksUsed.length && !guess.descriptor.includeEdgeTemplates?.length) {
|
|
243
|
+
// Still return a minimal single-node graph so callers can show directory for focus OT.
|
|
244
|
+
guess.descriptor.nodes = [
|
|
245
|
+
{
|
|
246
|
+
objectType: focusObjectType,
|
|
247
|
+
kind: nodeKinds[focusObjectType],
|
|
248
|
+
tier: 'focus',
|
|
249
|
+
},
|
|
250
|
+
];
|
|
251
|
+
guess.descriptor.tiers = [
|
|
252
|
+
{ id: 'focus', label: 'Focus', objectTypes: [focusObjectType] },
|
|
253
|
+
];
|
|
254
|
+
guess.descriptor.directory = {
|
|
255
|
+
defaultObjectTypes: [focusObjectType],
|
|
256
|
+
searchFields: ['title', 'identifierKey'],
|
|
257
|
+
};
|
|
258
|
+
guess.warnings.push('Hippox found no joins; returning focus-only graph guess.');
|
|
259
|
+
}
|
|
260
|
+
return guess;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=graph-inference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-inference.js","sourceRoot":"","sources":["../src/graph-inference.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-routes.d.ts","sourceRoot":"","sources":["../../src/http/register-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,aAAa,EAA2B,MAAM,eAAe,CAAC;AAGvE,MAAM,MAAM,cAAc,GAAG;IAE3B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK,OAAO,CAAC;IACjE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK,OAAO,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAeF,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,sBAAsB,EACjC,OAAO,GAAE,2BAAgC,GACxC,IAAI,
|
|
1
|
+
{"version":3,"file":"register-routes.d.ts","sourceRoot":"","sources":["../../src/http/register-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,aAAa,EAA2B,MAAM,eAAe,CAAC;AAGvE,MAAM,MAAM,cAAc,GAAG;IAE3B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK,OAAO,CAAC;IACjE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK,OAAO,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAeF,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,sBAAsB,EACjC,OAAO,GAAE,2BAAgC,GACxC,IAAI,CA+JN"}
|
|
@@ -81,9 +81,7 @@ export function registerHippoxRoutes(app, retrieval, options = {}) {
|
|
|
81
81
|
const body = (req.body ?? {});
|
|
82
82
|
try {
|
|
83
83
|
const service = await getService();
|
|
84
|
-
|
|
85
|
-
return await service.resolveMixedContextInput(body);
|
|
86
|
-
}
|
|
84
|
+
// Relation-based legacyContextLinks are ignored — Hippox linkIds / links only.
|
|
87
85
|
return await service.resolveContextInput(body);
|
|
88
86
|
}
|
|
89
87
|
catch (err) {
|
|
@@ -103,6 +101,7 @@ export function registerHippoxRoutes(app, retrieval, options = {}) {
|
|
|
103
101
|
targetContentType: input.targetContentType?.trim() || undefined,
|
|
104
102
|
direction: input.direction,
|
|
105
103
|
sampleLimit: input.sampleLimit,
|
|
104
|
+
findMode: input.findMode,
|
|
106
105
|
});
|
|
107
106
|
}
|
|
108
107
|
catch (err) {
|
|
@@ -122,6 +121,7 @@ export function registerHippoxRoutes(app, retrieval, options = {}) {
|
|
|
122
121
|
sampleLimit: parsedSampleLimit !== undefined && Number.isFinite(parsedSampleLimit)
|
|
123
122
|
? parsedSampleLimit
|
|
124
123
|
: undefined,
|
|
124
|
+
findMode: q.findMode === 'identifier' ? 'identifier' : q.findMode === 'field-join' ? 'field-join' : undefined,
|
|
125
125
|
}, reply);
|
|
126
126
|
});
|
|
127
127
|
app.post(`${base}/join-discovery`, async (req, reply) => {
|
|
@@ -133,6 +133,7 @@ export function registerHippoxRoutes(app, retrieval, options = {}) {
|
|
|
133
133
|
targetContentType: body.targetContentType,
|
|
134
134
|
direction: body.direction,
|
|
135
135
|
sampleLimit: body.sampleLimit,
|
|
136
|
+
findMode: body.findMode,
|
|
136
137
|
}, reply);
|
|
137
138
|
});
|
|
138
139
|
app.post(`${base}/infer-links`, async (req, reply) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-routes.js","sourceRoot":"","sources":["../../src/http/register-routes.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"register-routes.js","sourceRoot":"","sources":["../../src/http/register-routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAcvE,SAAS,SAAS,CAAC,KAAmB,EAAE,GAAY,EAAE,cAAc,GAAG,GAAG;IACxE,IAAI,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC1C,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;YACjC,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,cAAc,CAAC;IACrB,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,GAAmB,EACnB,SAAiC,EACjC,UAAuC,EAAE;IAEzC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAClE,IAAI,cAAc,GAAkC,OAAO,CAAC,OAAO;QACjE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QAClC,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,UAAU,GAAG,KAAK,IAA4B,EAAE;QACpD,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC;QAC5C,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC,CAAC;IAEF,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,QAAQ,EAAE,KAAK,EAAE,GAAmB,EAAE,KAAmB,EAAE,EAAE;QAC1E,MAAM,CAAC,GAAG,GAAG,CAAC,KAAsC,CAAC;QACrD,IAAI,CAAC,CAAC,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;YACnC,OAAO,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,QAAQ,EAAE,KAAK,EAAE,GAAmB,EAAE,KAAmB,EAAE,EAAE;QAC3E,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAqB,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;YACnC,OAAO,MAAM,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,iBAAiB,EAAE,KAAK,EAAE,GAAmB,EAAE,KAAmB,EAAE,EAAE;QACpF,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAqB,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;YACnC,OAAO,MAAM,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,qBAAqB,EAAE,KAAK,EAAE,GAAmB,EAAE,KAAmB,EAAE,EAAE;QACxF,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;YACnC,OAAO,MAAM,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,oBAAoB,EAAE,KAAK,EAAE,GAAmB,EAAE,KAAmB,EAAE,EAAE;QACvF,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;YACnC,OAAO,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,kBAAkB,EAAE,KAAK,EAAE,GAAmB,EAAE,KAAmB,EAAE,EAAE;QACrF,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAwB,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;YACnC,+EAA+E;YAC/E,OAAO,MAAM,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,mBAAmB,GAAG,KAAK,EAC/B,KAAsG,EACtG,KAAmB,EACnB,EAAE;QACF,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAE,CAAC;YACvE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;YACnC,OAAO,MAAM,OAAO,CAAC,sBAAsB,CAAC;gBAC1C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE;gBAC/C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE;gBAC/C,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,SAAS;gBAC/D,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,SAAS;gBAC/D,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IAEF,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,iBAAiB,EAAE,KAAK,EAAE,GAAmB,EAAE,KAAmB,EAAE,EAAE;QACnF,MAAM,CAAC,GAAG,GAAG,CAAC,KAA2C,CAAC;QAC1D,MAAM,cAAc,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;QAC7C,MAAM,iBAAiB,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9E,OAAO,mBAAmB,CACxB;YACE,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,IAAI,EAAE;YAC1C,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,IAAI,EAAE;YAC1C,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;YACtC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;YACtC,SAAS,EAAE,CAAC,CAAC,SAA4C;YACzD,WAAW,EAAE,iBAAiB,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBAChF,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,SAAS;YACb,QAAQ,EAAE,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;SAC9G,EACD,KAAK,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,iBAAiB,EAAE,KAAK,EAAE,GAAmB,EAAE,KAAmB,EAAE,EAAE;QACpF,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAgC,CAAC;QAC7D,OAAO,mBAAmB,CACxB;YACE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE;YAC7C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE;YAC7C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,EACD,KAAK,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,cAAc,EAAE,KAAK,EAAE,GAAmB,EAAE,KAAmB,EAAE,EAAE;QACjF,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAoB,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;YACnC,OAAO,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,gCAAgC,EAAE,KAAK,EAAE,GAAmB,EAAE,KAAmB,EAAE,EAAE;QACnG,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAiC,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;YACnC,OAAO,MAAM,OAAO,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { IdentifierDiscoveryField, IdentifierRecommendedMatch, InferredFieldType, JoinDiscoveryWarning } from './types.js';
|
|
2
|
+
type IdentityFieldInventory = {
|
|
3
|
+
path: string;
|
|
4
|
+
inferredType: InferredFieldType;
|
|
5
|
+
coverage: number;
|
|
6
|
+
distinctValueCount: number;
|
|
7
|
+
uniqueness: number;
|
|
8
|
+
distinctValues: Set<string>;
|
|
9
|
+
};
|
|
10
|
+
export declare function collectIdentityAndRootKeyPaths(docs: Record<string, unknown>[], dataRoot: string, minCoverage: number): IdentityFieldInventory[];
|
|
11
|
+
export declare function buildIdentifierDiscovery(params: {
|
|
12
|
+
sourceObjectType: string;
|
|
13
|
+
targetObjectType: string;
|
|
14
|
+
sourceDocs: Record<string, unknown>[];
|
|
15
|
+
targetDocs: Record<string, unknown>[];
|
|
16
|
+
sourceDataRoot: string;
|
|
17
|
+
targetDataRoot: string;
|
|
18
|
+
minCoverage: number;
|
|
19
|
+
dataJoinOutFields: Array<{
|
|
20
|
+
path: string;
|
|
21
|
+
inferredType: InferredFieldType;
|
|
22
|
+
coverage: number;
|
|
23
|
+
distinctValueCount: number;
|
|
24
|
+
uniqueness: number;
|
|
25
|
+
distinctValues: Set<string>;
|
|
26
|
+
}>;
|
|
27
|
+
}): {
|
|
28
|
+
sourceValuePaths: IdentifierDiscoveryField[];
|
|
29
|
+
targetIdentityCandidates: IdentifierDiscoveryField[];
|
|
30
|
+
recommendedMatch: IdentifierRecommendedMatch | null;
|
|
31
|
+
warnings: JoinDiscoveryWarning[];
|
|
32
|
+
};
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=identifier-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifier-discovery.d.ts","sourceRoot":"","sources":["../src/identifier-discovery.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,KAAK,sBAAsB,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,iBAAiB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7B,CAAC;AAiEF,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,sBAAsB,EAAE,CAgG1B;AAqBD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC/C,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,KAAK,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,iBAAiB,CAAC;QAChC,QAAQ,EAAE,MAAM,CAAC;QACjB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;KAC7B,CAAC,CAAC;CACJ,GAAG;IACF,gBAAgB,EAAE,wBAAwB,EAAE,CAAC;IAC7C,wBAAwB,EAAE,wBAAwB,EAAE,CAAC;IACrD,gBAAgB,EAAE,0BAA0B,GAAG,IAAI,CAAC;IACpD,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAClC,CA0DA"}
|