@memberjunction/ai-vector-dupe 5.22.0 → 5.24.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 CHANGED
@@ -142,17 +142,21 @@ Options are passed via the `Options` property on `PotentialDuplicateRequest`, or
142
142
  | `DuplicateRunID` | `string` | -- | Resume an existing duplicate run (batch mode only) |
143
143
  | `KeywordSearchWeight` | `number` | `0.3` | Weight for keyword search in hybrid mode (0.0 = vector only, 1.0 = keyword only). Vector weight is `1.0 - KeywordSearchWeight`. |
144
144
  | `FusionMethod` | `string` | `'rrf'` | Fusion method for hybrid search. Currently supports `'rrf'` (Reciprocal Rank Fusion). |
145
+ | `PotentialMatchThreshold` | `number` | -- | Override the EntityDocument's PotentialMatchThreshold for this run |
146
+ | `AbsoluteMatchThreshold` | `number` | -- | Override the EntityDocument's AbsoluteMatchThreshold for this run |
145
147
  | `OnProgress` | `(progress: DuplicateDetectionProgress) => void` | -- | Callback for real-time progress reporting |
146
148
 
147
- ### Thresholds (Configured on Entity Document)
149
+ ### Thresholds
148
150
 
149
- Thresholds are not part of `DuplicateDetectionOptions` -- they are configured on the `EntityDocument` record itself:
151
+ Thresholds can be configured at two levels -- on the `EntityDocument` record (default) or overridden per-run via `DuplicateDetectionOptions`. When threshold overrides are provided in the options, they take precedence over the EntityDocument values.
150
152
 
151
153
  | Threshold | Purpose |
152
154
  |---|---|
153
155
  | `PotentialMatchThreshold` | Minimum similarity score to report a candidate as a potential duplicate |
154
156
  | `AbsoluteMatchThreshold` | Minimum similarity score to trigger automatic record merge |
155
157
 
158
+ A server hook normalizes `1.0` thresholds to sensible defaults (`0.70` for potential, `0.95` for absolute) to prevent degenerate behavior when thresholds are left at the maximum.
159
+
156
160
  ---
157
161
 
158
162
  ## Hybrid Search and Reciprocal Rank Fusion (RRF)
@@ -290,6 +294,15 @@ interface ScoredCandidate {
290
294
 
291
295
  ---
292
296
 
297
+ ## Inverse Match Deduplication
298
+
299
+ The detector maintains a `_seenPairs` set across the entire run to suppress inverse duplicates. If record A is identified as a duplicate of record B (A->B), the reverse match (B->A) is automatically suppressed. Pair keys use canonical ordering (`smallerID::largerID`) for consistent deduplication regardless of query direction.
300
+
301
+ ## RecordID Format and Metadata
302
+
303
+ - **RecordID and MatchRecordID** are stored in MJ URL segment format (e.g., `ID|uuid`), making them compatible with `CompositeKey` for entities with composite primary keys.
304
+ - **RecordMetadata** is stored on both `DuplicateRunDetail` and `DuplicateRunDetailMatch` entities, capturing the vector database metadata snapshot at detection time. This preserves the context used for matching even if the source record changes later.
305
+
293
306
  ## Database Entities
294
307
 
295
308
  The package reads from and writes to these MJ entities:
@@ -299,8 +312,8 @@ The package reads from and writes to these MJ entities:
299
312
  | `MJ: Entity Documents` | Configuration: template, AI model, vector DB, thresholds |
300
313
  | `MJ: Lists` / `MJ: List Details` | Source records to check for duplicates |
301
314
  | `MJ: Duplicate Runs` | Tracks each detection run (status, timing) |
302
- | `MJ: Duplicate Run Details` | Per-record tracking within a run |
303
- | `MJ: Duplicate Run Detail Matches` | Individual match results with probability scores |
315
+ | `MJ: Duplicate Run Details` | Per-record tracking within a run; includes `RecordMetadata` (vector DB metadata snapshot) |
316
+ | `MJ: Duplicate Run Detail Matches` | Individual match results with probability scores; includes `RecordMetadata` for the matched record |
304
317
 
305
318
  ---
306
319
 
@@ -5,11 +5,16 @@
5
5
  * optionally apply hybrid search (RRF) and reranking, persist match results,
6
6
  * and auto-merge high-confidence duplicates.
7
7
  *
8
- * Supports both list-based batch detection and single-record checks.
8
+ * Supports three record-source modes:
9
+ * 1. List-based batch detection (ListID provided)
10
+ * 2. View-based detection (ViewID provided)
11
+ * 3. Entity-wide detection (no ListID/ViewID — scans all records or applies ExtraFilter)
12
+ *
13
+ * Also supports single-record checks via CheckSingleRecord().
9
14
  *
10
15
  * @module @memberjunction/ai-vector-dupe
11
16
  */
12
- import { PotentialDuplicateRequest, PotentialDuplicateResponse, CompositeKey, UserInfo, BaseEntity, PotentialDuplicateResult, PotentialDuplicate, DuplicateDetectionOptions } from "@memberjunction/core";
17
+ import { PotentialDuplicateRequest, PotentialDuplicateResponse, CompositeKey, UserInfo, BaseEntity, PotentialDuplicateResult, EntityInfo, PotentialDuplicate, DuplicateDetectionOptions } from "@memberjunction/core";
13
18
  import { BaseResponse } from "@memberjunction/ai-vectordb";
14
19
  import { MJDuplicateRunDetailEntity, MJDuplicateRunDetailMatchEntity, MJDuplicateRunEntity, MJEntityDocumentEntity, MJListEntity } from "@memberjunction/core-entities";
15
20
  import { VectorBase } from "@memberjunction/ai-vectors";
@@ -28,6 +33,7 @@ interface RecordQueryResult {
28
33
  *
29
34
  * Supports:
30
35
  * - List-based batch detection (getDuplicateRecords)
36
+ * - View/filter/full-entity batch detection (vector-first approach)
31
37
  * - Single-record duplicate check (CheckSingleRecord)
32
38
  * - Hybrid search via RRF when vector DB supports it
33
39
  * - Optional post-retrieval reranking via MJ's BaseReranker
@@ -36,10 +42,38 @@ interface RecordQueryResult {
36
42
  export declare class DuplicateRecordDetector extends VectorBase {
37
43
  private vectorDB;
38
44
  private embedding;
45
+ /** The Pinecone/pgvector/Qdrant index name resolved from the entity document's VectorIndex */
46
+ private indexName;
47
+ /**
48
+ * Tracks already-seen source↔match pairs across the entire run to suppress inverse duplicates.
49
+ * If A→B is persisted, B→A is skipped. Key format: "smallerID::largerID" for consistent ordering.
50
+ */
51
+ private _seenPairs;
39
52
  /**
40
- * Run duplicate detection for all records in a list.
53
+ * Run duplicate detection for records identified by ListID, ViewID, ExtraFilter,
54
+ * or all records in the entity (vector-first approach).
55
+ *
56
+ * **Batching strategy:**
57
+ * - Records are loaded as lightweight IDs first, then processed in outer batches of
58
+ * {@link DEFAULT_BATCH_SIZE} (500) records.
59
+ * - Within each outer batch, embedding and vector similarity queries are further
60
+ * sub-batched into chunks of {@link VECTOR_QUERY_BATCH_SIZE} (100) records to keep
61
+ * API payloads and memory bounded.
62
+ * - Vector queries within each sub-batch run with configurable concurrency
63
+ * (default {@link DEFAULT_QUERY_CONCURRENCY} = 10).
64
+ *
65
+ * **Resume support:**
66
+ * - {@link MJDuplicateRunEntity.ProcessedItemCount} and
67
+ * {@link MJDuplicateRunEntity.LastProcessedOffset} are persisted after each outer batch.
68
+ * - On restart, processing resumes from {@link MJDuplicateRunEntity.LastProcessedOffset}.
69
+ *
70
+ * **Cancellation:**
71
+ * - {@link MJDuplicateRunEntity.CancellationRequested} is re-loaded from the database
72
+ * between outer batches. If set to `true`, processing stops and the run can be resumed later.
41
73
  *
42
- * Flow: validate vectorize embed query (optional rerank) → persist → (optional merge)
74
+ * @param params - The detection request specifying entity, document, list/view/filter, and options
75
+ * @param contextUser - The user context for entity operations and security
76
+ * @returns A response containing all potential duplicate results and an overall status
43
77
  */
44
78
  GetDuplicateRecords(params: PotentialDuplicateRequest, contextUser?: UserInfo): Promise<PotentialDuplicateResponse>;
45
79
  /**
@@ -47,18 +81,98 @@ export declare class DuplicateRecordDetector extends VectorBase {
47
81
  * Embeds the record and queries for matches directly.
48
82
  */
49
83
  CheckSingleRecord(EntityDocumentID: string, RecordID: CompositeKey, Options?: DuplicateDetectionOptions, ContextUser?: UserInfo): Promise<PotentialDuplicateResult>;
84
+ /**
85
+ * Process a single outer batch of record IDs through the full duplicate detection pipeline.
86
+ *
87
+ * Steps:
88
+ * 1. Load full record data for template rendering
89
+ * 2. Build source metadata for rich UI display
90
+ * 3. Create DuplicateRunDetail records
91
+ * 4. Sub-batch records into chunks of {@link VECTOR_QUERY_BATCH_SIZE} (default 100)
92
+ * for embedding + vector similarity querying, keeping memory and API payloads bounded
93
+ * 5. Persist match results and update run details
94
+ *
95
+ * @param batchIDs - Primary key values for records in this batch
96
+ * @param entityInfo - Entity metadata
97
+ * @param entityDocument - The entity document driving vectorization
98
+ * @param templateParser - Reusable template parser instance
99
+ * @param duplicateRunID - ID of the parent DuplicateRun record
100
+ * @param topK - Number of nearest neighbors to retrieve per record
101
+ * @param concurrency - Max parallel vector queries within each sub-batch
102
+ * @param options - Detection options (thresholds, callbacks, etc.)
103
+ * @param startTime - Epoch ms for elapsed-time progress reporting
104
+ * @param totalRecords - Total records across all batches (for progress reporting)
105
+ * @param processedSoFar - Records processed before this batch (for progress reporting)
106
+ * @param matchesSoFar - Matches found before this batch (for progress reporting)
107
+ * @param contextUser - The user context for entity operations
108
+ * @returns Combined results and match count for this batch
109
+ */
110
+ private ProcessBatch;
111
+ /**
112
+ * Load the IDs of records to check, using the appropriate strategy based on the request.
113
+ * Returns an array of primary key value strings.
114
+ */
115
+ protected LoadRecordIDsToCheck(params: PotentialDuplicateRequest, entityInfo: EntityInfo): Promise<string[]>;
116
+ /**
117
+ * Load record IDs from a list's detail records.
118
+ */
119
+ protected LoadRecordIDsFromList(listID: string): Promise<string[]>;
120
+ /**
121
+ * Load record IDs by running a saved view.
122
+ */
123
+ protected LoadRecordIDsFromView(viewID: string, entityInfo: EntityInfo): Promise<string[]>;
124
+ /**
125
+ * Load record IDs directly from the entity, optionally filtered.
126
+ * Uses Fields: ['ID'] and ResultType: 'simple' for efficiency.
127
+ */
128
+ protected LoadRecordIDsFromEntity(entityInfo: EntityInfo, extraFilter?: string): Promise<string[]>;
50
129
  /**
51
130
  * Validate and return an entity document, or null if not found.
52
131
  */
132
+ /**
133
+ * Validates that an entity document exists and is usable. Uses the
134
+ * KnowledgeHubMetadataEngine cache for instant lookups without database queries.
135
+ */
53
136
  protected ValidateEntityDocument(entityDocumentID: string): Promise<MJEntityDocumentEntity | null>;
54
137
  /**
55
- * Initialize embedding and vector DB providers via ClassFactory.
138
+ * Initializes embedding model, vector DB, and index name providers.
139
+ * Called once per detection run rather than per-record. Uses AIEngine
140
+ * and KnowledgeHubMetadataEngine caches to avoid redundant database queries.
56
141
  */
57
- protected InitializeProviders(entityDocument: MJEntityDocumentEntity): void;
142
+ protected InitializeProviders(entityDocument: MJEntityDocumentEntity): Promise<void>;
58
143
  /**
59
144
  * Run vectorization for the entity document's records.
60
145
  */
61
146
  protected VectorizeSourceRecords(entityDocument: MJEntityDocumentEntity, contextUser: UserInfo): Promise<void>;
147
+ /**
148
+ * Read the maxConcurrentRequests from the VectorDatabase entity's Configuration column,
149
+ * falling back to DEFAULT_QUERY_CONCURRENCY if not set.
150
+ */
151
+ protected GetQueryConcurrency(entityDocument: MJEntityDocumentEntity): number;
152
+ /**
153
+ * Resolve an existing DuplicateRun or create a new one.
154
+ * Supports both list-based and list-free operation.
155
+ */
156
+ protected ResolveOrCreateDuplicateRun(params: PotentialDuplicateRequest, entityDocument: MJEntityDocumentEntity, options: DuplicateDetectionOptions): Promise<MJDuplicateRunEntity>;
157
+ /**
158
+ * Create a new DuplicateRun record.
159
+ */
160
+ protected CreateDuplicateRun(entityDocument: MJEntityDocumentEntity, listID?: string): Promise<MJDuplicateRunEntity>;
161
+ protected LoadDuplicateRun(duplicateRunID: string): Promise<MJDuplicateRunEntity>;
162
+ /**
163
+ * Try to find an existing DuplicateRun for a given ListID. Returns null if none found.
164
+ */
165
+ protected FindDuplicateRunByListID(listID: string): Promise<MJDuplicateRunEntity | null>;
166
+ /**
167
+ * Load full entity objects for a batch of composite keys.
168
+ */
169
+ protected LoadRecordsByKeys(compositeKeys: CompositeKey[], entityInfo: EntityInfo): Promise<BaseEntity[]>;
170
+ /**
171
+ * Load records from an entity that are members of the specified list.
172
+ * Kept for backward compatibility.
173
+ */
174
+ protected LoadRecordsByListID(listID: string, entityID: string): Promise<BaseEntity[]>;
175
+ protected LoadListEntity(listID: string): Promise<MJListEntity>;
62
176
  /**
63
177
  * Generate human-readable template text for each record using the entity document template.
64
178
  *
@@ -72,9 +186,29 @@ export declare class DuplicateRecordDetector extends VectorBase {
72
186
  protected loadTemplate(entityDocument: MJEntityDocumentEntity): MJTemplateEntityExtended;
73
187
  /**
74
188
  * Query the vector DB for duplicates of each record, with concurrency control.
75
- * Supports hybrid search and RRF fusion when the vector DB supports it.
189
+ *
190
+ * Creates one async task per record, then executes them via {@link RunWithConcurrency}
191
+ * with the specified concurrency limit. Each task embeds and queries a single record
192
+ * against the vector index.
193
+ *
194
+ * Supports hybrid search (vector + keyword) with RRF fusion when the vector DB provider
195
+ * supports it (checked via `SupportsHybridSearch`).
196
+ *
197
+ * Post-query, results are:
198
+ * 1. Parsed from raw vector matches into typed {@link PotentialDuplicate} objects
199
+ * 2. Filtered to remove self-matches (same record as source)
200
+ * 3. Filtered by the potential match threshold (from options or entity document)
201
+ *
202
+ * @param records - The source records to find duplicates for
203
+ * @param vectors - Pre-computed embedding vectors, one per record (same index order)
204
+ * @param templateTexts - Rendered template texts for hybrid keyword search
205
+ * @param entityDocument - The entity document providing thresholds and configuration
206
+ * @param topK - Number of nearest neighbors to retrieve per record
207
+ * @param options - Detection options including threshold overrides
208
+ * @param concurrency - Max parallel vector queries
209
+ * @returns One {@link RecordQueryResult} per input record
76
210
  */
77
- protected QueryDuplicatesForRecords(records: BaseEntity[], vectors: number[][], templateTexts: string[], entityDocument: MJEntityDocumentEntity, topK: number, options: DuplicateDetectionOptions): Promise<RecordQueryResult[]>;
211
+ protected QueryDuplicatesForRecords(records: BaseEntity[], vectors: number[][], templateTexts: string[], entityDocument: MJEntityDocumentEntity, topK: number, options: DuplicateDetectionOptions, concurrency: number): Promise<RecordQueryResult[]>;
78
212
  /**
79
213
  * Execute a vector query — uses hybrid search with RRF when the provider supports it.
80
214
  */
@@ -86,18 +220,16 @@ export declare class DuplicateRecordDetector extends VectorBase {
86
220
  /**
87
221
  * Filter out self-matches where the candidate is the same record as the source.
88
222
  */
89
- protected FilterSelfMatches(duplicates: PotentialDuplicate[], sourceKey: CompositeKey): PotentialDuplicate[];
90
223
  /**
91
- * Load records from an entity that are members of the specified list.
224
+ * Build a map of recordID JSON metadata string from loaded BaseEntity records.
225
+ * Extracts the entity's name field and a few key display fields for rich UI rendering.
92
226
  */
93
- protected LoadRecordsByListID(listID: string, entityID: string): Promise<BaseEntity[]>;
94
- protected LoadListEntity(listID: string): Promise<MJListEntity>;
95
- protected LoadDuplicateRun(duplicateRunID: string): Promise<MJDuplicateRunEntity>;
96
- protected LoadDuplicateRunByListID(listID: string): Promise<MJDuplicateRunEntity>;
227
+ protected buildSourceMetadataMap(records: BaseEntity[], entityInfo: EntityInfo): Map<string, string>;
228
+ protected FilterSelfMatches(duplicates: PotentialDuplicate[], sourceKey: CompositeKey): PotentialDuplicate[];
97
229
  /**
98
- * Create DuplicateRunDetail records for each item in the list, saving in parallel batches.
230
+ * Create DuplicateRunDetail records for a batch of record IDs.
99
231
  */
100
- protected CreateRunDetailRecordsFromList(listID: string, duplicateRunID: string): Promise<MJDuplicateRunDetailEntity[]>;
232
+ protected CreateRunDetailRecords(recordIDs: string[], duplicateRunID: string, entityInfo: EntityInfo, metadataMap?: Map<string, string>): Promise<MJDuplicateRunDetailEntity[]>;
101
233
  /**
102
234
  * Persist match results and update run detail records.
103
235
  */
@@ -109,7 +241,7 @@ export declare class DuplicateRecordDetector extends VectorBase {
109
241
  /**
110
242
  * Automatically merge records that meet the absolute match threshold.
111
243
  */
112
- protected ProcessAutoMerges(response: PotentialDuplicateResponse, entityDocument: MJEntityDocumentEntity): Promise<void>;
244
+ protected ProcessAutoMerges(response: PotentialDuplicateResponse, entityDocument: MJEntityDocumentEntity, options?: DuplicateDetectionOptions): Promise<void>;
113
245
  /**
114
246
  * Update a match record's status after a successful merge.
115
247
  */
@@ -1 +1 @@
1
- {"version":3,"file":"duplicateRecordDetector.d.ts","sourceRoot":"","sources":["../src/duplicateRecordDetector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"duplicateRecordDetector.d.ts","sourceRoot":"","sources":["../src/duplicateRecordDetector.ts"],"names":[],"mappings":"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"}
@@ -5,21 +5,34 @@
5
5
  * optionally apply hybrid search (RRF) and reranking, persist match results,
6
6
  * and auto-merge high-confidence duplicates.
7
7
  *
8
- * Supports both list-based batch detection and single-record checks.
8
+ * Supports three record-source modes:
9
+ * 1. List-based batch detection (ListID provided)
10
+ * 2. View-based detection (ViewID provided)
11
+ * 3. Entity-wide detection (no ListID/ViewID — scans all records or applies ExtraFilter)
12
+ *
13
+ * Also supports single-record checks via CheckSingleRecord().
9
14
  *
10
15
  * @module @memberjunction/ai-vector-dupe
11
16
  */
12
17
  import { BaseEmbeddings, GetAIAPIKey } from "@memberjunction/ai";
13
- import { PotentialDuplicateResponse, PotentialDuplicateResult, LogError, LogStatus, RecordMergeRequest, PotentialDuplicate, } from "@memberjunction/core";
18
+ import { PotentialDuplicateResponse, CompositeKey, PotentialDuplicateResult, LogError, LogStatus, RecordMergeRequest, PotentialDuplicate, } from "@memberjunction/core";
14
19
  import { VectorDBBase } from "@memberjunction/ai-vectordb";
15
20
  import { MJGlobal, UUIDsEqual } from "@memberjunction/global";
21
+ import { KnowledgeHubMetadataEngine, } from "@memberjunction/core-entities";
16
22
  import { VectorBase } from "@memberjunction/ai-vectors";
17
23
  import { EntityDocumentTemplateParser, EntityVectorSyncer } from "@memberjunction/ai-vector-sync";
18
24
  import { TemplateEngineServer } from "@memberjunction/templates";
19
25
  /** Default number of nearest neighbors to retrieve per record */
20
26
  const DEFAULT_TOP_K = 5;
21
27
  /** Default concurrency limit for parallel vector queries */
22
- const QUERY_CONCURRENCY_LIMIT = 5;
28
+ const DEFAULT_QUERY_CONCURRENCY = 10;
29
+ /** Default batch size for loading records and parallel database saves */
30
+ const DEFAULT_BATCH_SIZE = 500;
31
+ /**
32
+ * Maximum number of records to embed and query in a single vector similarity sub-batch.
33
+ * Keeps memory and API payload sizes bounded within each outer processing batch.
34
+ */
35
+ const VECTOR_QUERY_BATCH_SIZE = 100;
23
36
  /** Default batch size for parallel database saves */
24
37
  const SAVE_BATCH_SIZE = 20;
25
38
  /**
@@ -27,19 +40,50 @@ const SAVE_BATCH_SIZE = 20;
27
40
  *
28
41
  * Supports:
29
42
  * - List-based batch detection (getDuplicateRecords)
43
+ * - View/filter/full-entity batch detection (vector-first approach)
30
44
  * - Single-record duplicate check (CheckSingleRecord)
31
45
  * - Hybrid search via RRF when vector DB supports it
32
46
  * - Optional post-retrieval reranking via MJ's BaseReranker
33
47
  * - Configurable topK, thresholds, and progress reporting
34
48
  */
35
49
  export class DuplicateRecordDetector extends VectorBase {
50
+ constructor() {
51
+ super(...arguments);
52
+ /**
53
+ * Tracks already-seen source↔match pairs across the entire run to suppress inverse duplicates.
54
+ * If A→B is persisted, B→A is skipped. Key format: "smallerID::largerID" for consistent ordering.
55
+ */
56
+ this._seenPairs = new Set();
57
+ }
36
58
  /**
37
- * Run duplicate detection for all records in a list.
59
+ * Run duplicate detection for records identified by ListID, ViewID, ExtraFilter,
60
+ * or all records in the entity (vector-first approach).
61
+ *
62
+ * **Batching strategy:**
63
+ * - Records are loaded as lightweight IDs first, then processed in outer batches of
64
+ * {@link DEFAULT_BATCH_SIZE} (500) records.
65
+ * - Within each outer batch, embedding and vector similarity queries are further
66
+ * sub-batched into chunks of {@link VECTOR_QUERY_BATCH_SIZE} (100) records to keep
67
+ * API payloads and memory bounded.
68
+ * - Vector queries within each sub-batch run with configurable concurrency
69
+ * (default {@link DEFAULT_QUERY_CONCURRENCY} = 10).
70
+ *
71
+ * **Resume support:**
72
+ * - {@link MJDuplicateRunEntity.ProcessedItemCount} and
73
+ * {@link MJDuplicateRunEntity.LastProcessedOffset} are persisted after each outer batch.
74
+ * - On restart, processing resumes from {@link MJDuplicateRunEntity.LastProcessedOffset}.
75
+ *
76
+ * **Cancellation:**
77
+ * - {@link MJDuplicateRunEntity.CancellationRequested} is re-loaded from the database
78
+ * between outer batches. If set to `true`, processing stops and the run can be resumed later.
38
79
  *
39
- * Flow: validate vectorize embed query (optional rerank) → persist → (optional merge)
80
+ * @param params - The detection request specifying entity, document, list/view/filter, and options
81
+ * @param contextUser - The user context for entity operations and security
82
+ * @returns A response containing all potential duplicate results and an overall status
40
83
  */
41
84
  async GetDuplicateRecords(params, contextUser) {
42
85
  this.CurrentUser = contextUser;
86
+ this._seenPairs.clear(); // Reset for each new run
43
87
  const options = params.Options ?? {};
44
88
  const startTime = Date.now();
45
89
  const response = new PotentialDuplicateResponse();
@@ -51,51 +95,76 @@ export class DuplicateRecordDetector extends VectorBase {
51
95
  response.Status = 'Error';
52
96
  return response;
53
97
  }
54
- // Step 2: Vectorize source records
55
- this.reportProgress(options, 'Vectorizing', 0, 0, 0, startTime);
56
- await this.VectorizeSourceRecords(entityDocument, contextUser);
98
+ // Step 2: Optionally vectorize source records (default: skip — vectors should already exist from sync)
99
+ if (options.Revectorize) {
100
+ this.reportProgress(options, 'Vectorizing', 0, 0, 0, startTime);
101
+ await this.VectorizeSourceRecords(entityDocument, contextUser);
102
+ }
57
103
  // Step 3: Initialize providers
58
- this.InitializeProviders(entityDocument);
59
- // Step 4: Load list and duplicate run
60
- const list = await this.LoadListEntity(params.ListID);
61
- const duplicateRun = options.DuplicateRunID
62
- ? await this.LoadDuplicateRun(options.DuplicateRunID)
63
- : await this.LoadDuplicateRunByListID(list.ID);
64
- // Step 5: Create run detail records in batches
65
- const duplicateRunDetails = await this.CreateRunDetailRecordsFromList(list.ID, duplicateRun.ID);
66
- // Step 6: Load and embed records
67
- const records = await this.LoadRecordsByListID(list.ID, entityDocument.EntityID);
68
- if (records.length === 0) {
69
- LogError(`No records found in list ${list.Name}`);
70
- response.ErrorMessage = `No records found in list ${list.Name}`;
104
+ await this.InitializeProviders(entityDocument);
105
+ // Step 4: Create or load DuplicateRun
106
+ const duplicateRun = await this.ResolveOrCreateDuplicateRun(params, entityDocument, options);
107
+ // Step 5: Load record IDs to check (batch-friendly — only IDs)
108
+ this.reportProgress(options, 'Loading', 0, 0, 0, startTime);
109
+ const entityInfo = this.Metadata.EntityByID(entityDocument.EntityID);
110
+ if (!entityInfo) {
111
+ response.ErrorMessage = `Entity not found for ID ${entityDocument.EntityID}`;
71
112
  response.Status = 'Error';
72
113
  return response;
73
114
  }
74
- this.reportProgress(options, 'Embedding', records.length, 0, 0, startTime);
75
- // Step 7: Generate template text and embeddings
76
- const templateParser = EntityDocumentTemplateParser.CreateInstance();
77
- const templateTexts = await this.GenerateTemplateTexts(templateParser, entityDocument, records, contextUser);
78
- const embedResult = await this.embedding.EmbedTexts({ texts: templateTexts, model: null });
79
- // Step 8: Query vector DB for each record (with concurrency control)
80
- this.reportProgress(options, 'Querying', records.length, 0, 0, startTime);
115
+ const recordIDs = await this.LoadRecordIDsToCheck(params, entityInfo);
116
+ if (recordIDs.length === 0) {
117
+ response.ErrorMessage = 'No records found to check for duplicates';
118
+ response.Status = 'Error';
119
+ return response;
120
+ }
121
+ // Step 6: Process in batches with resume support
122
+ const batchSize = DEFAULT_BATCH_SIZE;
123
+ const concurrency = this.GetQueryConcurrency(entityDocument);
81
124
  const topK = options.TopK ?? DEFAULT_TOP_K;
82
- const queryResults = await this.QueryDuplicatesForRecords(records, embedResult.vectors, templateTexts, entityDocument, topK, options);
83
- // Step 9: Persist match results and update run details
84
- this.reportProgress(options, 'Matching', records.length, records.length, 0, startTime);
85
- const results = await this.PersistMatchResults(queryResults, duplicateRunDetails, entityDocument, options, startTime);
86
- // Step 10: Complete the duplicate run
125
+ const templateParser = EntityDocumentTemplateParser.CreateInstance();
126
+ let totalMatchesFound = 0;
127
+ // Update run with total count for progress tracking
128
+ duplicateRun.TotalItemCount = recordIDs.length;
129
+ duplicateRun.BatchSize = batchSize;
130
+ await this.SaveEntity(duplicateRun);
131
+ // Resume from last processed offset if available
132
+ const resumeOffset = duplicateRun.LastProcessedOffset ?? 0;
133
+ if (resumeOffset > 0) {
134
+ LogStatus(`Duplicate detection: resuming from offset ${resumeOffset}`);
135
+ }
136
+ for (let offset = resumeOffset; offset < recordIDs.length; offset += batchSize) {
137
+ // Check for cancellation between batches
138
+ await duplicateRun.Load(duplicateRun.ID);
139
+ if (duplicateRun.CancellationRequested) {
140
+ LogStatus(`Duplicate detection: cancellation requested at offset ${offset}`);
141
+ duplicateRun.ProcessingStatus = 'In Progress'; // Will be resumed later
142
+ duplicateRun.EndedAt = new Date();
143
+ await this.SaveEntity(duplicateRun);
144
+ response.Status = 'Success'; // Partial success — can be resumed
145
+ return response;
146
+ }
147
+ const batchIDs = recordIDs.slice(offset, offset + batchSize);
148
+ const batchResults = await this.ProcessBatch(batchIDs, entityInfo, entityDocument, templateParser, duplicateRun.ID, topK, concurrency, options, startTime, recordIDs.length, offset, totalMatchesFound, contextUser);
149
+ response.PotentialDuplicateResult.push(...batchResults.Results);
150
+ totalMatchesFound += batchResults.MatchesFound;
151
+ // Update cursor for resume support
152
+ duplicateRun.ProcessedItemCount = offset + batchIDs.length;
153
+ duplicateRun.LastProcessedOffset = offset + batchSize;
154
+ await this.SaveEntity(duplicateRun);
155
+ }
156
+ // Step 7: Complete the duplicate run
87
157
  duplicateRun.ProcessingStatus = 'Complete';
88
158
  duplicateRun.EndedAt = new Date();
89
159
  const runSaveSuccess = await this.SaveEntity(duplicateRun);
90
160
  if (!runSaveSuccess) {
91
161
  throw new Error(`Failed to update Duplicate Run record ${duplicateRun.ID}`);
92
162
  }
93
- // Step 11: Auto-merge high-confidence matches
94
- this.reportProgress(options, 'Merging', records.length, records.length, results.length, startTime);
95
- response.PotentialDuplicateResult = results;
96
- await this.ProcessAutoMerges(response, entityDocument);
163
+ // Step 8: Auto-merge high-confidence matches
164
+ this.reportProgress(options, 'Merging', recordIDs.length, recordIDs.length, totalMatchesFound, startTime);
165
+ await this.ProcessAutoMerges(response, entityDocument, options);
97
166
  response.Status = 'Success';
98
- LogStatus(`Duplicate detection complete: ${results.length} records checked`);
167
+ LogStatus(`Duplicate detection complete: ${recordIDs.length} records checked, ${totalMatchesFound} matches found`);
99
168
  return response;
100
169
  }
101
170
  /**
@@ -109,7 +178,7 @@ export class DuplicateRecordDetector extends VectorBase {
109
178
  if (!entityDocument) {
110
179
  throw new Error(`No active Entity Document found for ID ${EntityDocumentID}`);
111
180
  }
112
- this.InitializeProviders(entityDocument);
181
+ await this.InitializeProviders(entityDocument);
113
182
  // Load the single record
114
183
  const entityInfo = this.Metadata.EntityByID(entityDocument.EntityID);
115
184
  if (!entityInfo) {
@@ -128,24 +197,172 @@ export class DuplicateRecordDetector extends VectorBase {
128
197
  const templateTexts = await this.GenerateTemplateTexts(templateParser, entityDocument, [record], ContextUser);
129
198
  const embedResult = await this.embedding.EmbedTexts({ texts: templateTexts, model: null });
130
199
  const topK = options.TopK ?? DEFAULT_TOP_K;
131
- const queryResults = await this.QueryDuplicatesForRecords([record], embedResult.vectors, templateTexts, entityDocument, topK, options);
200
+ const queryResults = await this.QueryDuplicatesForRecords([record], embedResult.vectors, templateTexts, entityDocument, topK, options, this.GetQueryConcurrency(entityDocument));
132
201
  return queryResults.length > 0 ? queryResults[0].Duplicates : new PotentialDuplicateResult();
133
202
  }
134
203
  // ─────────────────────────────────────────────
204
+ // Batch Processing
205
+ // ─────────────────────────────────────────────
206
+ /**
207
+ * Process a single outer batch of record IDs through the full duplicate detection pipeline.
208
+ *
209
+ * Steps:
210
+ * 1. Load full record data for template rendering
211
+ * 2. Build source metadata for rich UI display
212
+ * 3. Create DuplicateRunDetail records
213
+ * 4. Sub-batch records into chunks of {@link VECTOR_QUERY_BATCH_SIZE} (default 100)
214
+ * for embedding + vector similarity querying, keeping memory and API payloads bounded
215
+ * 5. Persist match results and update run details
216
+ *
217
+ * @param batchIDs - Primary key values for records in this batch
218
+ * @param entityInfo - Entity metadata
219
+ * @param entityDocument - The entity document driving vectorization
220
+ * @param templateParser - Reusable template parser instance
221
+ * @param duplicateRunID - ID of the parent DuplicateRun record
222
+ * @param topK - Number of nearest neighbors to retrieve per record
223
+ * @param concurrency - Max parallel vector queries within each sub-batch
224
+ * @param options - Detection options (thresholds, callbacks, etc.)
225
+ * @param startTime - Epoch ms for elapsed-time progress reporting
226
+ * @param totalRecords - Total records across all batches (for progress reporting)
227
+ * @param processedSoFar - Records processed before this batch (for progress reporting)
228
+ * @param matchesSoFar - Matches found before this batch (for progress reporting)
229
+ * @param contextUser - The user context for entity operations
230
+ * @returns Combined results and match count for this batch
231
+ */
232
+ async ProcessBatch(batchIDs, entityInfo, entityDocument, templateParser, duplicateRunID, topK, concurrency, options, startTime, totalRecords, processedSoFar, matchesSoFar, contextUser) {
233
+ // 6a: Load full record data for this batch (needed for template rendering)
234
+ const compositeKeys = batchIDs.map(id => {
235
+ const ck = new CompositeKey();
236
+ ck.KeyValuePairs.push({ FieldName: entityInfo.FirstPrimaryKey.Name, Value: id });
237
+ return ck;
238
+ });
239
+ const records = await this.LoadRecordsByKeys(compositeKeys, entityInfo);
240
+ if (records.length === 0) {
241
+ return { Results: [], MatchesFound: 0 };
242
+ }
243
+ // 6b: Build source record metadata map for rich UI display
244
+ const sourceMetadataMap = this.buildSourceMetadataMap(records, entityInfo);
245
+ // 6c: Create DuplicateRunDetail records for this batch
246
+ const duplicateRunDetails = await this.CreateRunDetailRecords(batchIDs, duplicateRunID, entityInfo, sourceMetadataMap);
247
+ // 6d: Sub-batch embedding + vector queries in chunks of VECTOR_QUERY_BATCH_SIZE
248
+ // to keep API payload sizes and memory bounded
249
+ const allQueryResults = [];
250
+ const subBatches = chunkArray(records, VECTOR_QUERY_BATCH_SIZE);
251
+ for (let i = 0; i < subBatches.length; i++) {
252
+ const subRecords = subBatches[i];
253
+ // Embed this sub-batch
254
+ this.reportProgress(options, 'Embedding', totalRecords, processedSoFar, matchesSoFar, startTime);
255
+ const subTemplateTexts = await this.GenerateTemplateTexts(templateParser, entityDocument, subRecords, contextUser);
256
+ const subEmbedResult = await this.embedding.EmbedTexts({ texts: subTemplateTexts, model: null });
257
+ // Query vector DB for each record in the sub-batch with concurrency control
258
+ this.reportProgress(options, 'Querying', totalRecords, processedSoFar, matchesSoFar, startTime);
259
+ const subQueryResults = await this.QueryDuplicatesForRecords(subRecords, subEmbedResult.vectors, subTemplateTexts, entityDocument, topK, options, concurrency);
260
+ allQueryResults.push(...subQueryResults);
261
+ }
262
+ // 6e: Persist match results and update run details
263
+ this.reportProgress(options, 'Matching', totalRecords, processedSoFar + records.length, matchesSoFar, startTime);
264
+ const results = await this.PersistMatchResults(allQueryResults, duplicateRunDetails, entityDocument, options, startTime);
265
+ const batchMatches = results.reduce((sum, r) => sum + r.Duplicates.length, 0);
266
+ return { Results: results, MatchesFound: batchMatches };
267
+ }
268
+ // ─────────────────────────────────────────────
269
+ // Record ID Loading (multiple strategies)
270
+ // ─────────────────────────────────────────────
271
+ /**
272
+ * Load the IDs of records to check, using the appropriate strategy based on the request.
273
+ * Returns an array of primary key value strings.
274
+ */
275
+ async LoadRecordIDsToCheck(params, entityInfo) {
276
+ if (params.ListID) {
277
+ return this.LoadRecordIDsFromList(params.ListID);
278
+ }
279
+ if (params.ViewID) {
280
+ return this.LoadRecordIDsFromView(params.ViewID, entityInfo);
281
+ }
282
+ // ExtraFilter or all records
283
+ return this.LoadRecordIDsFromEntity(entityInfo, params.ExtraFilter);
284
+ }
285
+ /**
286
+ * Load record IDs from a list's detail records.
287
+ */
288
+ async LoadRecordIDsFromList(listID) {
289
+ const sanitizedListID = listID.replace(/'/g, "''");
290
+ const viewResults = await this.RunView.RunView({
291
+ EntityName: 'MJ: List Details',
292
+ ExtraFilter: `ListID = '${sanitizedListID}'`,
293
+ Fields: ['RecordID'],
294
+ ResultType: 'simple',
295
+ }, this.CurrentUser);
296
+ if (!viewResults.Success) {
297
+ throw new Error(`Failed to load list details: ${viewResults.ErrorMessage}`);
298
+ }
299
+ return viewResults.Results.map(r => r.RecordID);
300
+ }
301
+ /**
302
+ * Load record IDs by running a saved view.
303
+ */
304
+ async LoadRecordIDsFromView(viewID, entityInfo) {
305
+ const pkField = entityInfo.FirstPrimaryKey.Name;
306
+ const sanitizedViewID = viewID.replace(/'/g, "''");
307
+ // Load the view definition to get its filter
308
+ const viewEntity = await this.RunViewForSingleValue('Views', `ID = '${sanitizedViewID}'`);
309
+ if (!viewEntity) {
310
+ throw new Error(`View not found: ${viewID}`);
311
+ }
312
+ // Run the entity with the view's filter to get IDs
313
+ const viewResults = await this.RunView.RunView({
314
+ ViewID: viewID,
315
+ Fields: [pkField],
316
+ ResultType: 'simple',
317
+ }, this.CurrentUser);
318
+ if (!viewResults.Success) {
319
+ throw new Error(`Failed to run view ${viewID}: ${viewResults.ErrorMessage}`);
320
+ }
321
+ return viewResults.Results.map(r => r[pkField]);
322
+ }
323
+ /**
324
+ * Load record IDs directly from the entity, optionally filtered.
325
+ * Uses Fields: ['ID'] and ResultType: 'simple' for efficiency.
326
+ */
327
+ async LoadRecordIDsFromEntity(entityInfo, extraFilter) {
328
+ const pkField = entityInfo.FirstPrimaryKey.Name;
329
+ const viewResults = await this.RunView.RunView({
330
+ EntityName: entityInfo.Name,
331
+ ExtraFilter: extraFilter,
332
+ Fields: [pkField],
333
+ ResultType: 'simple',
334
+ }, this.CurrentUser);
335
+ if (!viewResults.Success) {
336
+ throw new Error(`Failed to load record IDs from ${entityInfo.Name}: ${viewResults.ErrorMessage}`);
337
+ }
338
+ return viewResults.Results.map(r => r[pkField]);
339
+ }
340
+ // ─────────────────────────────────────────────
135
341
  // Validation & Setup
136
342
  // ─────────────────────────────────────────────
137
343
  /**
138
344
  * Validate and return an entity document, or null if not found.
139
345
  */
346
+ /**
347
+ * Validates that an entity document exists and is usable. Uses the
348
+ * KnowledgeHubMetadataEngine cache for instant lookups without database queries.
349
+ */
140
350
  async ValidateEntityDocument(entityDocumentID) {
141
- const vectorizer = new EntityVectorSyncer();
142
- vectorizer.CurrentUser = this.CurrentUser;
143
- return vectorizer.GetEntityDocument(entityDocumentID);
351
+ // Ensure KH engine is initialized (no-op if already loaded)
352
+ await KnowledgeHubMetadataEngine.Instance.Config(false, this.CurrentUser);
353
+ const doc = KnowledgeHubMetadataEngine.Instance.GetEntityDocumentById(entityDocumentID);
354
+ return doc ?? null;
144
355
  }
145
356
  /**
146
- * Initialize embedding and vector DB providers via ClassFactory.
357
+ * Initializes embedding model, vector DB, and index name providers.
358
+ * Called once per detection run rather than per-record. Uses AIEngine
359
+ * and KnowledgeHubMetadataEngine caches to avoid redundant database queries.
147
360
  */
148
- InitializeProviders(entityDocument) {
361
+ async InitializeProviders(entityDocument) {
362
+ // Skip re-initialization if providers are already set for this entity document
363
+ if (this.embedding && this.vectorDB && this.indexName) {
364
+ return;
365
+ }
149
366
  const aiModel = this.GetAIModel(entityDocument.AIModelID);
150
367
  const vectorDB = this.GetVectorDatabase(entityDocument.VectorDatabaseID);
151
368
  const embeddingAPIKey = GetAIAPIKey(aiModel.DriverClass);
@@ -164,7 +381,20 @@ export class DuplicateRecordDetector extends VectorBase {
164
381
  if (!this.vectorDB) {
165
382
  throw new Error(`Failed to create VectorDB instance for ${vectorDB.ClassKey}`);
166
383
  }
167
- LogStatus(`Providers initialized: AI Model=${aiModel.DriverClass}, VectorDB=${vectorDB.ClassKey}`);
384
+ // Resolve the vector index name from the entity document's VectorIndexID
385
+ // Uses KnowledgeHubMetadataEngine cache instead of a RunView query
386
+ if (entityDocument.VectorIndexID) {
387
+ const vectorIndex = KnowledgeHubMetadataEngine.Instance.GetVectorIndexById(entityDocument.VectorIndexID);
388
+ if (vectorIndex) {
389
+ this.indexName = vectorIndex.Name;
390
+ }
391
+ }
392
+ if (!this.indexName) {
393
+ throw new Error(`No vector index found for entity document "${entityDocument.Name}" (ID: ${entityDocument.ID}). ` +
394
+ `Ensure VectorIndexID is set on the entity document. You can create and assign a Vector Index ` +
395
+ `in the Knowledge Hub > Vector Indexes section.`);
396
+ }
397
+ LogStatus(`Providers initialized: AI Model=${aiModel.DriverClass}, VectorDB=${vectorDB.ClassKey}, Index=${this.indexName}`);
168
398
  }
169
399
  /**
170
400
  * Run vectorization for the entity document's records.
@@ -182,6 +412,131 @@ export class DuplicateRecordDetector extends VectorBase {
182
412
  LogStatus(`Vectorizing entity records for document ${entityDocument.Name}`);
183
413
  await vectorizer.VectorizeEntity(request, contextUser);
184
414
  }
415
+ /**
416
+ * Read the maxConcurrentRequests from the VectorDatabase entity's Configuration column,
417
+ * falling back to DEFAULT_QUERY_CONCURRENCY if not set.
418
+ */
419
+ GetQueryConcurrency(entityDocument) {
420
+ const vectorDBEntity = this.GetVectorDatabase(entityDocument.VectorDatabaseID);
421
+ if (vectorDBEntity.Configuration) {
422
+ try {
423
+ const config = JSON.parse(vectorDBEntity.Configuration);
424
+ if (config.throughput?.maxConcurrentRequests != null) {
425
+ return config.throughput.maxConcurrentRequests;
426
+ }
427
+ }
428
+ catch {
429
+ // Invalid JSON in Configuration — fall through to default
430
+ }
431
+ }
432
+ return DEFAULT_QUERY_CONCURRENCY;
433
+ }
434
+ // ─────────────────────────────────────────────
435
+ // DuplicateRun Management
436
+ // ─────────────────────────────────────────────
437
+ /**
438
+ * Resolve an existing DuplicateRun or create a new one.
439
+ * Supports both list-based and list-free operation.
440
+ */
441
+ async ResolveOrCreateDuplicateRun(params, entityDocument, options) {
442
+ // If a specific run ID was provided, load it
443
+ if (options.DuplicateRunID) {
444
+ return this.LoadDuplicateRun(options.DuplicateRunID);
445
+ }
446
+ // If a ListID is provided, try to find an existing run for that list
447
+ if (params.ListID) {
448
+ const existing = await this.FindDuplicateRunByListID(params.ListID);
449
+ if (existing) {
450
+ return existing;
451
+ }
452
+ }
453
+ // Create a new DuplicateRun
454
+ return this.CreateDuplicateRun(entityDocument, params.ListID);
455
+ }
456
+ /**
457
+ * Create a new DuplicateRun record.
458
+ */
459
+ async CreateDuplicateRun(entityDocument, listID) {
460
+ const dupeRun = await this.Metadata.GetEntityObject('MJ: Duplicate Runs', this.CurrentUser);
461
+ dupeRun.NewRecord();
462
+ dupeRun.EntityID = entityDocument.EntityID;
463
+ dupeRun.StartedByUserID = this.CurrentUser?.ID;
464
+ dupeRun.StartedAt = new Date();
465
+ dupeRun.ProcessingStatus = 'In Progress';
466
+ dupeRun.ApprovalStatus = 'Pending';
467
+ if (listID) {
468
+ dupeRun.SourceListID = listID;
469
+ }
470
+ const success = await this.SaveEntity(dupeRun);
471
+ if (!success) {
472
+ throw new Error('Failed to create Duplicate Run record');
473
+ }
474
+ return dupeRun;
475
+ }
476
+ async LoadDuplicateRun(duplicateRunID) {
477
+ const dupeRun = await this.Metadata.GetEntityObject('MJ: Duplicate Runs', this.CurrentUser);
478
+ dupeRun.ContextCurrentUser = this.CurrentUser;
479
+ const success = await dupeRun.Load(duplicateRunID);
480
+ if (!success) {
481
+ throw new Error(`Failed to load Duplicate Run record ${duplicateRunID}`);
482
+ }
483
+ return dupeRun;
484
+ }
485
+ /**
486
+ * Try to find an existing DuplicateRun for a given ListID. Returns null if none found.
487
+ */
488
+ async FindDuplicateRunByListID(listID) {
489
+ return this.RunViewForSingleValue('MJ: Duplicate Runs', `SourceListID = '${listID.replace(/'/g, "''")}'`);
490
+ }
491
+ // ─────────────────────────────────────────────
492
+ // Entity Loading
493
+ // ─────────────────────────────────────────────
494
+ /**
495
+ * Load full entity objects for a batch of composite keys.
496
+ */
497
+ async LoadRecordsByKeys(compositeKeys, entityInfo) {
498
+ if (compositeKeys.length === 0) {
499
+ return [];
500
+ }
501
+ const rvResult = await this.RunView.RunView({
502
+ EntityName: entityInfo.Name,
503
+ ExtraFilter: this.BuildExtraFilter(compositeKeys),
504
+ ResultType: 'entity_object',
505
+ }, this.CurrentUser);
506
+ if (!rvResult.Success) {
507
+ throw new Error(rvResult.ErrorMessage);
508
+ }
509
+ return rvResult.Results;
510
+ }
511
+ /**
512
+ * Load records from an entity that are members of the specified list.
513
+ * Kept for backward compatibility.
514
+ */
515
+ async LoadRecordsByListID(listID, entityID) {
516
+ const entityInfo = this.Metadata.EntityByID(entityID);
517
+ if (!entityInfo) {
518
+ throw new Error(`Entity not found for ID ${entityID}`);
519
+ }
520
+ const sanitizedListID = listID.replace(/'/g, "''");
521
+ const rvResult = await this.RunView.RunView({
522
+ EntityName: entityInfo.Name,
523
+ ExtraFilter: `ID IN (SELECT RecordID FROM __mj.vwListDetails WHERE ListID = '${sanitizedListID}')`,
524
+ ResultType: 'entity_object',
525
+ }, this.CurrentUser);
526
+ if (!rvResult.Success) {
527
+ throw new Error(rvResult.ErrorMessage);
528
+ }
529
+ return rvResult.Results;
530
+ }
531
+ async LoadListEntity(listID) {
532
+ const list = await this.Metadata.GetEntityObject('MJ: Lists');
533
+ list.ContextCurrentUser = this.CurrentUser;
534
+ const success = await list.Load(listID);
535
+ if (!success) {
536
+ throw new Error(`Failed to load List record ${listID}`);
537
+ }
538
+ return list;
539
+ }
185
540
  // ─────────────────────────────────────────────
186
541
  // Template Generation & Embedding
187
542
  // ─────────────────────────────────────────────
@@ -230,9 +585,29 @@ export class DuplicateRecordDetector extends VectorBase {
230
585
  // ─────────────────────────────────────────────
231
586
  /**
232
587
  * Query the vector DB for duplicates of each record, with concurrency control.
233
- * Supports hybrid search and RRF fusion when the vector DB supports it.
588
+ *
589
+ * Creates one async task per record, then executes them via {@link RunWithConcurrency}
590
+ * with the specified concurrency limit. Each task embeds and queries a single record
591
+ * against the vector index.
592
+ *
593
+ * Supports hybrid search (vector + keyword) with RRF fusion when the vector DB provider
594
+ * supports it (checked via `SupportsHybridSearch`).
595
+ *
596
+ * Post-query, results are:
597
+ * 1. Parsed from raw vector matches into typed {@link PotentialDuplicate} objects
598
+ * 2. Filtered to remove self-matches (same record as source)
599
+ * 3. Filtered by the potential match threshold (from options or entity document)
600
+ *
601
+ * @param records - The source records to find duplicates for
602
+ * @param vectors - Pre-computed embedding vectors, one per record (same index order)
603
+ * @param templateTexts - Rendered template texts for hybrid keyword search
604
+ * @param entityDocument - The entity document providing thresholds and configuration
605
+ * @param topK - Number of nearest neighbors to retrieve per record
606
+ * @param options - Detection options including threshold overrides
607
+ * @param concurrency - Max parallel vector queries
608
+ * @returns One {@link RecordQueryResult} per input record
234
609
  */
235
- async QueryDuplicatesForRecords(records, vectors, templateTexts, entityDocument, topK, options) {
610
+ async QueryDuplicatesForRecords(records, vectors, templateTexts, entityDocument, topK, options, concurrency) {
236
611
  const tasks = records.map((record, index) => async () => {
237
612
  const compositeKey = record.PrimaryKey;
238
613
  const vector = vectors[index];
@@ -247,12 +622,13 @@ export class DuplicateRecordDetector extends VectorBase {
247
622
  }
248
623
  const dupeResult = this.ParseVectorMatches(queryResponse, compositeKey);
249
624
  dupeResult.Duplicates = this.FilterSelfMatches(dupeResult.Duplicates, compositeKey);
250
- dupeResult.Duplicates = dupeResult.Duplicates.filter((d) => d.ProbabilityScore >= entityDocument.PotentialMatchThreshold);
625
+ const potentialThreshold = options.PotentialMatchThreshold ?? entityDocument.PotentialMatchThreshold;
626
+ dupeResult.Duplicates = dupeResult.Duplicates.filter((d) => d.ProbabilityScore >= potentialThreshold);
251
627
  dupeResult.EntityID = entityDocument.EntityID;
252
628
  dupeResult.RecordCompositeKey = compositeKey;
253
629
  return { SourceKey: compositeKey, TemplateText: templateText, Duplicates: dupeResult };
254
630
  });
255
- return RunWithConcurrency(tasks, QUERY_CONCURRENCY_LIMIT);
631
+ return RunWithConcurrency(tasks, concurrency);
256
632
  }
257
633
  /**
258
634
  * Execute a vector query — uses hybrid search with RRF when the provider supports it.
@@ -270,6 +646,7 @@ export class DuplicateRecordDetector extends VectorBase {
270
646
  });
271
647
  }
272
648
  return this.vectorDB.QueryIndex({
649
+ id: this.indexName,
273
650
  vector,
274
651
  topK,
275
652
  includeMetadata: true,
@@ -294,6 +671,8 @@ export class DuplicateRecordDetector extends VectorBase {
294
671
  const duplicate = new PotentialDuplicate();
295
672
  duplicate.LoadFromConcatenatedString(match.metadata.RecordID);
296
673
  duplicate.ProbabilityScore = match.score;
674
+ // Capture the full vector metadata for rich UI display
675
+ duplicate.VectorMetadata = { ...match.metadata };
297
676
  result.Duplicates.push(duplicate);
298
677
  }
299
678
  return result;
@@ -301,81 +680,84 @@ export class DuplicateRecordDetector extends VectorBase {
301
680
  /**
302
681
  * Filter out self-matches where the candidate is the same record as the source.
303
682
  */
304
- FilterSelfMatches(duplicates, sourceKey) {
305
- return duplicates.filter((d) => d.ToString() !== sourceKey.ToString());
306
- }
307
- // ─────────────────────────────────────────────
308
- // Entity Loading
309
- // ─────────────────────────────────────────────
310
683
  /**
311
- * Load records from an entity that are members of the specified list.
684
+ * Build a map of recordID JSON metadata string from loaded BaseEntity records.
685
+ * Extracts the entity's name field and a few key display fields for rich UI rendering.
312
686
  */
313
- async LoadRecordsByListID(listID, entityID) {
314
- const entityInfo = this.Metadata.EntityByID(entityID);
315
- if (!entityInfo) {
316
- throw new Error(`Entity not found for ID ${entityID}`);
317
- }
318
- const sanitizedListID = listID.replace(/'/g, "''");
319
- const rvResult = await this.RunView.RunView({
320
- EntityName: entityInfo.Name,
321
- ExtraFilter: `ID IN (SELECT RecordID FROM __mj.vwListDetails WHERE ListID = '${sanitizedListID}')`,
322
- ResultType: 'entity_object',
323
- }, this.CurrentUser);
324
- if (!rvResult.Success) {
325
- throw new Error(rvResult.ErrorMessage);
687
+ buildSourceMetadataMap(records, entityInfo) {
688
+ const metadataMap = new Map();
689
+ // Combine all IsNameField fields in Sequence order for the display name
690
+ const nameFields = entityInfo.Fields
691
+ .filter(f => f.IsNameField)
692
+ .sort((a, b) => (a.Sequence ?? 9999) - (b.Sequence ?? 9999));
693
+ // Fall back to singular NameField if no IsNameField flags
694
+ if (nameFields.length === 0 && entityInfo.NameField) {
695
+ nameFields.push(entityInfo.NameField);
326
696
  }
327
- return rvResult.Results;
328
- }
329
- async LoadListEntity(listID) {
330
- const list = await this.Metadata.GetEntityObject('MJ: Lists');
331
- list.ContextCurrentUser = this.CurrentUser;
332
- const success = await list.Load(listID);
333
- if (!success) {
334
- throw new Error(`Failed to load List record ${listID}`);
335
- }
336
- return list;
337
- }
338
- async LoadDuplicateRun(duplicateRunID) {
339
- const dupeRun = await this.Metadata.GetEntityObject('MJ: Duplicate Runs');
340
- dupeRun.ContextCurrentUser = this.CurrentUser;
341
- const success = await dupeRun.Load(duplicateRunID);
342
- if (!success) {
343
- throw new Error(`Failed to load Duplicate Run record ${duplicateRunID}`);
697
+ // Use DefaultInView fields for display, plus IsNameField fields
698
+ const internalNames = new Set(['ID', '__mj_CreatedAt', '__mj_UpdatedAt']);
699
+ const displayFields = entityInfo.Fields
700
+ .filter(f => f.DefaultInView && !f.IsPrimaryKey && !internalNames.has(f.Name))
701
+ .sort((a, b) => (a.Sequence ?? 9999) - (b.Sequence ?? 9999));
702
+ for (const record of records) {
703
+ const pk = record.PrimaryKey;
704
+ const id = pk.KeyValuePairs.length === 1 ? String(pk.KeyValuePairs[0].Value) : pk.Values();
705
+ const meta = {
706
+ Entity: entityInfo.Name,
707
+ };
708
+ if (entityInfo.Icon) {
709
+ meta['EntityIcon'] = entityInfo.Icon;
710
+ }
711
+ // Store combined name from all IsNameField fields
712
+ const nameParts = nameFields
713
+ .map(f => record.Get(f.Name))
714
+ .filter(v => v != null && String(v).trim() !== '')
715
+ .map(v => String(v));
716
+ if (nameParts.length > 0) {
717
+ meta['Name'] = nameParts.join(' ');
718
+ }
719
+ // Store all IsNameField values individually for downstream resolution
720
+ for (const nf of nameFields) {
721
+ const val = record.Get(nf.Name);
722
+ if (val != null)
723
+ meta[nf.Name] = String(val);
724
+ }
725
+ // Store DefaultInView fields for rich display
726
+ for (const field of displayFields) {
727
+ if (!meta[field.Name]) { // Don't overwrite name fields
728
+ const val = record.Get(field.Name);
729
+ if (val != null) {
730
+ const str = String(val);
731
+ meta[field.Name] = str.length > 200 ? str.substring(0, 197) + '...' : str;
732
+ }
733
+ }
734
+ }
735
+ metadataMap.set(id, JSON.stringify(meta));
344
736
  }
345
- return dupeRun;
737
+ return metadataMap;
346
738
  }
347
- async LoadDuplicateRunByListID(listID) {
348
- const entity = await this.RunViewForSingleValue('MJ: Duplicate Runs', `SourceListID = '${listID.replace(/'/g, "''")}'`);
349
- if (!entity) {
350
- throw new Error(`No Duplicate Run found for List ${listID}`);
351
- }
352
- return entity;
739
+ FilterSelfMatches(duplicates, sourceKey) {
740
+ return duplicates.filter((d) => d.ToString() !== sourceKey.ToString());
353
741
  }
354
742
  // ─────────────────────────────────────────────
355
743
  // Run Detail & Match Persistence (Batched)
356
744
  // ─────────────────────────────────────────────
357
745
  /**
358
- * Create DuplicateRunDetail records for each item in the list, saving in parallel batches.
746
+ * Create DuplicateRunDetail records for a batch of record IDs.
359
747
  */
360
- async CreateRunDetailRecordsFromList(listID, duplicateRunID) {
361
- const viewResults = await this.RunView.RunView({
362
- EntityName: 'MJ: List Details',
363
- ExtraFilter: `ListID = '${listID.replace(/'/g, "''")}'`,
364
- ResultType: 'entity_object',
365
- }, this.CurrentUser);
366
- if (!viewResults.Success) {
367
- throw new Error(viewResults.ErrorMessage);
368
- }
369
- const listDetails = viewResults.Results;
748
+ async CreateRunDetailRecords(recordIDs, duplicateRunID, entityInfo, metadataMap) {
370
749
  const results = [];
371
- for (const batch of chunkArray(listDetails, SAVE_BATCH_SIZE)) {
372
- const batchResults = await Promise.all(batch.map(async (listDetail) => {
373
- const runDetail = await this.Metadata.GetEntityObject('MJ: Duplicate Run Details');
750
+ const pkFieldName = entityInfo.FirstPrimaryKey.Name;
751
+ for (const batch of chunkArray(recordIDs, SAVE_BATCH_SIZE)) {
752
+ const batchResults = await Promise.all(batch.map(async (recordID) => {
753
+ const runDetail = await this.Metadata.GetEntityObject('MJ: Duplicate Run Details', this.CurrentUser);
374
754
  runDetail.NewRecord();
375
755
  runDetail.DuplicateRunID = duplicateRunID;
376
- runDetail.RecordID = listDetail.RecordID;
756
+ // Store RecordID in standard MJ URL segment format (e.g., "ID|uuid")
757
+ runDetail.RecordID = `${pkFieldName}|${recordID}`;
377
758
  runDetail.MatchStatus = 'Pending';
378
759
  runDetail.MergeStatus = 'Pending';
760
+ runDetail.RecordMetadata = metadataMap?.get(recordID) ?? null;
379
761
  const success = await this.SaveEntity(runDetail);
380
762
  if (!success) {
381
763
  LogError("Failed to save MJDuplicateRunDetailEntity", undefined, runDetail.LatestResult);
@@ -397,9 +779,25 @@ export class DuplicateRecordDetector extends VectorBase {
397
779
  const results = [];
398
780
  let matchesFound = 0;
399
781
  for (const qr of queryResults) {
782
+ // Filter out inverse duplicates: if A→B was already persisted, skip B→A
783
+ const sourceId = qr.SourceKey.Values();
784
+ qr.Duplicates.Duplicates = qr.Duplicates.Duplicates.filter(dupe => {
785
+ const matchId = dupe.Values();
786
+ const pairKey = sourceId < matchId ? `${sourceId}::${matchId}` : `${matchId}::${sourceId}`;
787
+ if (this._seenPairs.has(pairKey)) {
788
+ return false; // Inverse already recorded
789
+ }
790
+ this._seenPairs.add(pairKey);
791
+ return true;
792
+ });
400
793
  results.push(qr.Duplicates);
401
794
  matchesFound += qr.Duplicates.Duplicates.length;
402
- const detail = duplicateRunDetails.find((d) => UUIDsEqual(d.RecordID, qr.SourceKey.Values()));
795
+ const sourceKey = qr.SourceKey;
796
+ const detail = duplicateRunDetails.find((d) => {
797
+ const detailKey = new CompositeKey();
798
+ detailKey.LoadFromConcatenatedString(d.RecordID);
799
+ return detailKey.Equals(sourceKey);
800
+ });
403
801
  if (detail) {
404
802
  const matchRecords = await this.CreateMatchRecordsForDetail(detail.ID, qr.Duplicates);
405
803
  qr.Duplicates.DuplicateRunDetailMatchRecordIDs = matchRecords.map((m) => m.ID);
@@ -423,15 +821,16 @@ export class DuplicateRecordDetector extends VectorBase {
423
821
  const matchRecords = [];
424
822
  for (const batch of chunkArray(duplicateResult.Duplicates, SAVE_BATCH_SIZE)) {
425
823
  const batchResults = await Promise.all(batch.map(async (dupe) => {
426
- const match = await this.Metadata.GetEntityObject('MJ: Duplicate Run Detail Matches');
824
+ const match = await this.Metadata.GetEntityObject('MJ: Duplicate Run Detail Matches', this.CurrentUser);
427
825
  match.NewRecord();
428
826
  match.DuplicateRunDetailID = duplicateRunDetailID;
429
- match.MatchRecordID = dupe.ToString();
827
+ match.MatchRecordID = dupe.ToURLSegment();
430
828
  match.MatchProbability = dupe.ProbabilityScore;
431
829
  match.MatchedAt = new Date();
432
830
  match.Action = '';
433
831
  match.ApprovalStatus = 'Pending';
434
832
  match.MergeStatus = 'Pending';
833
+ match.RecordMetadata = dupe.VectorMetadata ? JSON.stringify(dupe.VectorMetadata) : null;
435
834
  const success = await this.SaveEntity(match);
436
835
  return success ? match : null;
437
836
  }));
@@ -448,10 +847,11 @@ export class DuplicateRecordDetector extends VectorBase {
448
847
  /**
449
848
  * Automatically merge records that meet the absolute match threshold.
450
849
  */
451
- async ProcessAutoMerges(response, entityDocument) {
850
+ async ProcessAutoMerges(response, entityDocument, options = {}) {
851
+ const absoluteThreshold = options.AbsoluteMatchThreshold ?? entityDocument.AbsoluteMatchThreshold;
452
852
  for (const dupeResult of response.PotentialDuplicateResult) {
453
853
  for (const [index, dupe] of dupeResult.Duplicates.entries()) {
454
- if (dupe.ProbabilityScore < entityDocument.AbsoluteMatchThreshold) {
854
+ if (dupe.ProbabilityScore < absoluteThreshold) {
455
855
  continue;
456
856
  }
457
857
  const mergeParams = new RecordMergeRequest();
@@ -1 +1 @@
1
- {"version":3,"file":"duplicateRecordDetector.js","sourceRoot":"","sources":["../src/duplicateRecordDetector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"duplicateRecordDetector.js","sourceRoot":"","sources":["../src/duplicateRecordDetector.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/ai-vector-dupe",
3
3
  "type": "module",
4
- "version": "5.22.0",
4
+ "version": "5.24.0",
5
5
  "description": "MemberJunction: AI Vector/Entity Sync Package - Handles synchronization between Vector DB and MJ CDP Data",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -17,15 +17,15 @@
17
17
  "author": "MemberJunction.com",
18
18
  "license": "ISC",
19
19
  "dependencies": {
20
- "@memberjunction/ai": "5.22.0",
21
- "@memberjunction/ai-vectordb": "5.22.0",
22
- "@memberjunction/ai-vectors": "5.22.0",
23
- "@memberjunction/templates": "5.22.0",
24
- "@memberjunction/ai-vector-sync": "5.22.0",
25
- "@memberjunction/aiengine": "5.22.0",
26
- "@memberjunction/core": "5.22.0",
27
- "@memberjunction/global": "5.22.0",
28
- "@memberjunction/core-entities": "5.22.0",
20
+ "@memberjunction/ai": "5.24.0",
21
+ "@memberjunction/ai-vectordb": "5.24.0",
22
+ "@memberjunction/ai-vectors": "5.24.0",
23
+ "@memberjunction/templates": "5.24.0",
24
+ "@memberjunction/ai-vector-sync": "5.24.0",
25
+ "@memberjunction/aiengine": "5.24.0",
26
+ "@memberjunction/core": "5.24.0",
27
+ "@memberjunction/global": "5.24.0",
28
+ "@memberjunction/core-entities": "5.24.0",
29
29
  "dotenv": "^17.2.4"
30
30
  },
31
31
  "devDependencies": {