@memberjunction/ai-vector-dupe 5.22.0 → 5.23.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,19 @@ 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).
|
|
41
55
|
*
|
|
42
|
-
* Flow: validate
|
|
56
|
+
* Flow: validate -> vectorize -> init providers -> load/create run ->
|
|
57
|
+
* load record IDs -> batch(embed -> query -> persist) -> complete run -> auto-merge
|
|
43
58
|
*/
|
|
44
59
|
GetDuplicateRecords(params: PotentialDuplicateRequest, contextUser?: UserInfo): Promise<PotentialDuplicateResponse>;
|
|
45
60
|
/**
|
|
@@ -47,6 +62,28 @@ export declare class DuplicateRecordDetector extends VectorBase {
|
|
|
47
62
|
* Embeds the record and queries for matches directly.
|
|
48
63
|
*/
|
|
49
64
|
CheckSingleRecord(EntityDocumentID: string, RecordID: CompositeKey, Options?: DuplicateDetectionOptions, ContextUser?: UserInfo): Promise<PotentialDuplicateResult>;
|
|
65
|
+
/**
|
|
66
|
+
* Result from processing a single batch of records.
|
|
67
|
+
*/
|
|
68
|
+
private ProcessBatch;
|
|
69
|
+
/**
|
|
70
|
+
* Load the IDs of records to check, using the appropriate strategy based on the request.
|
|
71
|
+
* Returns an array of primary key value strings.
|
|
72
|
+
*/
|
|
73
|
+
protected LoadRecordIDsToCheck(params: PotentialDuplicateRequest, entityInfo: EntityInfo): Promise<string[]>;
|
|
74
|
+
/**
|
|
75
|
+
* Load record IDs from a list's detail records.
|
|
76
|
+
*/
|
|
77
|
+
protected LoadRecordIDsFromList(listID: string): Promise<string[]>;
|
|
78
|
+
/**
|
|
79
|
+
* Load record IDs by running a saved view.
|
|
80
|
+
*/
|
|
81
|
+
protected LoadRecordIDsFromView(viewID: string, entityInfo: EntityInfo): Promise<string[]>;
|
|
82
|
+
/**
|
|
83
|
+
* Load record IDs directly from the entity, optionally filtered.
|
|
84
|
+
* Uses Fields: ['ID'] and ResultType: 'simple' for efficiency.
|
|
85
|
+
*/
|
|
86
|
+
protected LoadRecordIDsFromEntity(entityInfo: EntityInfo, extraFilter?: string): Promise<string[]>;
|
|
50
87
|
/**
|
|
51
88
|
* Validate and return an entity document, or null if not found.
|
|
52
89
|
*/
|
|
@@ -54,11 +91,40 @@ export declare class DuplicateRecordDetector extends VectorBase {
|
|
|
54
91
|
/**
|
|
55
92
|
* Initialize embedding and vector DB providers via ClassFactory.
|
|
56
93
|
*/
|
|
57
|
-
protected InitializeProviders(entityDocument: MJEntityDocumentEntity): void
|
|
94
|
+
protected InitializeProviders(entityDocument: MJEntityDocumentEntity): Promise<void>;
|
|
58
95
|
/**
|
|
59
96
|
* Run vectorization for the entity document's records.
|
|
60
97
|
*/
|
|
61
98
|
protected VectorizeSourceRecords(entityDocument: MJEntityDocumentEntity, contextUser: UserInfo): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Read the maxConcurrentRequests from the VectorDatabase entity's Configuration column,
|
|
101
|
+
* falling back to DEFAULT_QUERY_CONCURRENCY if not set.
|
|
102
|
+
*/
|
|
103
|
+
protected GetQueryConcurrency(entityDocument: MJEntityDocumentEntity): number;
|
|
104
|
+
/**
|
|
105
|
+
* Resolve an existing DuplicateRun or create a new one.
|
|
106
|
+
* Supports both list-based and list-free operation.
|
|
107
|
+
*/
|
|
108
|
+
protected ResolveOrCreateDuplicateRun(params: PotentialDuplicateRequest, entityDocument: MJEntityDocumentEntity, options: DuplicateDetectionOptions): Promise<MJDuplicateRunEntity>;
|
|
109
|
+
/**
|
|
110
|
+
* Create a new DuplicateRun record.
|
|
111
|
+
*/
|
|
112
|
+
protected CreateDuplicateRun(entityDocument: MJEntityDocumentEntity, listID?: string): Promise<MJDuplicateRunEntity>;
|
|
113
|
+
protected LoadDuplicateRun(duplicateRunID: string): Promise<MJDuplicateRunEntity>;
|
|
114
|
+
/**
|
|
115
|
+
* Try to find an existing DuplicateRun for a given ListID. Returns null if none found.
|
|
116
|
+
*/
|
|
117
|
+
protected FindDuplicateRunByListID(listID: string): Promise<MJDuplicateRunEntity | null>;
|
|
118
|
+
/**
|
|
119
|
+
* Load full entity objects for a batch of composite keys.
|
|
120
|
+
*/
|
|
121
|
+
protected LoadRecordsByKeys(compositeKeys: CompositeKey[], entityInfo: EntityInfo): Promise<BaseEntity[]>;
|
|
122
|
+
/**
|
|
123
|
+
* Load records from an entity that are members of the specified list.
|
|
124
|
+
* Kept for backward compatibility.
|
|
125
|
+
*/
|
|
126
|
+
protected LoadRecordsByListID(listID: string, entityID: string): Promise<BaseEntity[]>;
|
|
127
|
+
protected LoadListEntity(listID: string): Promise<MJListEntity>;
|
|
62
128
|
/**
|
|
63
129
|
* Generate human-readable template text for each record using the entity document template.
|
|
64
130
|
*
|
|
@@ -74,7 +140,7 @@ export declare class DuplicateRecordDetector extends VectorBase {
|
|
|
74
140
|
* Query the vector DB for duplicates of each record, with concurrency control.
|
|
75
141
|
* Supports hybrid search and RRF fusion when the vector DB supports it.
|
|
76
142
|
*/
|
|
77
|
-
protected QueryDuplicatesForRecords(records: BaseEntity[], vectors: number[][], templateTexts: string[], entityDocument: MJEntityDocumentEntity, topK: number, options: DuplicateDetectionOptions): Promise<RecordQueryResult[]>;
|
|
143
|
+
protected QueryDuplicatesForRecords(records: BaseEntity[], vectors: number[][], templateTexts: string[], entityDocument: MJEntityDocumentEntity, topK: number, options: DuplicateDetectionOptions, concurrency: number): Promise<RecordQueryResult[]>;
|
|
78
144
|
/**
|
|
79
145
|
* Execute a vector query — uses hybrid search with RRF when the provider supports it.
|
|
80
146
|
*/
|
|
@@ -86,18 +152,16 @@ export declare class DuplicateRecordDetector extends VectorBase {
|
|
|
86
152
|
/**
|
|
87
153
|
* Filter out self-matches where the candidate is the same record as the source.
|
|
88
154
|
*/
|
|
89
|
-
protected FilterSelfMatches(duplicates: PotentialDuplicate[], sourceKey: CompositeKey): PotentialDuplicate[];
|
|
90
155
|
/**
|
|
91
|
-
*
|
|
156
|
+
* Build a map of recordID → JSON metadata string from loaded BaseEntity records.
|
|
157
|
+
* Extracts the entity's name field and a few key display fields for rich UI rendering.
|
|
92
158
|
*/
|
|
93
|
-
protected
|
|
94
|
-
protected
|
|
95
|
-
protected LoadDuplicateRun(duplicateRunID: string): Promise<MJDuplicateRunEntity>;
|
|
96
|
-
protected LoadDuplicateRunByListID(listID: string): Promise<MJDuplicateRunEntity>;
|
|
159
|
+
protected buildSourceMetadataMap(records: BaseEntity[], entityInfo: EntityInfo): Map<string, string>;
|
|
160
|
+
protected FilterSelfMatches(duplicates: PotentialDuplicate[], sourceKey: CompositeKey): PotentialDuplicate[];
|
|
97
161
|
/**
|
|
98
|
-
* Create DuplicateRunDetail records for
|
|
162
|
+
* Create DuplicateRunDetail records for a batch of record IDs.
|
|
99
163
|
*/
|
|
100
|
-
protected
|
|
164
|
+
protected CreateRunDetailRecords(recordIDs: string[], duplicateRunID: string, entityInfo: EntityInfo, metadataMap?: Map<string, string>): Promise<MJDuplicateRunDetailEntity[]>;
|
|
101
165
|
/**
|
|
102
166
|
* Persist match results and update run detail records.
|
|
103
167
|
*/
|
|
@@ -109,7 +173,7 @@ export declare class DuplicateRecordDetector extends VectorBase {
|
|
|
109
173
|
/**
|
|
110
174
|
* Automatically merge records that meet the absolute match threshold.
|
|
111
175
|
*/
|
|
112
|
-
protected ProcessAutoMerges(response: PotentialDuplicateResponse, entityDocument: MJEntityDocumentEntity): Promise<void>;
|
|
176
|
+
protected ProcessAutoMerges(response: PotentialDuplicateResponse, entityDocument: MJEntityDocumentEntity, options?: DuplicateDetectionOptions): Promise<void>;
|
|
113
177
|
/**
|
|
114
178
|
* Update a match record's status after a successful merge.
|
|
115
179
|
*/
|
|
@@ -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,12 +5,17 @@
|
|
|
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, RunView, } from "@memberjunction/core";
|
|
14
19
|
import { VectorDBBase } from "@memberjunction/ai-vectordb";
|
|
15
20
|
import { MJGlobal, UUIDsEqual } from "@memberjunction/global";
|
|
16
21
|
import { VectorBase } from "@memberjunction/ai-vectors";
|
|
@@ -19,7 +24,9 @@ import { TemplateEngineServer } from "@memberjunction/templates";
|
|
|
19
24
|
/** Default number of nearest neighbors to retrieve per record */
|
|
20
25
|
const DEFAULT_TOP_K = 5;
|
|
21
26
|
/** Default concurrency limit for parallel vector queries */
|
|
22
|
-
const
|
|
27
|
+
const DEFAULT_QUERY_CONCURRENCY = 10;
|
|
28
|
+
/** Default batch size for loading records and parallel database saves */
|
|
29
|
+
const DEFAULT_BATCH_SIZE = 500;
|
|
23
30
|
/** Default batch size for parallel database saves */
|
|
24
31
|
const SAVE_BATCH_SIZE = 20;
|
|
25
32
|
/**
|
|
@@ -27,19 +34,31 @@ const SAVE_BATCH_SIZE = 20;
|
|
|
27
34
|
*
|
|
28
35
|
* Supports:
|
|
29
36
|
* - List-based batch detection (getDuplicateRecords)
|
|
37
|
+
* - View/filter/full-entity batch detection (vector-first approach)
|
|
30
38
|
* - Single-record duplicate check (CheckSingleRecord)
|
|
31
39
|
* - Hybrid search via RRF when vector DB supports it
|
|
32
40
|
* - Optional post-retrieval reranking via MJ's BaseReranker
|
|
33
41
|
* - Configurable topK, thresholds, and progress reporting
|
|
34
42
|
*/
|
|
35
43
|
export class DuplicateRecordDetector extends VectorBase {
|
|
44
|
+
constructor() {
|
|
45
|
+
super(...arguments);
|
|
46
|
+
/**
|
|
47
|
+
* Tracks already-seen source↔match pairs across the entire run to suppress inverse duplicates.
|
|
48
|
+
* If A→B is persisted, B→A is skipped. Key format: "smallerID::largerID" for consistent ordering.
|
|
49
|
+
*/
|
|
50
|
+
this._seenPairs = new Set();
|
|
51
|
+
}
|
|
36
52
|
/**
|
|
37
|
-
* 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).
|
|
38
55
|
*
|
|
39
|
-
* Flow: validate
|
|
56
|
+
* Flow: validate -> vectorize -> init providers -> load/create run ->
|
|
57
|
+
* load record IDs -> batch(embed -> query -> persist) -> complete run -> auto-merge
|
|
40
58
|
*/
|
|
41
59
|
async GetDuplicateRecords(params, contextUser) {
|
|
42
60
|
this.CurrentUser = contextUser;
|
|
61
|
+
this._seenPairs.clear(); // Reset for each new run
|
|
43
62
|
const options = params.Options ?? {};
|
|
44
63
|
const startTime = Date.now();
|
|
45
64
|
const response = new PotentialDuplicateResponse();
|
|
@@ -51,51 +70,53 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
51
70
|
response.Status = 'Error';
|
|
52
71
|
return response;
|
|
53
72
|
}
|
|
54
|
-
// Step 2:
|
|
55
|
-
|
|
56
|
-
|
|
73
|
+
// Step 2: Optionally vectorize source records (default: skip — vectors should already exist from sync)
|
|
74
|
+
if (options.Revectorize) {
|
|
75
|
+
this.reportProgress(options, 'Vectorizing', 0, 0, 0, startTime);
|
|
76
|
+
await this.VectorizeSourceRecords(entityDocument, contextUser);
|
|
77
|
+
}
|
|
57
78
|
// 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}`;
|
|
79
|
+
await this.InitializeProviders(entityDocument);
|
|
80
|
+
// Step 4: Create or load DuplicateRun
|
|
81
|
+
const duplicateRun = await this.ResolveOrCreateDuplicateRun(params, entityDocument, options);
|
|
82
|
+
// Step 5: Load record IDs to check (batch-friendly — only IDs)
|
|
83
|
+
this.reportProgress(options, 'Loading', 0, 0, 0, startTime);
|
|
84
|
+
const entityInfo = this.Metadata.EntityByID(entityDocument.EntityID);
|
|
85
|
+
if (!entityInfo) {
|
|
86
|
+
response.ErrorMessage = `Entity not found for ID ${entityDocument.EntityID}`;
|
|
71
87
|
response.Status = 'Error';
|
|
72
88
|
return response;
|
|
73
89
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
90
|
+
const recordIDs = await this.LoadRecordIDsToCheck(params, entityInfo);
|
|
91
|
+
if (recordIDs.length === 0) {
|
|
92
|
+
response.ErrorMessage = 'No records found to check for duplicates';
|
|
93
|
+
response.Status = 'Error';
|
|
94
|
+
return response;
|
|
95
|
+
}
|
|
96
|
+
// Step 6: Process in batches
|
|
97
|
+
const batchSize = DEFAULT_BATCH_SIZE;
|
|
98
|
+
const concurrency = this.GetQueryConcurrency(entityDocument);
|
|
81
99
|
const topK = options.TopK ?? DEFAULT_TOP_K;
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
100
|
+
const templateParser = EntityDocumentTemplateParser.CreateInstance();
|
|
101
|
+
let totalMatchesFound = 0;
|
|
102
|
+
for (let offset = 0; offset < recordIDs.length; offset += batchSize) {
|
|
103
|
+
const batchIDs = recordIDs.slice(offset, offset + batchSize);
|
|
104
|
+
const batchResults = await this.ProcessBatch(batchIDs, entityInfo, entityDocument, templateParser, duplicateRun.ID, topK, concurrency, options, startTime, recordIDs.length, offset, totalMatchesFound, contextUser);
|
|
105
|
+
response.PotentialDuplicateResult.push(...batchResults.Results);
|
|
106
|
+
totalMatchesFound += batchResults.MatchesFound;
|
|
107
|
+
}
|
|
108
|
+
// Step 7: Complete the duplicate run
|
|
87
109
|
duplicateRun.ProcessingStatus = 'Complete';
|
|
88
110
|
duplicateRun.EndedAt = new Date();
|
|
89
111
|
const runSaveSuccess = await this.SaveEntity(duplicateRun);
|
|
90
112
|
if (!runSaveSuccess) {
|
|
91
113
|
throw new Error(`Failed to update Duplicate Run record ${duplicateRun.ID}`);
|
|
92
114
|
}
|
|
93
|
-
// Step
|
|
94
|
-
this.reportProgress(options, 'Merging',
|
|
95
|
-
response
|
|
96
|
-
await this.ProcessAutoMerges(response, entityDocument);
|
|
115
|
+
// Step 8: Auto-merge high-confidence matches
|
|
116
|
+
this.reportProgress(options, 'Merging', recordIDs.length, recordIDs.length, totalMatchesFound, startTime);
|
|
117
|
+
await this.ProcessAutoMerges(response, entityDocument, options);
|
|
97
118
|
response.Status = 'Success';
|
|
98
|
-
LogStatus(`Duplicate detection complete: ${
|
|
119
|
+
LogStatus(`Duplicate detection complete: ${recordIDs.length} records checked, ${totalMatchesFound} matches found`);
|
|
99
120
|
return response;
|
|
100
121
|
}
|
|
101
122
|
/**
|
|
@@ -109,7 +130,7 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
109
130
|
if (!entityDocument) {
|
|
110
131
|
throw new Error(`No active Entity Document found for ID ${EntityDocumentID}`);
|
|
111
132
|
}
|
|
112
|
-
this.InitializeProviders(entityDocument);
|
|
133
|
+
await this.InitializeProviders(entityDocument);
|
|
113
134
|
// Load the single record
|
|
114
135
|
const entityInfo = this.Metadata.EntityByID(entityDocument.EntityID);
|
|
115
136
|
if (!entityInfo) {
|
|
@@ -128,10 +149,116 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
128
149
|
const templateTexts = await this.GenerateTemplateTexts(templateParser, entityDocument, [record], ContextUser);
|
|
129
150
|
const embedResult = await this.embedding.EmbedTexts({ texts: templateTexts, model: null });
|
|
130
151
|
const topK = options.TopK ?? DEFAULT_TOP_K;
|
|
131
|
-
const queryResults = await this.QueryDuplicatesForRecords([record], embedResult.vectors, templateTexts, entityDocument, topK, options);
|
|
152
|
+
const queryResults = await this.QueryDuplicatesForRecords([record], embedResult.vectors, templateTexts, entityDocument, topK, options, this.GetQueryConcurrency(entityDocument));
|
|
132
153
|
return queryResults.length > 0 ? queryResults[0].Duplicates : new PotentialDuplicateResult();
|
|
133
154
|
}
|
|
134
155
|
// ─────────────────────────────────────────────
|
|
156
|
+
// Batch Processing
|
|
157
|
+
// ─────────────────────────────────────────────
|
|
158
|
+
/**
|
|
159
|
+
* Result from processing a single batch of records.
|
|
160
|
+
*/
|
|
161
|
+
async ProcessBatch(batchIDs, entityInfo, entityDocument, templateParser, duplicateRunID, topK, concurrency, options, startTime, totalRecords, processedSoFar, matchesSoFar, contextUser) {
|
|
162
|
+
// 6a: Load full record data for this batch (needed for template rendering)
|
|
163
|
+
const compositeKeys = batchIDs.map(id => {
|
|
164
|
+
const ck = new CompositeKey();
|
|
165
|
+
ck.KeyValuePairs.push({ FieldName: entityInfo.FirstPrimaryKey.Name, Value: id });
|
|
166
|
+
return ck;
|
|
167
|
+
});
|
|
168
|
+
const records = await this.LoadRecordsByKeys(compositeKeys, entityInfo);
|
|
169
|
+
if (records.length === 0) {
|
|
170
|
+
return { Results: [], MatchesFound: 0 };
|
|
171
|
+
}
|
|
172
|
+
// 6b: Build source record metadata map for rich UI display
|
|
173
|
+
const sourceMetadataMap = this.buildSourceMetadataMap(records, entityInfo);
|
|
174
|
+
// 6c: Create DuplicateRunDetail records for this batch
|
|
175
|
+
const duplicateRunDetails = await this.CreateRunDetailRecords(batchIDs, duplicateRunID, entityInfo, sourceMetadataMap);
|
|
176
|
+
// 6c: Generate template texts and embed
|
|
177
|
+
this.reportProgress(options, 'Embedding', totalRecords, processedSoFar, matchesSoFar, startTime);
|
|
178
|
+
const templateTexts = await this.GenerateTemplateTexts(templateParser, entityDocument, records, contextUser);
|
|
179
|
+
const embedResult = await this.embedding.EmbedTexts({ texts: templateTexts, model: null });
|
|
180
|
+
// 6d: Query vector DB for each record with concurrency control
|
|
181
|
+
this.reportProgress(options, 'Querying', totalRecords, processedSoFar, matchesSoFar, startTime);
|
|
182
|
+
const queryResults = await this.QueryDuplicatesForRecords(records, embedResult.vectors, templateTexts, entityDocument, topK, options, concurrency);
|
|
183
|
+
// 6e: Persist match results and update run details
|
|
184
|
+
this.reportProgress(options, 'Matching', totalRecords, processedSoFar + records.length, matchesSoFar, startTime);
|
|
185
|
+
const results = await this.PersistMatchResults(queryResults, duplicateRunDetails, entityDocument, options, startTime);
|
|
186
|
+
const batchMatches = results.reduce((sum, r) => sum + r.Duplicates.length, 0);
|
|
187
|
+
return { Results: results, MatchesFound: batchMatches };
|
|
188
|
+
}
|
|
189
|
+
// ─────────────────────────────────────────────
|
|
190
|
+
// Record ID Loading (multiple strategies)
|
|
191
|
+
// ─────────────────────────────────────────────
|
|
192
|
+
/**
|
|
193
|
+
* Load the IDs of records to check, using the appropriate strategy based on the request.
|
|
194
|
+
* Returns an array of primary key value strings.
|
|
195
|
+
*/
|
|
196
|
+
async LoadRecordIDsToCheck(params, entityInfo) {
|
|
197
|
+
if (params.ListID) {
|
|
198
|
+
return this.LoadRecordIDsFromList(params.ListID);
|
|
199
|
+
}
|
|
200
|
+
if (params.ViewID) {
|
|
201
|
+
return this.LoadRecordIDsFromView(params.ViewID, entityInfo);
|
|
202
|
+
}
|
|
203
|
+
// ExtraFilter or all records
|
|
204
|
+
return this.LoadRecordIDsFromEntity(entityInfo, params.ExtraFilter);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Load record IDs from a list's detail records.
|
|
208
|
+
*/
|
|
209
|
+
async LoadRecordIDsFromList(listID) {
|
|
210
|
+
const sanitizedListID = listID.replace(/'/g, "''");
|
|
211
|
+
const viewResults = await this.RunView.RunView({
|
|
212
|
+
EntityName: 'MJ: List Details',
|
|
213
|
+
ExtraFilter: `ListID = '${sanitizedListID}'`,
|
|
214
|
+
Fields: ['RecordID'],
|
|
215
|
+
ResultType: 'simple',
|
|
216
|
+
}, this.CurrentUser);
|
|
217
|
+
if (!viewResults.Success) {
|
|
218
|
+
throw new Error(`Failed to load list details: ${viewResults.ErrorMessage}`);
|
|
219
|
+
}
|
|
220
|
+
return viewResults.Results.map(r => r.RecordID);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Load record IDs by running a saved view.
|
|
224
|
+
*/
|
|
225
|
+
async LoadRecordIDsFromView(viewID, entityInfo) {
|
|
226
|
+
const pkField = entityInfo.FirstPrimaryKey.Name;
|
|
227
|
+
const sanitizedViewID = viewID.replace(/'/g, "''");
|
|
228
|
+
// Load the view definition to get its filter
|
|
229
|
+
const viewEntity = await this.RunViewForSingleValue('Views', `ID = '${sanitizedViewID}'`);
|
|
230
|
+
if (!viewEntity) {
|
|
231
|
+
throw new Error(`View not found: ${viewID}`);
|
|
232
|
+
}
|
|
233
|
+
// Run the entity with the view's filter to get IDs
|
|
234
|
+
const viewResults = await this.RunView.RunView({
|
|
235
|
+
ViewID: viewID,
|
|
236
|
+
Fields: [pkField],
|
|
237
|
+
ResultType: 'simple',
|
|
238
|
+
}, this.CurrentUser);
|
|
239
|
+
if (!viewResults.Success) {
|
|
240
|
+
throw new Error(`Failed to run view ${viewID}: ${viewResults.ErrorMessage}`);
|
|
241
|
+
}
|
|
242
|
+
return viewResults.Results.map(r => r[pkField]);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Load record IDs directly from the entity, optionally filtered.
|
|
246
|
+
* Uses Fields: ['ID'] and ResultType: 'simple' for efficiency.
|
|
247
|
+
*/
|
|
248
|
+
async LoadRecordIDsFromEntity(entityInfo, extraFilter) {
|
|
249
|
+
const pkField = entityInfo.FirstPrimaryKey.Name;
|
|
250
|
+
const viewResults = await this.RunView.RunView({
|
|
251
|
+
EntityName: entityInfo.Name,
|
|
252
|
+
ExtraFilter: extraFilter,
|
|
253
|
+
Fields: [pkField],
|
|
254
|
+
ResultType: 'simple',
|
|
255
|
+
}, this.CurrentUser);
|
|
256
|
+
if (!viewResults.Success) {
|
|
257
|
+
throw new Error(`Failed to load record IDs from ${entityInfo.Name}: ${viewResults.ErrorMessage}`);
|
|
258
|
+
}
|
|
259
|
+
return viewResults.Results.map(r => r[pkField]);
|
|
260
|
+
}
|
|
261
|
+
// ─────────────────────────────────────────────
|
|
135
262
|
// Validation & Setup
|
|
136
263
|
// ─────────────────────────────────────────────
|
|
137
264
|
/**
|
|
@@ -145,7 +272,7 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
145
272
|
/**
|
|
146
273
|
* Initialize embedding and vector DB providers via ClassFactory.
|
|
147
274
|
*/
|
|
148
|
-
InitializeProviders(entityDocument) {
|
|
275
|
+
async InitializeProviders(entityDocument) {
|
|
149
276
|
const aiModel = this.GetAIModel(entityDocument.AIModelID);
|
|
150
277
|
const vectorDB = this.GetVectorDatabase(entityDocument.VectorDatabaseID);
|
|
151
278
|
const embeddingAPIKey = GetAIAPIKey(aiModel.DriverClass);
|
|
@@ -164,7 +291,25 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
164
291
|
if (!this.vectorDB) {
|
|
165
292
|
throw new Error(`Failed to create VectorDB instance for ${vectorDB.ClassKey}`);
|
|
166
293
|
}
|
|
167
|
-
|
|
294
|
+
// Resolve the vector index name from the entity document's VectorIndexID
|
|
295
|
+
// This is the actual Pinecone/pgvector/Qdrant index name needed for QueryIndex calls
|
|
296
|
+
if (entityDocument.VectorIndexID) {
|
|
297
|
+
const rv = new RunView();
|
|
298
|
+
const indexResult = await rv.RunView({
|
|
299
|
+
EntityName: 'MJ: Vector Indexes',
|
|
300
|
+
ExtraFilter: `ID='${entityDocument.VectorIndexID}'`,
|
|
301
|
+
Fields: ['Name'],
|
|
302
|
+
ResultType: 'simple',
|
|
303
|
+
MaxRows: 1
|
|
304
|
+
}, this.CurrentUser);
|
|
305
|
+
if (indexResult.Success && indexResult.Results.length > 0) {
|
|
306
|
+
this.indexName = indexResult.Results[0].Name;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (!this.indexName) {
|
|
310
|
+
throw new Error(`No vector index found for entity document "${entityDocument.Name}". Ensure VectorIndexID is set on the entity document.`);
|
|
311
|
+
}
|
|
312
|
+
LogStatus(`Providers initialized: AI Model=${aiModel.DriverClass}, VectorDB=${vectorDB.ClassKey}, Index=${this.indexName}`);
|
|
168
313
|
}
|
|
169
314
|
/**
|
|
170
315
|
* Run vectorization for the entity document's records.
|
|
@@ -182,6 +327,131 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
182
327
|
LogStatus(`Vectorizing entity records for document ${entityDocument.Name}`);
|
|
183
328
|
await vectorizer.VectorizeEntity(request, contextUser);
|
|
184
329
|
}
|
|
330
|
+
/**
|
|
331
|
+
* Read the maxConcurrentRequests from the VectorDatabase entity's Configuration column,
|
|
332
|
+
* falling back to DEFAULT_QUERY_CONCURRENCY if not set.
|
|
333
|
+
*/
|
|
334
|
+
GetQueryConcurrency(entityDocument) {
|
|
335
|
+
const vectorDBEntity = this.GetVectorDatabase(entityDocument.VectorDatabaseID);
|
|
336
|
+
if (vectorDBEntity.Configuration) {
|
|
337
|
+
try {
|
|
338
|
+
const config = JSON.parse(vectorDBEntity.Configuration);
|
|
339
|
+
if (config.throughput?.maxConcurrentRequests != null) {
|
|
340
|
+
return config.throughput.maxConcurrentRequests;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
// Invalid JSON in Configuration — fall through to default
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return DEFAULT_QUERY_CONCURRENCY;
|
|
348
|
+
}
|
|
349
|
+
// ─────────────────────────────────────────────
|
|
350
|
+
// DuplicateRun Management
|
|
351
|
+
// ─────────────────────────────────────────────
|
|
352
|
+
/**
|
|
353
|
+
* Resolve an existing DuplicateRun or create a new one.
|
|
354
|
+
* Supports both list-based and list-free operation.
|
|
355
|
+
*/
|
|
356
|
+
async ResolveOrCreateDuplicateRun(params, entityDocument, options) {
|
|
357
|
+
// If a specific run ID was provided, load it
|
|
358
|
+
if (options.DuplicateRunID) {
|
|
359
|
+
return this.LoadDuplicateRun(options.DuplicateRunID);
|
|
360
|
+
}
|
|
361
|
+
// If a ListID is provided, try to find an existing run for that list
|
|
362
|
+
if (params.ListID) {
|
|
363
|
+
const existing = await this.FindDuplicateRunByListID(params.ListID);
|
|
364
|
+
if (existing) {
|
|
365
|
+
return existing;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// Create a new DuplicateRun
|
|
369
|
+
return this.CreateDuplicateRun(entityDocument, params.ListID);
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Create a new DuplicateRun record.
|
|
373
|
+
*/
|
|
374
|
+
async CreateDuplicateRun(entityDocument, listID) {
|
|
375
|
+
const dupeRun = await this.Metadata.GetEntityObject('MJ: Duplicate Runs', this.CurrentUser);
|
|
376
|
+
dupeRun.NewRecord();
|
|
377
|
+
dupeRun.EntityID = entityDocument.EntityID;
|
|
378
|
+
dupeRun.StartedByUserID = this.CurrentUser?.ID;
|
|
379
|
+
dupeRun.StartedAt = new Date();
|
|
380
|
+
dupeRun.ProcessingStatus = 'In Progress';
|
|
381
|
+
dupeRun.ApprovalStatus = 'Pending';
|
|
382
|
+
if (listID) {
|
|
383
|
+
dupeRun.SourceListID = listID;
|
|
384
|
+
}
|
|
385
|
+
const success = await this.SaveEntity(dupeRun);
|
|
386
|
+
if (!success) {
|
|
387
|
+
throw new Error('Failed to create Duplicate Run record');
|
|
388
|
+
}
|
|
389
|
+
return dupeRun;
|
|
390
|
+
}
|
|
391
|
+
async LoadDuplicateRun(duplicateRunID) {
|
|
392
|
+
const dupeRun = await this.Metadata.GetEntityObject('MJ: Duplicate Runs', this.CurrentUser);
|
|
393
|
+
dupeRun.ContextCurrentUser = this.CurrentUser;
|
|
394
|
+
const success = await dupeRun.Load(duplicateRunID);
|
|
395
|
+
if (!success) {
|
|
396
|
+
throw new Error(`Failed to load Duplicate Run record ${duplicateRunID}`);
|
|
397
|
+
}
|
|
398
|
+
return dupeRun;
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Try to find an existing DuplicateRun for a given ListID. Returns null if none found.
|
|
402
|
+
*/
|
|
403
|
+
async FindDuplicateRunByListID(listID) {
|
|
404
|
+
return this.RunViewForSingleValue('MJ: Duplicate Runs', `SourceListID = '${listID.replace(/'/g, "''")}'`);
|
|
405
|
+
}
|
|
406
|
+
// ─────────────────────────────────────────────
|
|
407
|
+
// Entity Loading
|
|
408
|
+
// ─────────────────────────────────────────────
|
|
409
|
+
/**
|
|
410
|
+
* Load full entity objects for a batch of composite keys.
|
|
411
|
+
*/
|
|
412
|
+
async LoadRecordsByKeys(compositeKeys, entityInfo) {
|
|
413
|
+
if (compositeKeys.length === 0) {
|
|
414
|
+
return [];
|
|
415
|
+
}
|
|
416
|
+
const rvResult = await this.RunView.RunView({
|
|
417
|
+
EntityName: entityInfo.Name,
|
|
418
|
+
ExtraFilter: this.BuildExtraFilter(compositeKeys),
|
|
419
|
+
ResultType: 'entity_object',
|
|
420
|
+
}, this.CurrentUser);
|
|
421
|
+
if (!rvResult.Success) {
|
|
422
|
+
throw new Error(rvResult.ErrorMessage);
|
|
423
|
+
}
|
|
424
|
+
return rvResult.Results;
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Load records from an entity that are members of the specified list.
|
|
428
|
+
* Kept for backward compatibility.
|
|
429
|
+
*/
|
|
430
|
+
async LoadRecordsByListID(listID, entityID) {
|
|
431
|
+
const entityInfo = this.Metadata.EntityByID(entityID);
|
|
432
|
+
if (!entityInfo) {
|
|
433
|
+
throw new Error(`Entity not found for ID ${entityID}`);
|
|
434
|
+
}
|
|
435
|
+
const sanitizedListID = listID.replace(/'/g, "''");
|
|
436
|
+
const rvResult = await this.RunView.RunView({
|
|
437
|
+
EntityName: entityInfo.Name,
|
|
438
|
+
ExtraFilter: `ID IN (SELECT RecordID FROM __mj.vwListDetails WHERE ListID = '${sanitizedListID}')`,
|
|
439
|
+
ResultType: 'entity_object',
|
|
440
|
+
}, this.CurrentUser);
|
|
441
|
+
if (!rvResult.Success) {
|
|
442
|
+
throw new Error(rvResult.ErrorMessage);
|
|
443
|
+
}
|
|
444
|
+
return rvResult.Results;
|
|
445
|
+
}
|
|
446
|
+
async LoadListEntity(listID) {
|
|
447
|
+
const list = await this.Metadata.GetEntityObject('MJ: Lists');
|
|
448
|
+
list.ContextCurrentUser = this.CurrentUser;
|
|
449
|
+
const success = await list.Load(listID);
|
|
450
|
+
if (!success) {
|
|
451
|
+
throw new Error(`Failed to load List record ${listID}`);
|
|
452
|
+
}
|
|
453
|
+
return list;
|
|
454
|
+
}
|
|
185
455
|
// ─────────────────────────────────────────────
|
|
186
456
|
// Template Generation & Embedding
|
|
187
457
|
// ─────────────────────────────────────────────
|
|
@@ -232,7 +502,7 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
232
502
|
* Query the vector DB for duplicates of each record, with concurrency control.
|
|
233
503
|
* Supports hybrid search and RRF fusion when the vector DB supports it.
|
|
234
504
|
*/
|
|
235
|
-
async QueryDuplicatesForRecords(records, vectors, templateTexts, entityDocument, topK, options) {
|
|
505
|
+
async QueryDuplicatesForRecords(records, vectors, templateTexts, entityDocument, topK, options, concurrency) {
|
|
236
506
|
const tasks = records.map((record, index) => async () => {
|
|
237
507
|
const compositeKey = record.PrimaryKey;
|
|
238
508
|
const vector = vectors[index];
|
|
@@ -247,12 +517,13 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
247
517
|
}
|
|
248
518
|
const dupeResult = this.ParseVectorMatches(queryResponse, compositeKey);
|
|
249
519
|
dupeResult.Duplicates = this.FilterSelfMatches(dupeResult.Duplicates, compositeKey);
|
|
250
|
-
|
|
520
|
+
const potentialThreshold = options.PotentialMatchThreshold ?? entityDocument.PotentialMatchThreshold;
|
|
521
|
+
dupeResult.Duplicates = dupeResult.Duplicates.filter((d) => d.ProbabilityScore >= potentialThreshold);
|
|
251
522
|
dupeResult.EntityID = entityDocument.EntityID;
|
|
252
523
|
dupeResult.RecordCompositeKey = compositeKey;
|
|
253
524
|
return { SourceKey: compositeKey, TemplateText: templateText, Duplicates: dupeResult };
|
|
254
525
|
});
|
|
255
|
-
return RunWithConcurrency(tasks,
|
|
526
|
+
return RunWithConcurrency(tasks, concurrency);
|
|
256
527
|
}
|
|
257
528
|
/**
|
|
258
529
|
* Execute a vector query — uses hybrid search with RRF when the provider supports it.
|
|
@@ -270,6 +541,7 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
270
541
|
});
|
|
271
542
|
}
|
|
272
543
|
return this.vectorDB.QueryIndex({
|
|
544
|
+
id: this.indexName,
|
|
273
545
|
vector,
|
|
274
546
|
topK,
|
|
275
547
|
includeMetadata: true,
|
|
@@ -294,6 +566,8 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
294
566
|
const duplicate = new PotentialDuplicate();
|
|
295
567
|
duplicate.LoadFromConcatenatedString(match.metadata.RecordID);
|
|
296
568
|
duplicate.ProbabilityScore = match.score;
|
|
569
|
+
// Capture the full vector metadata for rich UI display
|
|
570
|
+
duplicate.VectorMetadata = { ...match.metadata };
|
|
297
571
|
result.Duplicates.push(duplicate);
|
|
298
572
|
}
|
|
299
573
|
return result;
|
|
@@ -301,81 +575,65 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
301
575
|
/**
|
|
302
576
|
* Filter out self-matches where the candidate is the same record as the source.
|
|
303
577
|
*/
|
|
304
|
-
FilterSelfMatches(duplicates, sourceKey) {
|
|
305
|
-
return duplicates.filter((d) => d.ToString() !== sourceKey.ToString());
|
|
306
|
-
}
|
|
307
|
-
// ─────────────────────────────────────────────
|
|
308
|
-
// Entity Loading
|
|
309
|
-
// ─────────────────────────────────────────────
|
|
310
578
|
/**
|
|
311
|
-
*
|
|
579
|
+
* Build a map of recordID → JSON metadata string from loaded BaseEntity records.
|
|
580
|
+
* Extracts the entity's name field and a few key display fields for rich UI rendering.
|
|
312
581
|
*/
|
|
313
|
-
|
|
314
|
-
const
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
const
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
throw new Error(`Failed to load Duplicate Run record ${duplicateRunID}`);
|
|
582
|
+
buildSourceMetadataMap(records, entityInfo) {
|
|
583
|
+
const metadataMap = new Map();
|
|
584
|
+
const nameField = entityInfo.NameField;
|
|
585
|
+
// Collect a small set of useful display fields
|
|
586
|
+
const displayFieldNames = ['Name', 'Title', 'Description', 'Status', 'Type']
|
|
587
|
+
.filter(fn => entityInfo.Fields.find(f => f.Name === fn));
|
|
588
|
+
for (const record of records) {
|
|
589
|
+
const pk = record.PrimaryKey;
|
|
590
|
+
const id = pk.KeyValuePairs.length === 1 ? String(pk.KeyValuePairs[0].Value) : pk.Values();
|
|
591
|
+
const meta = {
|
|
592
|
+
Entity: entityInfo.Name,
|
|
593
|
+
};
|
|
594
|
+
if (entityInfo.Icon) {
|
|
595
|
+
meta['EntityIcon'] = entityInfo.Icon;
|
|
596
|
+
}
|
|
597
|
+
if (nameField) {
|
|
598
|
+
const nameVal = record.Get(nameField.Name);
|
|
599
|
+
if (nameVal != null)
|
|
600
|
+
meta['Name'] = String(nameVal);
|
|
601
|
+
}
|
|
602
|
+
for (const fn of displayFieldNames) {
|
|
603
|
+
if (fn !== nameField?.Name) {
|
|
604
|
+
const val = record.Get(fn);
|
|
605
|
+
if (val != null) {
|
|
606
|
+
const str = String(val);
|
|
607
|
+
meta[fn] = str.length > 200 ? str.substring(0, 197) + '...' : str;
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
metadataMap.set(id, JSON.stringify(meta));
|
|
344
612
|
}
|
|
345
|
-
return
|
|
613
|
+
return metadataMap;
|
|
346
614
|
}
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
if (!entity) {
|
|
350
|
-
throw new Error(`No Duplicate Run found for List ${listID}`);
|
|
351
|
-
}
|
|
352
|
-
return entity;
|
|
615
|
+
FilterSelfMatches(duplicates, sourceKey) {
|
|
616
|
+
return duplicates.filter((d) => d.ToString() !== sourceKey.ToString());
|
|
353
617
|
}
|
|
354
618
|
// ─────────────────────────────────────────────
|
|
355
619
|
// Run Detail & Match Persistence (Batched)
|
|
356
620
|
// ─────────────────────────────────────────────
|
|
357
621
|
/**
|
|
358
|
-
* Create DuplicateRunDetail records for
|
|
622
|
+
* Create DuplicateRunDetail records for a batch of record IDs.
|
|
359
623
|
*/
|
|
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;
|
|
624
|
+
async CreateRunDetailRecords(recordIDs, duplicateRunID, entityInfo, metadataMap) {
|
|
370
625
|
const results = [];
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
626
|
+
const pkFieldName = entityInfo.FirstPrimaryKey.Name;
|
|
627
|
+
for (const batch of chunkArray(recordIDs, SAVE_BATCH_SIZE)) {
|
|
628
|
+
const batchResults = await Promise.all(batch.map(async (recordID) => {
|
|
629
|
+
const runDetail = await this.Metadata.GetEntityObject('MJ: Duplicate Run Details', this.CurrentUser);
|
|
374
630
|
runDetail.NewRecord();
|
|
375
631
|
runDetail.DuplicateRunID = duplicateRunID;
|
|
376
|
-
|
|
632
|
+
// Store RecordID in standard MJ URL segment format (e.g., "ID|uuid")
|
|
633
|
+
runDetail.RecordID = `${pkFieldName}|${recordID}`;
|
|
377
634
|
runDetail.MatchStatus = 'Pending';
|
|
378
635
|
runDetail.MergeStatus = 'Pending';
|
|
636
|
+
runDetail.RecordMetadata = metadataMap?.get(recordID) ?? null;
|
|
379
637
|
const success = await this.SaveEntity(runDetail);
|
|
380
638
|
if (!success) {
|
|
381
639
|
LogError("Failed to save MJDuplicateRunDetailEntity", undefined, runDetail.LatestResult);
|
|
@@ -397,9 +655,25 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
397
655
|
const results = [];
|
|
398
656
|
let matchesFound = 0;
|
|
399
657
|
for (const qr of queryResults) {
|
|
658
|
+
// Filter out inverse duplicates: if A→B was already persisted, skip B→A
|
|
659
|
+
const sourceId = qr.SourceKey.Values();
|
|
660
|
+
qr.Duplicates.Duplicates = qr.Duplicates.Duplicates.filter(dupe => {
|
|
661
|
+
const matchId = dupe.Values();
|
|
662
|
+
const pairKey = sourceId < matchId ? `${sourceId}::${matchId}` : `${matchId}::${sourceId}`;
|
|
663
|
+
if (this._seenPairs.has(pairKey)) {
|
|
664
|
+
return false; // Inverse already recorded
|
|
665
|
+
}
|
|
666
|
+
this._seenPairs.add(pairKey);
|
|
667
|
+
return true;
|
|
668
|
+
});
|
|
400
669
|
results.push(qr.Duplicates);
|
|
401
670
|
matchesFound += qr.Duplicates.Duplicates.length;
|
|
402
|
-
const
|
|
671
|
+
const sourceKey = qr.SourceKey;
|
|
672
|
+
const detail = duplicateRunDetails.find((d) => {
|
|
673
|
+
const detailKey = new CompositeKey();
|
|
674
|
+
detailKey.LoadFromConcatenatedString(d.RecordID);
|
|
675
|
+
return detailKey.Equals(sourceKey);
|
|
676
|
+
});
|
|
403
677
|
if (detail) {
|
|
404
678
|
const matchRecords = await this.CreateMatchRecordsForDetail(detail.ID, qr.Duplicates);
|
|
405
679
|
qr.Duplicates.DuplicateRunDetailMatchRecordIDs = matchRecords.map((m) => m.ID);
|
|
@@ -423,15 +697,16 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
423
697
|
const matchRecords = [];
|
|
424
698
|
for (const batch of chunkArray(duplicateResult.Duplicates, SAVE_BATCH_SIZE)) {
|
|
425
699
|
const batchResults = await Promise.all(batch.map(async (dupe) => {
|
|
426
|
-
const match = await this.Metadata.GetEntityObject('MJ: Duplicate Run Detail Matches');
|
|
700
|
+
const match = await this.Metadata.GetEntityObject('MJ: Duplicate Run Detail Matches', this.CurrentUser);
|
|
427
701
|
match.NewRecord();
|
|
428
702
|
match.DuplicateRunDetailID = duplicateRunDetailID;
|
|
429
|
-
match.MatchRecordID = dupe.
|
|
703
|
+
match.MatchRecordID = dupe.ToURLSegment();
|
|
430
704
|
match.MatchProbability = dupe.ProbabilityScore;
|
|
431
705
|
match.MatchedAt = new Date();
|
|
432
706
|
match.Action = '';
|
|
433
707
|
match.ApprovalStatus = 'Pending';
|
|
434
708
|
match.MergeStatus = 'Pending';
|
|
709
|
+
match.RecordMetadata = dupe.VectorMetadata ? JSON.stringify(dupe.VectorMetadata) : null;
|
|
435
710
|
const success = await this.SaveEntity(match);
|
|
436
711
|
return success ? match : null;
|
|
437
712
|
}));
|
|
@@ -448,10 +723,11 @@ export class DuplicateRecordDetector extends VectorBase {
|
|
|
448
723
|
/**
|
|
449
724
|
* Automatically merge records that meet the absolute match threshold.
|
|
450
725
|
*/
|
|
451
|
-
async ProcessAutoMerges(response, entityDocument) {
|
|
726
|
+
async ProcessAutoMerges(response, entityDocument, options = {}) {
|
|
727
|
+
const absoluteThreshold = options.AbsoluteMatchThreshold ?? entityDocument.AbsoluteMatchThreshold;
|
|
452
728
|
for (const dupeResult of response.PotentialDuplicateResult) {
|
|
453
729
|
for (const [index, dupe] of dupeResult.Duplicates.entries()) {
|
|
454
|
-
if (dupe.ProbabilityScore <
|
|
730
|
+
if (dupe.ProbabilityScore < absoluteThreshold) {
|
|
455
731
|
continue;
|
|
456
732
|
}
|
|
457
733
|
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.23.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.23.0",
|
|
21
|
+
"@memberjunction/ai-vectordb": "5.23.0",
|
|
22
|
+
"@memberjunction/ai-vectors": "5.23.0",
|
|
23
|
+
"@memberjunction/templates": "5.23.0",
|
|
24
|
+
"@memberjunction/ai-vector-sync": "5.23.0",
|
|
25
|
+
"@memberjunction/aiengine": "5.23.0",
|
|
26
|
+
"@memberjunction/core": "5.23.0",
|
|
27
|
+
"@memberjunction/global": "5.23.0",
|
|
28
|
+
"@memberjunction/core-entities": "5.23.0",
|
|
29
29
|
"dotenv": "^17.2.4"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|