@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
|
|
149
|
+
### Thresholds
|
|
148
150
|
|
|
149
|
-
Thresholds
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
|
94
|
-
protected
|
|
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
|
|
230
|
+
* Create DuplicateRunDetail records for a batch of record IDs.
|
|
99
231
|
*/
|
|
100
|
-
protected
|
|
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":"AAAA
|
|
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
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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:
|
|
55
|
-
|
|
56
|
-
|
|
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:
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
|
94
|
-
this.reportProgress(options, 'Merging',
|
|
95
|
-
response
|
|
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: ${
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
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,
|
|
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
|
-
*
|
|
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
|
-
|
|
314
|
-
const
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
const
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
|
737
|
+
return metadataMap;
|
|
346
738
|
}
|
|
347
|
-
|
|
348
|
-
|
|
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
|
|
746
|
+
* Create DuplicateRunDetail records for a batch of record IDs.
|
|
359
747
|
*/
|
|
360
|
-
async
|
|
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
|
-
|
|
372
|
-
|
|
373
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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 <
|
|
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.
|
|
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.
|
|
21
|
-
"@memberjunction/ai-vectordb": "5.
|
|
22
|
-
"@memberjunction/ai-vectors": "5.
|
|
23
|
-
"@memberjunction/templates": "5.
|
|
24
|
-
"@memberjunction/ai-vector-sync": "5.
|
|
25
|
-
"@memberjunction/aiengine": "5.
|
|
26
|
-
"@memberjunction/core": "5.
|
|
27
|
-
"@memberjunction/global": "5.
|
|
28
|
-
"@memberjunction/core-entities": "5.
|
|
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": {
|