@memberjunction/content-autotagging 5.51.0 → 6.1.0-edge.1

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.
@@ -0,0 +1,212 @@
1
+ import { BaseEngineRegistry, LogError } from '@memberjunction/core';
2
+ import { NormalizeUUID, UUIDsEqual } from '@memberjunction/global';
3
+ /**
4
+ * Resolves per-record values for field paths rooted at a batch of records — the generic
5
+ * machinery behind provider-declared source-record dependencies (see
6
+ * `VectorDBBase.GetSourceRecordFieldPaths`), usable for any config that needs a value living
7
+ * on a related record.
8
+ *
9
+ * Two path forms are supported:
10
+ * - **Plain field** (`"OrganizationID"`): the value is read directly off the record's own
11
+ * field set.
12
+ * - **Single-hop path** (`"ContentSourceID.OrganizationID"`): the first segment names a
13
+ * foreign-key field on the root entity; the second names a field on the related entity. The
14
+ * related record is loaded and — when the related entity is an IS-A parent type — its
15
+ * child-type rows (shared primary key) are loaded and merged over it, so a field that
16
+ * physically lives on an IS-A extension entity (e.g. `myschema.ContentSource.OrganizationID`)
17
+ * resolves without the configuration ever naming the child entity.
18
+ *
19
+ * Only single-valued FK hops are traversed (never 1:N relationships) and path depth is capped
20
+ * at one hop, which keeps resolution O(distinct FK values) per pass. Deeper paths are a
21
+ * configuration error: they log and resolve nothing, which callers treat per their own policy.
22
+ *
23
+ * Resolution is lazy and batched: callers create one resolver per pass and call
24
+ * {@link ResolveForItems} per record batch. Distinct FK values are loaded with a single
25
+ * `IN (...)` query per entity (base + each IS-A child) and cached for the resolver's lifetime,
26
+ * so a related record referenced by ten thousand rows is loaded once per pass.
27
+ */
28
+ export class FieldPathResolver {
29
+ constructor(provider, contextUser,
30
+ /** Entity whose records the paths are rooted at (e.g. 'MJ: Content Items'). */
31
+ rootEntityName) {
32
+ this.provider = provider;
33
+ this.contextUser = contextUser;
34
+ this.rootEntityName = rootEntityName;
35
+ /** Merged related-record cache for this pass, keyed by normalized FK value. `null` = load attempted and failed/missing. */
36
+ this.recordCache = new Map();
37
+ }
38
+ /**
39
+ * Resolve the path value for each record. Accepts any BaseEntity batch whose entity matches
40
+ * the resolver's root entity. Returns a map keyed by the record's normalized primary-key
41
+ * value; a missing/null entry means the value could not be resolved for that record —
42
+ * callers decide what that means (one unresolvable record never poisons the rest).
43
+ */
44
+ async ResolveForItems(items, fieldPath) {
45
+ const result = new Map();
46
+ if (items.length === 0)
47
+ return result;
48
+ const segments = fieldPath.split('.').map(s => s.trim());
49
+ if (segments.length === 1 && segments[0].length > 0) {
50
+ for (const item of items) {
51
+ const all = item.GetAll();
52
+ result.set(this.recordKey(item), this.readField(all, segments[0]));
53
+ }
54
+ return result;
55
+ }
56
+ if (segments.length !== 2 || segments.some(s => s.length === 0)) {
57
+ LogError(`FieldPathResolver: unsupported field path "${fieldPath}" — only a plain field name or a single-hop "<FKField>.<Field>" path is supported`);
58
+ return result;
59
+ }
60
+ const [fkFieldName, targetFieldName] = segments;
61
+ const targetEntity = this.resolveTargetEntity(fkFieldName, fieldPath);
62
+ if (!targetEntity)
63
+ return result;
64
+ // Batch-load the distinct related records this batch actually references (cache-aware).
65
+ const fkValueByItem = new Map();
66
+ for (const item of items) {
67
+ const all = item.GetAll();
68
+ const fkValue = this.readField(all, fkFieldName);
69
+ if (fkValue != null && String(fkValue).trim().length > 0) {
70
+ fkValueByItem.set(this.recordKey(item), String(fkValue));
71
+ }
72
+ }
73
+ await this.loadRelatedRecords(targetEntity, [...new Set(fkValueByItem.values())]);
74
+ for (const item of items) {
75
+ const fkValue = fkValueByItem.get(this.recordKey(item));
76
+ const related = fkValue ? this.recordCache.get(this.cacheKey(fkValue)) : undefined;
77
+ result.set(this.recordKey(item), related ? this.readField(related, targetFieldName) : undefined);
78
+ }
79
+ return result;
80
+ }
81
+ /** The result-map key for a root record: its (first) primary-key value, normalized. */
82
+ recordKey(item) {
83
+ return NormalizeUUID(String(item.FirstPrimaryKey.Value));
84
+ }
85
+ /**
86
+ * Validate the FK segment against the root entity's metadata and resolve the entity it points
87
+ * at. Logs and returns null on any misconfiguration (unknown field, not a foreign key, target
88
+ * entity missing) so callers see the paths as unresolvable.
89
+ */
90
+ resolveTargetEntity(fkFieldName, fieldPath) {
91
+ const rootEntity = this.provider.EntityByName(this.rootEntityName);
92
+ if (!rootEntity) {
93
+ LogError(`FieldPathResolver: root entity "${this.rootEntityName}" not found in metadata`);
94
+ return null;
95
+ }
96
+ const fkField = rootEntity.Fields.find(f => f.Name.trim().toLowerCase() === fkFieldName.toLowerCase());
97
+ if (!fkField) {
98
+ LogError(`FieldPathResolver: field path "${fieldPath}" — field "${fkFieldName}" does not exist on "${this.rootEntityName}"`);
99
+ return null;
100
+ }
101
+ if (!fkField.RelatedEntityID) {
102
+ LogError(`FieldPathResolver: field path "${fieldPath}" — field "${fkFieldName}" is not a foreign key, cannot traverse`);
103
+ return null;
104
+ }
105
+ const target = this.provider.Entities.find(e => UUIDsEqual(e.ID, fkField.RelatedEntityID));
106
+ if (!target) {
107
+ LogError(`FieldPathResolver: related entity ${fkField.RelatedEntityID} for "${fkFieldName}" not found in metadata`);
108
+ return null;
109
+ }
110
+ return target;
111
+ }
112
+ /**
113
+ * Load the given related records into the cache: one `IN (...)` query against the target
114
+ * entity, plus one per IS-A child entity (shared PK), merging child fields over the parent's
115
+ * so IS-A extension fields resolve transparently. Values already cached are skipped. A failed
116
+ * load caches `null` for the affected keys so items referencing them resolve to undefined
117
+ * rather than retrying within the pass.
118
+ */
119
+ async loadRelatedRecords(targetEntity, fkValues) {
120
+ const toLoad = fkValues.filter(v => !this.recordCache.has(this.cacheKey(v)));
121
+ if (toLoad.length === 0)
122
+ return;
123
+ const baseRows = await this.loadRowsByPK(targetEntity, toLoad);
124
+ if (baseRows === null) {
125
+ for (const v of toLoad)
126
+ this.recordCache.set(this.cacheKey(v), null);
127
+ return;
128
+ }
129
+ const merged = new Map();
130
+ const pkName = targetEntity.FirstPrimaryKey.Name;
131
+ for (const row of baseRows) {
132
+ const pk = this.readField(row, pkName);
133
+ if (pk != null)
134
+ merged.set(this.cacheKey(String(pk)), { ...row });
135
+ }
136
+ // IS-A downcast: merge each child-type row (shared PK) over its parent record. Children
137
+ // are merged in metadata order; with disjoint subtypes at most one child row exists per
138
+ // record, so ordering only matters for (rare) overlapping-subtype field collisions.
139
+ for (const child of targetEntity.ChildEntities) {
140
+ const childRows = await this.loadRowsByPK(child, toLoad);
141
+ if (childRows === null)
142
+ continue; // child load failure degrades to parent fields only
143
+ const childPKName = child.FirstPrimaryKey.Name;
144
+ for (const row of childRows) {
145
+ const pk = this.readField(row, childPKName);
146
+ if (pk == null)
147
+ continue;
148
+ const existing = merged.get(this.cacheKey(String(pk)));
149
+ if (existing)
150
+ Object.assign(existing, row);
151
+ }
152
+ }
153
+ for (const v of toLoad) {
154
+ this.recordCache.set(this.cacheKey(v), merged.get(this.cacheKey(v)) ?? null);
155
+ }
156
+ }
157
+ /**
158
+ * Load rows for a set of PK values. Per MJ convention, a loaded engine's full-set cache is
159
+ * consulted first (BaseEngineRegistry) — e.g. ContentSources are already cached by
160
+ * KnowledgeHubMetadataEngine, so the common hop resolves with zero queries. Falls back to one
161
+ * `PK IN (...)` RunView. Returns null (not []) on query failure.
162
+ */
163
+ async loadRowsByPK(entity, pkValues) {
164
+ if (pkValues.length === 0)
165
+ return [];
166
+ const cached = this.readRowsFromRegistryCache(entity, pkValues);
167
+ if (cached !== null)
168
+ return cached;
169
+ const pkName = entity.FirstPrimaryKey.Name;
170
+ const idList = pkValues.map(v => `'${v.replace(/'/g, "''")}'`).join(',');
171
+ const rv = this.provider;
172
+ const result = await rv.RunView({
173
+ EntityName: entity.Name,
174
+ ExtraFilter: `${pkName} IN (${idList})`,
175
+ ResultType: 'simple'
176
+ }, this.contextUser);
177
+ if (!result.Success) {
178
+ LogError(`FieldPathResolver: failed to load "${entity.Name}" records for path resolution: ${result.ErrorMessage}`);
179
+ return null;
180
+ }
181
+ return result.Results;
182
+ }
183
+ /**
184
+ * Serve the requested rows from an already-loaded engine's full-set cache when one exists
185
+ * (read-only — the donor's live array is never mutated). Returns null when no engine caches
186
+ * the entity or the cached rows aren't entity objects, so the caller queries instead.
187
+ */
188
+ readRowsFromRegistryCache(entity, pkValues) {
189
+ const rows = BaseEngineRegistry.Instance.TryGetCachedRecords(entity.Name, { unfilteredOnly: true });
190
+ if (!rows)
191
+ return null;
192
+ if (rows.length > 0 && typeof rows[0].GetAll !== 'function')
193
+ return null;
194
+ const wanted = new Set(pkValues.map(v => this.cacheKey(v)));
195
+ return rows
196
+ .filter(r => wanted.has(this.cacheKey(String(r.FirstPrimaryKey.Value))))
197
+ .map(r => r.GetAll());
198
+ }
199
+ /** Read a field from a plain record: exact name first, then case-insensitive fallback. */
200
+ readField(record, fieldName) {
201
+ if (fieldName in record)
202
+ return record[fieldName];
203
+ const lower = fieldName.toLowerCase();
204
+ const key = Object.keys(record).find(k => k.toLowerCase() === lower);
205
+ return key !== undefined ? record[key] : undefined;
206
+ }
207
+ /** Normalized cache key for an FK value (UUIDs compare case-insensitively in MJ). */
208
+ cacheKey(value) {
209
+ return NormalizeUUID(value.trim());
210
+ }
211
+ }
212
+ //# sourceMappingURL=FieldPathResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldPathResolver.js","sourceRoot":"","sources":["../../../src/Engine/generic/FieldPathResolver.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export * from './generic/AutotagBaseEngine.js';
2
2
  export * from './generic/ClassificationContextResolver.js';
3
+ export * from './generic/FieldPathResolver.js';
3
4
  export * from './generic/RateLimiter.js';
4
5
  export * from './generic/content.types.js';
5
6
  export * from './generic/process.types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Engine/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yCAAyC,CAAA;AACvD,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Engine/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yCAAyC,CAAA;AACvD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export * from './generic/AutotagBaseEngine.js';
2
2
  export * from './generic/ClassificationContextResolver.js';
3
+ export * from './generic/FieldPathResolver.js';
3
4
  export * from './generic/RateLimiter.js';
4
5
  export * from './generic/content.types.js';
5
6
  export * from './generic/process.types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Engine/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yCAAyC,CAAA;AACvD,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Engine/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yCAAyC,CAAA;AACvD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC"}
package/package.json CHANGED
@@ -1,39 +1,33 @@
1
1
  {
2
2
  "name": "@memberjunction/content-autotagging",
3
3
  "type": "module",
4
- "version": "5.51.0",
4
+ "version": "6.1.0-edge.1",
5
5
  "description": "MemberJunction Content Autotagging Application",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "files": [
9
9
  "/dist"
10
10
  ],
11
- "scripts": {
12
- "start": "ts-node src/index.ts",
13
- "build": "tsc --build && tsc-alias -f",
14
- "test": "vitest run",
15
- "test:watch": "vitest"
16
- },
17
11
  "author": "MemberJunction.com",
18
12
  "license": "ISC",
19
13
  "dependencies": {
20
14
  "@azure/storage-blob": "^12.30.0",
21
- "@memberjunction/ai": "5.51.0",
22
- "@memberjunction/ai-core-plus": "5.51.0",
23
- "@memberjunction/ai-prompts": "5.51.0",
24
- "@memberjunction/ai-provider-bundle": "5.51.0",
25
- "@memberjunction/ai-segmentation": "5.51.0",
26
- "@memberjunction/ai-vector-sync": "5.51.0",
27
- "@memberjunction/ai-vectordb": "5.51.0",
28
- "@memberjunction/ai-vectors": "5.51.0",
29
- "@memberjunction/aiengine": "5.51.0",
30
- "@memberjunction/core": "5.51.0",
31
- "@memberjunction/core-entities": "5.51.0",
32
- "@memberjunction/global": "5.51.0",
33
- "@memberjunction/storage": "5.51.0",
34
- "@memberjunction/tag-engine": "5.51.0",
35
- "@memberjunction/tag-engine-base": "5.51.0",
36
- "@memberjunction/templates": "5.51.0",
15
+ "@memberjunction/ai": "6.1.0-edge.1",
16
+ "@memberjunction/ai-core-plus": "6.1.0-edge.1",
17
+ "@memberjunction/ai-prompts": "6.1.0-edge.1",
18
+ "@memberjunction/ai-provider-bundle": "6.1.0-edge.1",
19
+ "@memberjunction/ai-segmentation": "6.1.0-edge.1",
20
+ "@memberjunction/ai-vector-sync": "6.1.0-edge.1",
21
+ "@memberjunction/ai-vectordb": "6.1.0-edge.1",
22
+ "@memberjunction/ai-vectors": "6.1.0-edge.1",
23
+ "@memberjunction/aiengine": "6.1.0-edge.1",
24
+ "@memberjunction/core": "6.1.0-edge.1",
25
+ "@memberjunction/core-entities": "6.1.0-edge.1",
26
+ "@memberjunction/global": "6.1.0-edge.1",
27
+ "@memberjunction/storage": "6.1.0-edge.1",
28
+ "@memberjunction/tag-engine": "6.1.0-edge.1",
29
+ "@memberjunction/tag-engine-base": "6.1.0-edge.1",
30
+ "@memberjunction/templates": "6.1.0-edge.1",
37
31
  "axios": "^1.13.4",
38
32
  "cheerio": "^1.2.0",
39
33
  "date-fns": "^3.6.0",
@@ -60,5 +54,11 @@
60
54
  "repository": {
61
55
  "type": "git",
62
56
  "url": "https://github.com/MemberJunction/MJ"
57
+ },
58
+ "scripts": {
59
+ "start": "ts-node src/index.ts",
60
+ "build": "tsc --build && tsc-alias -f",
61
+ "test": "vitest run",
62
+ "test:watch": "vitest"
63
63
  }
64
- }
64
+ }