@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 (Configured on Entity Document)
149
+ ### Thresholds
148
150
 
149
- Thresholds are not part of `DuplicateDetectionOptions` -- they are configured on the `EntityDocument` record itself:
151
+ Thresholds can be configured at two levels -- on the `EntityDocument` record (default) or overridden per-run via `DuplicateDetectionOptions`. When threshold overrides are provided in the options, they take precedence over the EntityDocument values.
150
152
 
151
153
  | Threshold | Purpose |
152
154
  |---|---|
153
155
  | `PotentialMatchThreshold` | Minimum similarity score to report a candidate as a potential duplicate |
154
156
  | `AbsoluteMatchThreshold` | Minimum similarity score to trigger automatic record merge |
155
157
 
158
+ A server hook normalizes `1.0` thresholds to sensible defaults (`0.70` for potential, `0.95` for absolute) to prevent degenerate behavior when thresholds are left at the maximum.
159
+
156
160
  ---
157
161
 
158
162
  ## Hybrid Search and Reciprocal Rank Fusion (RRF)
@@ -290,6 +294,15 @@ interface ScoredCandidate {
290
294
 
291
295
  ---
292
296
 
297
+ ## Inverse Match Deduplication
298
+
299
+ The detector maintains a `_seenPairs` set across the entire run to suppress inverse duplicates. If record A is identified as a duplicate of record B (A->B), the reverse match (B->A) is automatically suppressed. Pair keys use canonical ordering (`smallerID::largerID`) for consistent deduplication regardless of query direction.
300
+
301
+ ## RecordID Format and Metadata
302
+
303
+ - **RecordID and MatchRecordID** are stored in MJ URL segment format (e.g., `ID|uuid`), making them compatible with `CompositeKey` for entities with composite primary keys.
304
+ - **RecordMetadata** is stored on both `DuplicateRunDetail` and `DuplicateRunDetailMatch` entities, capturing the vector database metadata snapshot at detection time. This preserves the context used for matching even if the source record changes later.
305
+
293
306
  ## Database Entities
294
307
 
295
308
  The package reads from and writes to these MJ entities:
@@ -299,8 +312,8 @@ The package reads from and writes to these MJ entities:
299
312
  | `MJ: Entity Documents` | Configuration: template, AI model, vector DB, thresholds |
300
313
  | `MJ: Lists` / `MJ: List Details` | Source records to check for duplicates |
301
314
  | `MJ: Duplicate Runs` | Tracks each detection run (status, timing) |
302
- | `MJ: Duplicate Run Details` | Per-record tracking within a run |
303
- | `MJ: Duplicate Run Detail Matches` | Individual match results with probability scores |
315
+ | `MJ: Duplicate Run Details` | Per-record tracking within a run; includes `RecordMetadata` (vector DB metadata snapshot) |
316
+ | `MJ: Duplicate Run Detail Matches` | Individual match results with probability scores; includes `RecordMetadata` for the matched record |
304
317
 
305
318
  ---
306
319
 
@@ -5,11 +5,16 @@
5
5
  * optionally apply hybrid search (RRF) and reranking, persist match results,
6
6
  * and auto-merge high-confidence duplicates.
7
7
  *
8
- * Supports both list-based batch detection and single-record checks.
8
+ * Supports three record-source modes:
9
+ * 1. List-based batch detection (ListID provided)
10
+ * 2. View-based detection (ViewID provided)
11
+ * 3. Entity-wide detection (no ListID/ViewID — scans all records or applies ExtraFilter)
12
+ *
13
+ * Also supports single-record checks via CheckSingleRecord().
9
14
  *
10
15
  * @module @memberjunction/ai-vector-dupe
11
16
  */
12
- import { PotentialDuplicateRequest, PotentialDuplicateResponse, CompositeKey, UserInfo, BaseEntity, PotentialDuplicateResult, PotentialDuplicate, DuplicateDetectionOptions } from "@memberjunction/core";
17
+ import { PotentialDuplicateRequest, PotentialDuplicateResponse, CompositeKey, UserInfo, BaseEntity, PotentialDuplicateResult, EntityInfo, PotentialDuplicate, DuplicateDetectionOptions } from "@memberjunction/core";
13
18
  import { BaseResponse } from "@memberjunction/ai-vectordb";
14
19
  import { MJDuplicateRunDetailEntity, MJDuplicateRunDetailMatchEntity, MJDuplicateRunEntity, MJEntityDocumentEntity, MJListEntity } from "@memberjunction/core-entities";
15
20
  import { VectorBase } from "@memberjunction/ai-vectors";
@@ -28,6 +33,7 @@ interface RecordQueryResult {
28
33
  *
29
34
  * Supports:
30
35
  * - List-based batch detection (getDuplicateRecords)
36
+ * - View/filter/full-entity batch detection (vector-first approach)
31
37
  * - Single-record duplicate check (CheckSingleRecord)
32
38
  * - Hybrid search via RRF when vector DB supports it
33
39
  * - Optional post-retrieval reranking via MJ's BaseReranker
@@ -36,10 +42,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 all records in a list.
53
+ * Run duplicate detection for records identified by ListID, ViewID, ExtraFilter,
54
+ * or all records in the entity (vector-first approach).
41
55
  *
42
- * Flow: validate vectorize embed query (optional rerank) → persist → (optional merge)
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
- * Load records from an entity that are members of the specified list.
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 LoadRecordsByListID(listID: string, entityID: string): Promise<BaseEntity[]>;
94
- protected LoadListEntity(listID: string): Promise<MJListEntity>;
95
- protected LoadDuplicateRun(duplicateRunID: string): Promise<MJDuplicateRunEntity>;
96
- protected LoadDuplicateRunByListID(listID: string): Promise<MJDuplicateRunEntity>;
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 each item in the list, saving in parallel batches.
162
+ * Create DuplicateRunDetail records for a batch of record IDs.
99
163
  */
100
- protected CreateRunDetailRecordsFromList(listID: string, duplicateRunID: string): Promise<MJDuplicateRunDetailEntity[]>;
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;;;;;;;;;;GAUG;AAGH,OAAO,EACH,yBAAyB,EACzB,0BAA0B,EAC1B,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,wBAAwB,EAKxB,kBAAkB,EAClB,yBAAyB,EAE5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAgB,MAAM,6BAA6B,CAAC;AAEzE,OAAO,EACH,0BAA0B,EAC1B,+BAA+B,EAC/B,oBAAoB,EACpB,sBAAsB,EAEtB,YAAY,EACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAA6C,MAAM,gCAAgC,CAAC;AAEzH,OAAO,KAAK,EAAE,wBAAwB,EAA2B,MAAM,+BAA+B,CAAC;AA8BvG;;GAEG;AACH,UAAU,iBAAiB;IACvB,SAAS,EAAE,YAAY,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,wBAAwB,CAAC;CACxC;AAED;;;;;;;;;GASG;AACH,qBAAa,uBAAwB,SAAQ,UAAU;IACnD,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAiB;IAElC;;;;OAIG;IACU,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,0BAA0B,CAAC;IA+EhI;;;OAGG;IACU,iBAAiB,CAC1B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,yBAAyB,EACnC,WAAW,CAAC,EAAE,QAAQ,GACvB,OAAO,CAAC,wBAAwB,CAAC;IA4CpC;;OAEG;cACa,sBAAsB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAMxG;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,cAAc,EAAE,sBAAsB,GAAG,IAAI;IA+B3E;;OAEG;cACa,sBAAsB,CAAC,cAAc,EAAE,sBAAsB,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBpH;;;;;OAKG;cACa,qBAAqB,CACjC,cAAc,EAAE,UAAU,CAAC,OAAO,4BAA4B,CAAC,cAAc,CAAC,EAC9E,cAAc,EAAE,sBAAsB,EACtC,OAAO,EAAE,UAAU,EAAE,EACrB,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,MAAM,EAAE,CAAC;IA0BpB;;OAEG;IACH,SAAS,CAAC,YAAY,CAAC,cAAc,EAAE,sBAAsB,GAAG,wBAAwB;IAkBxF;;;OAGG;cACa,yBAAyB,CACrC,OAAO,EAAE,UAAU,EAAE,EACrB,OAAO,EAAE,MAAM,EAAE,EAAE,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,cAAc,EAAE,sBAAsB,EACtC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,yBAAyB,GACnC,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA8B/B;;OAEG;cACa,kBAAkB,CAC9B,MAAM,EAAE,MAAM,EAAE,EAChB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,yBAAyB,GACnC,OAAO,CAAC,YAAY,CAAC;IAqBxB;;OAEG;IACI,kBAAkB,CAAC,aAAa,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,YAAY,GAAG,wBAAwB;IAuB1G;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,EAAE,EAAE,SAAS,EAAE,YAAY,GAAG,kBAAkB,EAAE;IAQ5G;;OAEG;cACa,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;cAmB5E,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;cAUrD,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;cAUvE,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAcvF;;OAEG;cACa,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,EAAE,CAAC;IAuC7H;;OAEG;cACa,mBAAmB,CAC/B,YAAY,EAAE,iBAAiB,EAAE,EACjC,mBAAmB,EAAE,0BAA0B,EAAE,EACjD,cAAc,EAAE,sBAAsB,EACtC,OAAO,EAAE,yBAAyB,EAClC,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,wBAAwB,EAAE,CAAC;IA8BtC;;OAEG;cACa,2BAA2B,CACvC,oBAAoB,EAAE,MAAM,EAC5B,eAAe,EAAE,wBAAwB,GAC1C,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiC7C;;OAEG;cACa,iBAAiB,CAC7B,QAAQ,EAAE,0BAA0B,EACpC,cAAc,EAAE,sBAAsB,GACvC,OAAO,CAAC,IAAI,CAAC;IAsBhB;;OAEG;YACW,2BAA2B;IAwBzC,OAAO,CAAC,cAAc;CAoBzB"}
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 both list-based batch detection and single-record checks.
8
+ * Supports three record-source modes:
9
+ * 1. List-based batch detection (ListID provided)
10
+ * 2. View-based detection (ViewID provided)
11
+ * 3. Entity-wide detection (no ListID/ViewID — scans all records or applies ExtraFilter)
12
+ *
13
+ * Also supports single-record checks via CheckSingleRecord().
9
14
  *
10
15
  * @module @memberjunction/ai-vector-dupe
11
16
  */
12
17
  import { BaseEmbeddings, GetAIAPIKey } from "@memberjunction/ai";
13
- import { PotentialDuplicateResponse, PotentialDuplicateResult, LogError, LogStatus, RecordMergeRequest, PotentialDuplicate, } from "@memberjunction/core";
18
+ import { PotentialDuplicateResponse, CompositeKey, PotentialDuplicateResult, LogError, LogStatus, RecordMergeRequest, PotentialDuplicate, 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 QUERY_CONCURRENCY_LIMIT = 5;
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 all records in a list.
53
+ * Run duplicate detection for records identified by ListID, ViewID, ExtraFilter,
54
+ * or all records in the entity (vector-first approach).
38
55
  *
39
- * Flow: validate vectorize embed query (optional rerank) → persist → (optional merge)
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: Vectorize source records
55
- this.reportProgress(options, 'Vectorizing', 0, 0, 0, startTime);
56
- await this.VectorizeSourceRecords(entityDocument, contextUser);
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: Load list and duplicate run
60
- const list = await this.LoadListEntity(params.ListID);
61
- const duplicateRun = options.DuplicateRunID
62
- ? await this.LoadDuplicateRun(options.DuplicateRunID)
63
- : await this.LoadDuplicateRunByListID(list.ID);
64
- // Step 5: Create run detail records in batches
65
- const duplicateRunDetails = await this.CreateRunDetailRecordsFromList(list.ID, duplicateRun.ID);
66
- // Step 6: Load and embed records
67
- const records = await this.LoadRecordsByListID(list.ID, entityDocument.EntityID);
68
- if (records.length === 0) {
69
- LogError(`No records found in list ${list.Name}`);
70
- response.ErrorMessage = `No records found in list ${list.Name}`;
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
- this.reportProgress(options, 'Embedding', records.length, 0, 0, startTime);
75
- // Step 7: Generate template text and embeddings
76
- const templateParser = EntityDocumentTemplateParser.CreateInstance();
77
- const templateTexts = await this.GenerateTemplateTexts(templateParser, entityDocument, records, contextUser);
78
- const embedResult = await this.embedding.EmbedTexts({ texts: templateTexts, model: null });
79
- // Step 8: Query vector DB for each record (with concurrency control)
80
- this.reportProgress(options, 'Querying', records.length, 0, 0, startTime);
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 queryResults = await this.QueryDuplicatesForRecords(records, embedResult.vectors, templateTexts, entityDocument, topK, options);
83
- // Step 9: Persist match results and update run details
84
- this.reportProgress(options, 'Matching', records.length, records.length, 0, startTime);
85
- const results = await this.PersistMatchResults(queryResults, duplicateRunDetails, entityDocument, options, startTime);
86
- // Step 10: Complete the duplicate run
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 11: Auto-merge high-confidence matches
94
- this.reportProgress(options, 'Merging', records.length, records.length, results.length, startTime);
95
- response.PotentialDuplicateResult = results;
96
- await this.ProcessAutoMerges(response, entityDocument);
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: ${results.length} records checked`);
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
- LogStatus(`Providers initialized: AI Model=${aiModel.DriverClass}, VectorDB=${vectorDB.ClassKey}`);
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
- dupeResult.Duplicates = dupeResult.Duplicates.filter((d) => d.ProbabilityScore >= entityDocument.PotentialMatchThreshold);
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, QUERY_CONCURRENCY_LIMIT);
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
- * Load records from an entity that are members of the specified list.
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
- async LoadRecordsByListID(listID, entityID) {
314
- const entityInfo = this.Metadata.EntityByID(entityID);
315
- if (!entityInfo) {
316
- throw new Error(`Entity not found for ID ${entityID}`);
317
- }
318
- const sanitizedListID = listID.replace(/'/g, "''");
319
- const rvResult = await this.RunView.RunView({
320
- EntityName: entityInfo.Name,
321
- ExtraFilter: `ID IN (SELECT RecordID FROM __mj.vwListDetails WHERE ListID = '${sanitizedListID}')`,
322
- ResultType: 'entity_object',
323
- }, this.CurrentUser);
324
- if (!rvResult.Success) {
325
- throw new Error(rvResult.ErrorMessage);
326
- }
327
- return rvResult.Results;
328
- }
329
- async LoadListEntity(listID) {
330
- const list = await this.Metadata.GetEntityObject('MJ: Lists');
331
- list.ContextCurrentUser = this.CurrentUser;
332
- const success = await list.Load(listID);
333
- if (!success) {
334
- throw new Error(`Failed to load List record ${listID}`);
335
- }
336
- return list;
337
- }
338
- async LoadDuplicateRun(duplicateRunID) {
339
- const dupeRun = await this.Metadata.GetEntityObject('MJ: Duplicate Runs');
340
- dupeRun.ContextCurrentUser = this.CurrentUser;
341
- const success = await dupeRun.Load(duplicateRunID);
342
- if (!success) {
343
- throw new Error(`Failed to load Duplicate Run record ${duplicateRunID}`);
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 dupeRun;
613
+ return metadataMap;
346
614
  }
347
- async LoadDuplicateRunByListID(listID) {
348
- const entity = await this.RunViewForSingleValue('MJ: Duplicate Runs', `SourceListID = '${listID.replace(/'/g, "''")}'`);
349
- if (!entity) {
350
- throw new Error(`No Duplicate Run found for List ${listID}`);
351
- }
352
- return entity;
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 each item in the list, saving in parallel batches.
622
+ * Create DuplicateRunDetail records for a batch of record IDs.
359
623
  */
360
- async CreateRunDetailRecordsFromList(listID, duplicateRunID) {
361
- const viewResults = await this.RunView.RunView({
362
- EntityName: 'MJ: List Details',
363
- ExtraFilter: `ListID = '${listID.replace(/'/g, "''")}'`,
364
- ResultType: 'entity_object',
365
- }, this.CurrentUser);
366
- if (!viewResults.Success) {
367
- throw new Error(viewResults.ErrorMessage);
368
- }
369
- const listDetails = viewResults.Results;
624
+ async CreateRunDetailRecords(recordIDs, duplicateRunID, entityInfo, metadataMap) {
370
625
  const results = [];
371
- for (const batch of chunkArray(listDetails, SAVE_BATCH_SIZE)) {
372
- const batchResults = await Promise.all(batch.map(async (listDetail) => {
373
- const runDetail = await this.Metadata.GetEntityObject('MJ: Duplicate Run Details');
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
- runDetail.RecordID = listDetail.RecordID;
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 detail = duplicateRunDetails.find((d) => UUIDsEqual(d.RecordID, qr.SourceKey.Values()));
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.ToString();
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 < entityDocument.AbsoluteMatchThreshold) {
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.22.0",
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.22.0",
21
- "@memberjunction/ai-vectordb": "5.22.0",
22
- "@memberjunction/ai-vectors": "5.22.0",
23
- "@memberjunction/templates": "5.22.0",
24
- "@memberjunction/ai-vector-sync": "5.22.0",
25
- "@memberjunction/aiengine": "5.22.0",
26
- "@memberjunction/core": "5.22.0",
27
- "@memberjunction/global": "5.22.0",
28
- "@memberjunction/core-entities": "5.22.0",
20
+ "@memberjunction/ai": "5.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": {