@x12i/memorix-hippox 1.0.1 → 1.2.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 (52) hide show
  1. package/README.md +112 -13
  2. package/dist/collection-resolver.d.ts.map +1 -1
  3. package/dist/collection-resolver.js +8 -1
  4. package/dist/collection-resolver.js.map +1 -1
  5. package/dist/config.d.ts +11 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +29 -1
  8. package/dist/config.js.map +1 -1
  9. package/dist/helpers-loader.d.ts +31 -0
  10. package/dist/helpers-loader.d.ts.map +1 -0
  11. package/dist/helpers-loader.js +20 -0
  12. package/dist/helpers-loader.js.map +1 -0
  13. package/dist/http/register-routes.d.ts.map +1 -1
  14. package/dist/http/register-routes.js +73 -1
  15. package/dist/http/register-routes.js.map +1 -1
  16. package/dist/index.d.ts +7 -3
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +6 -2
  19. package/dist/index.js.map +1 -1
  20. package/dist/infer-links.d.ts +9 -0
  21. package/dist/infer-links.d.ts.map +1 -0
  22. package/dist/infer-links.js +171 -0
  23. package/dist/infer-links.js.map +1 -0
  24. package/dist/join-discovery.d.ts +34 -0
  25. package/dist/join-discovery.d.ts.map +1 -0
  26. package/dist/join-discovery.js +697 -0
  27. package/dist/join-discovery.js.map +1 -0
  28. package/dist/legacy-bridge.d.ts.map +1 -1
  29. package/dist/legacy-bridge.js +3 -4
  30. package/dist/legacy-bridge.js.map +1 -1
  31. package/dist/paths.d.ts +1 -0
  32. package/dist/paths.d.ts.map +1 -1
  33. package/dist/paths.js +17 -0
  34. package/dist/paths.js.map +1 -1
  35. package/dist/record-flatten.d.ts +12 -0
  36. package/dist/record-flatten.d.ts.map +1 -0
  37. package/dist/record-flatten.js +49 -0
  38. package/dist/record-flatten.js.map +1 -0
  39. package/dist/resolve.d.ts.map +1 -1
  40. package/dist/resolve.js +6 -5
  41. package/dist/resolve.js.map +1 -1
  42. package/dist/service.d.ts +4 -1
  43. package/dist/service.d.ts.map +1 -1
  44. package/dist/service.js +33 -0
  45. package/dist/service.js.map +1 -1
  46. package/dist/store.d.ts +4 -0
  47. package/dist/store.d.ts.map +1 -1
  48. package/dist/store.js +16 -0
  49. package/dist/store.js.map +1 -1
  50. package/dist/types.d.ts +121 -0
  51. package/dist/types.d.ts.map +1 -1
  52. package/package.json +6 -1
@@ -0,0 +1,171 @@
1
+ import { resolveDefaultListDescriptorForEntity } from '@x12i/memorix-retrieval';
2
+ import { loadHippoxConfig } from './config.js';
3
+ import { readObjectTypeDocuments, resolveObjectTypeCollection, } from './collection-resolver.js';
4
+ import { loadRecordKeyAnalysis } from './helpers-loader.js';
5
+ import { flattenSampleForKeyAnalysis, memorixPathForLeaf } from './record-flatten.js';
6
+ const DEFAULT_DATA_ROOT = 'data';
7
+ export async function inferLinksForObjectTypes(options) {
8
+ const config = loadHippoxConfig(options.processEnv);
9
+ const objectTypes = [...new Set((options.input.objectTypes ?? []).map((t) => t.trim()).filter(Boolean))];
10
+ if (objectTypes.length < 2) {
11
+ throw new Error('objectTypes must include at least two distinct object types');
12
+ }
13
+ const sampleLimit = Math.min(options.input.sampleLimit ?? config.inferSampleLimit, config.inferSampleLimit);
14
+ const candidateThreshold = options.input.candidateConfidenceThreshold ?? config.inferCandidateConfidence;
15
+ const minInclusionRatio = options.input.minInclusionRatio ?? config.inferMinInclusionRatio;
16
+ const helpers = loadRecordKeyAnalysis();
17
+ const warnings = [];
18
+ const collectionProfiles = [];
19
+ const samplesByType = new Map();
20
+ const targetCollectionsMap = {};
21
+ for (const objectType of objectTypes) {
22
+ try {
23
+ await resolveDefaultListDescriptorForEntity(options.retrieval, objectType);
24
+ }
25
+ catch {
26
+ throw new Error(`Object type not found: ${objectType}`);
27
+ }
28
+ const binding = await resolveObjectTypeCollection(options.retrieval, objectType, options.input.contentType);
29
+ const dataRoot = await resolveDataRoot(options.retrieval, objectType, binding.contentType);
30
+ const docs = await readObjectTypeDocuments(options.retrieval, binding, {
31
+ limit: sampleLimit,
32
+ });
33
+ if (docs.length === 0) {
34
+ warnings.push({
35
+ code: 'empty_collection',
36
+ message: `No sample records for object type "${objectType}".`,
37
+ });
38
+ continue;
39
+ }
40
+ const flatSample = flattenSampleForKeyAnalysis(docs, dataRoot);
41
+ const { records: helperRecords, pathByLeaf } = flatSample;
42
+ samplesByType.set(objectType, helperRecords);
43
+ const first = helperRecords[0];
44
+ if (!first || Object.keys(first).length === 0) {
45
+ warnings.push({
46
+ code: 'no_scalar_fields',
47
+ message: `No scalar join fields discovered in sample for "${objectType}".`,
48
+ });
49
+ continue;
50
+ }
51
+ const candidates = helpers
52
+ .analyzeSingleRecordKeys(first)
53
+ .filter((c) => c.confidence >= candidateThreshold)
54
+ .map((c) => c.property);
55
+ if (candidates.length === 0) {
56
+ warnings.push({
57
+ code: 'no_key_candidates',
58
+ message: `No property candidates above confidence ${candidateThreshold} for "${objectType}".`,
59
+ });
60
+ continue;
61
+ }
62
+ const classified = helpers.analyzeCollectionKeys(helperRecords, candidates);
63
+ const primaryKeys = classified
64
+ .filter((row) => row.classification === 'PRIMARY')
65
+ .map((row) => memorixPathForLeaf(pathByLeaf, row.property));
66
+ const foreignKeys = classified
67
+ .filter((row) => row.classification === 'FOREIGN' || row.classification === 'FOREIGN_OR_DIRTY_PRIMARY')
68
+ .map((row) => ({
69
+ leaf: row.property,
70
+ path: memorixPathForLeaf(pathByLeaf, row.property),
71
+ }));
72
+ if (primaryKeys.length === 0) {
73
+ const idLike = classified
74
+ .filter((row) => row.property.endsWith('Id') || row.property === 'id')
75
+ .sort((a, b) => b.uniquenessRatio - a.uniquenessRatio)
76
+ .slice(0, 3)
77
+ .map((row) => memorixPathForLeaf(pathByLeaf, row.property));
78
+ primaryKeys.push(...idLike);
79
+ }
80
+ collectionProfiles.push({
81
+ objectType,
82
+ contentType: binding.contentType,
83
+ sampleCount: helperRecords.length,
84
+ primaryKeys,
85
+ foreignKeys: foreignKeys.map((row) => row.path),
86
+ properties: classified.map((row) => ({
87
+ property: memorixPathForLeaf(pathByLeaf, row.property),
88
+ classification: row.classification,
89
+ uniqueCount: row.uniqueCount,
90
+ uniquenessRatio: row.uniquenessRatio,
91
+ confidence: row.confidence,
92
+ })),
93
+ });
94
+ targetCollectionsMap[objectType] = {
95
+ primaryKeys: primaryKeys.map((path) => {
96
+ for (const [leaf, full] of pathByLeaf.entries()) {
97
+ if (full === path)
98
+ return leaf;
99
+ }
100
+ return path.split('.').pop() ?? path;
101
+ }),
102
+ records: helperRecords,
103
+ };
104
+ }
105
+ const inferredLinks = [];
106
+ let rank = 0;
107
+ for (const profile of collectionProfiles) {
108
+ const sourceSample = samplesByType.get(profile.objectType);
109
+ if (!sourceSample?.length)
110
+ continue;
111
+ for (const foreignKey of profile.foreignKeys) {
112
+ const foreignLeaf = foreignKey.split('.').pop() ?? foreignKey;
113
+ const others = { ...targetCollectionsMap };
114
+ delete others[profile.objectType];
115
+ const edges = helpers.mapCrossCollectionRelationships(sourceSample, foreignLeaf, others, { minInclusionRatio });
116
+ for (const edge of edges) {
117
+ rank += 1;
118
+ const targetProfile = collectionProfiles.find((p) => p.objectType === edge.targetCollection);
119
+ const resolvedTargetPath = targetProfile?.primaryKeys.find((p) => p.endsWith(`.${edge.targetProperty}`) || p === edge.targetProperty)
120
+ ?? targetProfile?.primaryKeys[0]
121
+ ?? `data.${edge.targetProperty}`;
122
+ inferredLinks.push({
123
+ rank,
124
+ sourceObjectType: profile.objectType,
125
+ targetObjectType: edge.targetCollection,
126
+ sourcePath: foreignKey,
127
+ targetPath: resolvedTargetPath,
128
+ operator: 'eq',
129
+ inclusionRatio: edge.inclusionRatio,
130
+ confidence: edge.confidence / 100,
131
+ summary: `${Math.round(edge.inclusionRatio * 100)}% of source values match target `
132
+ + `${edge.targetProperty} on ${edge.targetCollection}.`,
133
+ });
134
+ }
135
+ }
136
+ }
137
+ inferredLinks.sort((a, b) => b.confidence - a.confidence || a.sourceObjectType.localeCompare(b.sourceObjectType));
138
+ inferredLinks.forEach((link, index) => {
139
+ link.rank = index + 1;
140
+ });
141
+ if (inferredLinks.length === 0) {
142
+ warnings.push({
143
+ code: 'no_inferred_links',
144
+ message: `No cross-collection links met inclusion ratio ${minInclusionRatio}.`,
145
+ });
146
+ }
147
+ return {
148
+ mode: 'fuzzy-mapping',
149
+ sampleLimit,
150
+ candidateConfidenceThreshold: candidateThreshold,
151
+ minInclusionRatio,
152
+ collectionProfiles,
153
+ inferredLinks,
154
+ warnings,
155
+ };
156
+ }
157
+ async function resolveDataRoot(retrieval, objectType, contentTypeKey) {
158
+ try {
159
+ const { entity } = await resolveDefaultListDescriptorForEntity(retrieval, objectType);
160
+ const ct = entity.contentTypes?.[contentTypeKey];
161
+ if (ct && typeof ct.dataRoot === 'string')
162
+ return ct.dataRoot;
163
+ if (entity.defaults?.dataRoot)
164
+ return entity.defaults.dataRoot;
165
+ }
166
+ catch {
167
+ // fall through
168
+ }
169
+ return DEFAULT_DATA_ROOT;
170
+ }
171
+ //# sourceMappingURL=infer-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer-links.js","sourceRoot":"","sources":["../src/infer-links.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { MemorixRetrievalClient } from '@x12i/memorix-retrieval';
2
+ import type { HippoxStore } from './store.js';
3
+ import type { InferredFieldType, JoinDiscoveryInput, JoinDiscoveryResult } from './types.js';
4
+ export type DiscoverJoinCandidatesOptions = {
5
+ retrieval: MemorixRetrievalClient;
6
+ store?: HippoxStore;
7
+ input: JoinDiscoveryInput;
8
+ processEnv?: NodeJS.ProcessEnv;
9
+ };
10
+ type PairProbe = {
11
+ sourcePath: string;
12
+ targetPath: string;
13
+ valueHitRate: number;
14
+ sourceCoverage: number;
15
+ targetCoverage: number;
16
+ targetUniqueness: number;
17
+ nameSimilarity: number;
18
+ schemaRelationBoost: number;
19
+ approvedLinkBoost: number;
20
+ sourceType: InferredFieldType;
21
+ targetType: InferredFieldType;
22
+ };
23
+ export declare function clearJoinDiscoveryCache(): void;
24
+ export declare function discoverJoinCandidates(options: DiscoverJoinCandidatesOptions): Promise<JoinDiscoveryResult>;
25
+ export declare function isScalarJoinable(value: unknown): boolean;
26
+ export declare function normalizeScalarValue(value: unknown): string | null;
27
+ export declare function classifyValue(value: unknown): InferredFieldType;
28
+ export declare function computeValueHitRate(sourceValues: string[], targetValues: Set<string>): number;
29
+ export declare function computeNameSimilarity(sourcePath: string, targetPath: string, targetObjectType: string): number;
30
+ export declare function sourceNameHintScore(path: string, targetObjectType: string): number;
31
+ export declare function targetNameHintScore(path: string, sourceObjectType: string): number;
32
+ export declare function computePairScore(probe: PairProbe): number;
33
+ export {};
34
+ //# sourceMappingURL=join-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-discovery.d.ts","sourceRoot":"","sources":["../src/join-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAUtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EACV,iBAAiB,EAGjB,kBAAkB,EAClB,mBAAmB,EAIpB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,6BAA6B,GAAG;IAC1C,SAAS,EAAE,sBAAsB,CAAC;IAClC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAChC,CAAC;AAyBF,KAAK,SAAS,GAAG;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,UAAU,EAAE,iBAAiB,CAAC;CAC/B,CAAC;AAaF,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,mBAAmB,CAAC,CA0K9B;AAkLD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKxD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CASlE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAS/D;AAqKD,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAO7F;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAeR;AAYD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAUlF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAQlF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAiBzD"}