@memberjunction/external-change-detection 5.14.0 → 5.15.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/dist/ChangeDetector.d.ts +107 -15
- package/dist/ChangeDetector.d.ts.map +1 -1
- package/dist/ChangeDetector.js +429 -241
- package/dist/ChangeDetector.js.map +1 -1
- package/package.json +6 -6
package/dist/ChangeDetector.d.ts
CHANGED
|
@@ -67,40 +67,132 @@ export declare class ExternalChangeDetectorEngine extends BaseEngine<ExternalCha
|
|
|
67
67
|
*/
|
|
68
68
|
get EligibleEntities(): EntityInfo[];
|
|
69
69
|
/**
|
|
70
|
-
* Detects external changes for a single entity
|
|
71
|
-
*
|
|
70
|
+
* Detects external changes for a single entity. Results are paginated
|
|
71
|
+
* (DETECTION_PAGE_SIZE rows per query) to cap memory regardless of how
|
|
72
|
+
* many untracked records exist.
|
|
73
|
+
*
|
|
74
|
+
* Detection queries return ot.* so we build LatestRecord inline —
|
|
75
|
+
* no second round-trip to the database.
|
|
72
76
|
*/
|
|
73
77
|
DetectChangesForEntity(entity: EntityInfo): Promise<ChangeDetectionResult>;
|
|
74
78
|
/**
|
|
75
|
-
*
|
|
76
|
-
|
|
79
|
+
* Validates that entity is non-null and in the eligible list.
|
|
80
|
+
*/
|
|
81
|
+
private validateEntityEligibility;
|
|
82
|
+
/**
|
|
83
|
+
* Builds the template parameter objects for all three detection queries.
|
|
84
|
+
*/
|
|
85
|
+
private buildDetectionParams;
|
|
86
|
+
/**
|
|
87
|
+
* Runs a detection query in pages of DETECTION_PAGE_SIZE, calling the
|
|
88
|
+
* provided handler for each result row. Stops when a page returns fewer
|
|
89
|
+
* rows than the page size.
|
|
90
|
+
*
|
|
91
|
+
* If a page query fails (timeout, connection error, etc.), logs the error
|
|
92
|
+
* and stops pagination for this entity rather than retrying or crashing.
|
|
93
|
+
* The caller's try/catch in DetectChangesForEntity will report partial results.
|
|
94
|
+
*/
|
|
95
|
+
private detectPages;
|
|
96
|
+
/**
|
|
97
|
+
* Builds a ChangeDetectionItem with PrimaryKey extracted from a query result row.
|
|
98
|
+
*/
|
|
99
|
+
private buildChangeItem;
|
|
100
|
+
/**
|
|
101
|
+
* Builds a ChangeDetectionItem for a deletion from a RecordChanges row.
|
|
102
|
+
*/
|
|
103
|
+
private buildDeleteItem;
|
|
104
|
+
/**
|
|
105
|
+
* Creates a BaseEntity instance and loads it with data from a query result row.
|
|
106
|
+
* Strips __ecd_ prefixed columns (our timestamp aliases) before loading to
|
|
107
|
+
* avoid "field not found in entity" warnings from BaseEntity.SetMany().
|
|
108
|
+
*/
|
|
109
|
+
private buildEntityFromRow;
|
|
110
|
+
/**
|
|
111
|
+
* Compares the current record with the last RecordChange snapshot to determine field-level changes.
|
|
77
112
|
*/
|
|
78
113
|
DetermineRecordChanges(md: Metadata, change: ChangeDetectionItem): Promise<{
|
|
79
114
|
changes: FieldChange[];
|
|
80
115
|
latestRecord: BaseEntity;
|
|
81
116
|
}>;
|
|
82
|
-
protected DoValuesDiffer(tsType: EntityFieldTSType, value1:
|
|
117
|
+
protected DoValuesDiffer(tsType: EntityFieldTSType, value1: unknown, value2: unknown): {
|
|
83
118
|
differ: boolean;
|
|
84
|
-
castValue1:
|
|
85
|
-
castValue2:
|
|
119
|
+
castValue1: unknown;
|
|
120
|
+
castValue2: unknown;
|
|
86
121
|
};
|
|
87
122
|
/**
|
|
88
123
|
* Casts a value to a boolean, properly handling string representations like 'false' and '0'
|
|
89
124
|
* which are truthy in JavaScript but should be treated as false.
|
|
90
125
|
*/
|
|
91
126
|
protected CastToBoolean(value: unknown): boolean;
|
|
92
|
-
protected GetLatestRecordChangesDataForEntityRecord(change: ChangeDetectionItem): Promise<
|
|
93
|
-
protected GetLatestDatabaseRecords(md: Metadata, changes: ChangeDetectionItem[]): Promise<boolean>;
|
|
94
|
-
protected GetLatestDatabaseRecord(md: Metadata, change: ChangeDetectionItem): Promise<BaseEntity>;
|
|
127
|
+
protected GetLatestRecordChangesDataForEntityRecord(change: ChangeDetectionItem): Promise<Record<string, unknown> | null>;
|
|
95
128
|
protected getPrimaryKeyString(entity: EntityInfo, tablePrefix: string): string;
|
|
96
129
|
/**
|
|
97
|
-
*
|
|
130
|
+
* Row count thresholds for dynamic concurrency. Entities are sorted smallest-first
|
|
131
|
+
* and processed with a concurrency level appropriate to their size.
|
|
132
|
+
* Conservative values to avoid overwhelming production databases where
|
|
133
|
+
* detection queries use string-concat PK joins that force full table scans.
|
|
134
|
+
*/
|
|
135
|
+
private static readonly CONCURRENCY_TIERS;
|
|
136
|
+
/**
|
|
137
|
+
* Detects and replays external changes for the specified entities in an interleaved
|
|
138
|
+
* fashion: each entity's changes are detected, replayed, and then discarded before
|
|
139
|
+
* moving to the next entity. This keeps memory bounded to one entity's changes at
|
|
140
|
+
* a time rather than accumulating all changes across all entities.
|
|
141
|
+
*
|
|
142
|
+
* Entity concurrency is dynamically determined from approximate row counts
|
|
143
|
+
* (via sys.partitions) so small tables run in parallel while large tables
|
|
144
|
+
* don't overwhelm the DB.
|
|
145
|
+
*
|
|
146
|
+
* Production safety mechanisms:
|
|
147
|
+
* - **Circuit breaker**: Aborts if >50% of entities fail
|
|
148
|
+
* - **Cooldown**: Pauses 30s after 5 consecutive failures
|
|
149
|
+
* - **Heap guard**: Stops if heap usage exceeds 85%
|
|
150
|
+
*
|
|
98
151
|
* @param entities Array of entities to process
|
|
99
|
-
* @param
|
|
100
|
-
* @
|
|
152
|
+
* @param replayBatchSize Concurrent replays per entity. Defaults to 20.
|
|
153
|
+
* @param maxConcurrency Max parallel entity detection. Defaults to 5.
|
|
154
|
+
* @param staleTimeoutHours Hours before a stuck run is considered stale. Defaults to 24.
|
|
155
|
+
* @returns Summary with success status and aggregate counts
|
|
156
|
+
*/
|
|
157
|
+
DetectAndReplayChanges(entities: EntityInfo[], replayBatchSize?: number, maxConcurrency?: number, staleTimeoutHours?: number): Promise<{
|
|
158
|
+
Success: boolean;
|
|
159
|
+
ErrorMessage?: string;
|
|
160
|
+
TotalDetected: number;
|
|
161
|
+
TotalReplayed: number;
|
|
162
|
+
EntitiesProcessed: number;
|
|
163
|
+
EntitiesFailed: number;
|
|
164
|
+
}>;
|
|
165
|
+
/**
|
|
166
|
+
* Replays a single entity's changes and returns the count of successful replays.
|
|
167
|
+
* Changes are processed in batches for concurrency but the entire set is for
|
|
168
|
+
* one entity only, keeping memory bounded.
|
|
169
|
+
*/
|
|
170
|
+
private replayEntityChanges;
|
|
171
|
+
/**
|
|
172
|
+
* Checks whether Node.js heap usage is approaching the V8 heap limit.
|
|
173
|
+
* Uses v8.getHeapStatistics().heap_size_limit which is the actual max
|
|
174
|
+
* (set by --max-old-space-size or V8's default), not the currently
|
|
175
|
+
* allocated heapTotal which starts small and grows on demand.
|
|
176
|
+
*/
|
|
177
|
+
private isHeapPressureHigh;
|
|
178
|
+
/**
|
|
179
|
+
* Queries sys.partitions for fast approximate row counts (no table scans).
|
|
180
|
+
* Returns a Map of entityID → approx row count.
|
|
181
|
+
*/
|
|
182
|
+
private getApproxRowCounts;
|
|
183
|
+
/**
|
|
184
|
+
* Determines the concurrency level for an entity based on its approximate row count.
|
|
185
|
+
*/
|
|
186
|
+
private getConcurrencyForEntity;
|
|
187
|
+
/**
|
|
188
|
+
* @deprecated Use DetectAndReplayChanges() instead, which interleaves detection and replay
|
|
189
|
+
* per entity to keep memory bounded. This method accumulates all changes in memory.
|
|
190
|
+
*/
|
|
191
|
+
DetectChangesForEntities(entities: EntityInfo[], maxConcurrency?: number): Promise<ChangeDetectionResult>;
|
|
192
|
+
/**
|
|
193
|
+
* @deprecated Use DetectAndReplayChanges() instead.
|
|
101
194
|
*/
|
|
102
|
-
|
|
103
|
-
DetectChangesForAllEligibleEntities(entityBatchSize?: number): Promise<ChangeDetectionResult>;
|
|
195
|
+
DetectChangesForAllEligibleEntities(maxConcurrency?: number): Promise<ChangeDetectionResult>;
|
|
104
196
|
/**
|
|
105
197
|
* This method will replay all of the items in the changes array
|
|
106
198
|
* @param changes Array of changes to replay.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeDetector.d.ts","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA4B,UAAU,EAAE,YAAY,EAAgB,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"ChangeDetector.d.ts","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
|
package/dist/ChangeDetector.js
CHANGED
|
@@ -2,6 +2,32 @@ import { BaseEngine, CompositeKey, ConsoleColor, EntityFieldTSType, EntityInfo,
|
|
|
2
2
|
import { UUIDsEqual } from "@memberjunction/global";
|
|
3
3
|
import { SQLServerDataProvider, SQLServerProviderConfigData } from "@memberjunction/sqlserver-dataprovider";
|
|
4
4
|
import { PostgreSQLDialect, SQLServerDialect } from "@memberjunction/sql-dialect";
|
|
5
|
+
import { getHeapStatistics } from "v8";
|
|
6
|
+
/**
|
|
7
|
+
* Maximum number of rows per detection query page. Since changes are replayed
|
|
8
|
+
* per-entity and then discarded (not accumulated), this can be generous.
|
|
9
|
+
*/
|
|
10
|
+
const DETECTION_PAGE_SIZE = 5000;
|
|
11
|
+
/**
|
|
12
|
+
* Abort the entire run if this percentage of entities fail detection.
|
|
13
|
+
* Prevents hammering a database that's clearly under pressure.
|
|
14
|
+
*/
|
|
15
|
+
const FAILURE_ABORT_THRESHOLD = 0.5;
|
|
16
|
+
/**
|
|
17
|
+
* Number of consecutive entity failures that triggers a cooldown pause.
|
|
18
|
+
* After this many failures in a row, the engine pauses before continuing
|
|
19
|
+
* to let the database recover.
|
|
20
|
+
*/
|
|
21
|
+
const CONSECUTIVE_FAILURE_COOLDOWN_THRESHOLD = 5;
|
|
22
|
+
/**
|
|
23
|
+
* Milliseconds to pause after hitting the consecutive failure threshold.
|
|
24
|
+
*/
|
|
25
|
+
const COOLDOWN_PAUSE_MS = 30_000;
|
|
26
|
+
/**
|
|
27
|
+
* Maximum percentage of Node.js heap that can be used before the engine
|
|
28
|
+
* skips remaining entities to prevent OOM crashes.
|
|
29
|
+
*/
|
|
30
|
+
const HEAP_USAGE_LIMIT_PERCENT = 0.85;
|
|
5
31
|
/**
|
|
6
32
|
* Represents a change to a single field in a record
|
|
7
33
|
*/
|
|
@@ -76,169 +102,222 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
|
|
|
76
102
|
return netEligible;
|
|
77
103
|
}
|
|
78
104
|
/**
|
|
79
|
-
* Detects external changes for a single entity
|
|
80
|
-
*
|
|
105
|
+
* Detects external changes for a single entity. Results are paginated
|
|
106
|
+
* (DETECTION_PAGE_SIZE rows per query) to cap memory regardless of how
|
|
107
|
+
* many untracked records exist.
|
|
108
|
+
*
|
|
109
|
+
* Detection queries return ot.* so we build LatestRecord inline —
|
|
110
|
+
* no second round-trip to the database.
|
|
81
111
|
*/
|
|
82
112
|
async DetectChangesForEntity(entity) {
|
|
83
113
|
try {
|
|
84
|
-
|
|
85
|
-
if (!entity) {
|
|
86
|
-
throw new Error("entity parameter is required");
|
|
87
|
-
}
|
|
88
|
-
else if (!this.EligibleEntities.find(e => UUIDsEqual(e.ID, entity.ID))) {
|
|
89
|
-
throw new Error(`Entity ${entity.Name} is not eligible for external change detection. Refer to the documentation on the EligibleEntities and IneligibleEntities properties for more information.`);
|
|
90
|
-
}
|
|
114
|
+
this.validateEntityEligibility(entity);
|
|
91
115
|
const md = new Metadata();
|
|
92
116
|
const rq = new RunQuery();
|
|
93
|
-
const
|
|
94
|
-
EntityID: entity.ID,
|
|
95
|
-
SchemaName: entity.SchemaName,
|
|
96
|
-
BaseView: entity.BaseView,
|
|
97
|
-
ColumnList: entity.PrimaryKeys.map(pk => `ot.${this._dialect.QuoteIdentifier(pk.Name)}`).join(', '),
|
|
98
|
-
PrimaryKeyJoin: this.getPrimaryKeyString(entity, 'ot'),
|
|
99
|
-
CreatedAtField: EntityInfo.CreatedAtFieldName,
|
|
100
|
-
UpdatedAtField: EntityInfo.UpdatedAtFieldName
|
|
101
|
-
};
|
|
102
|
-
const [createResult, updateResult, deleteResult] = await rq.RunQueries([
|
|
103
|
-
{ QueryName: 'ExternalChangeDetection_DetectCreations', Parameters: commonParams },
|
|
104
|
-
{ QueryName: 'ExternalChangeDetection_DetectUpdates', Parameters: {
|
|
105
|
-
EntityID: commonParams.EntityID,
|
|
106
|
-
SchemaName: commonParams.SchemaName,
|
|
107
|
-
BaseView: commonParams.BaseView,
|
|
108
|
-
ColumnList: commonParams.ColumnList,
|
|
109
|
-
PrimaryKeyJoin: commonParams.PrimaryKeyJoin,
|
|
110
|
-
UpdatedAtField: commonParams.UpdatedAtField
|
|
111
|
-
} },
|
|
112
|
-
{ QueryName: 'ExternalChangeDetection_DetectDeletions', Parameters: {
|
|
113
|
-
EntityID: commonParams.EntityID,
|
|
114
|
-
SchemaName: commonParams.SchemaName,
|
|
115
|
-
BaseView: commonParams.BaseView,
|
|
116
|
-
PrimaryKeyJoin: commonParams.PrimaryKeyJoin,
|
|
117
|
-
PrimaryKeyIsNull: entity.PrimaryKeys.map(pk => `ot.${this._dialect.QuoteIdentifier(pk.Name)} IS NULL`).join(' AND ')
|
|
118
|
-
} }
|
|
119
|
-
], this.ContextUser);
|
|
120
|
-
// we have the results for all of the queries, now we need to convert them into ChangeDetectionItems
|
|
117
|
+
const params = this.buildDetectionParams(entity);
|
|
121
118
|
const changes = [];
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
119
|
+
// Detect creations (paginated)
|
|
120
|
+
await this.detectPages(rq, 'ExternalChangeDetection_DetectCreations', params.creation, async (row) => {
|
|
121
|
+
const item = this.buildChangeItem(entity, row, 'Create');
|
|
122
|
+
const created = new Date(row.__ecd_CreatedAt);
|
|
123
|
+
const updated = new Date(row.__ecd_UpdatedAt);
|
|
124
|
+
item.ChangedAt = created >= updated ? created : updated;
|
|
125
|
+
item.LatestRecord = await this.buildEntityFromRow(md, entity, row);
|
|
126
|
+
changes.push(item);
|
|
127
|
+
});
|
|
128
|
+
// Track creation PKs so we can skip duplicates in update detection
|
|
129
|
+
const createdKeys = new Set(changes.map(c => c.PrimaryKey.ToConcatenatedString()));
|
|
130
|
+
// Detect updates (paginated)
|
|
131
|
+
await this.detectPages(rq, 'ExternalChangeDetection_DetectUpdates', params.update, async (row) => {
|
|
132
|
+
const item = this.buildChangeItem(entity, row, 'Update');
|
|
133
|
+
item.ChangedAt = new Date(row.__ecd_UpdatedAt);
|
|
134
|
+
// skip if already detected as a creation
|
|
135
|
+
if (!createdKeys.has(item.PrimaryKey.ToConcatenatedString())) {
|
|
136
|
+
item.LatestRecord = await this.buildEntityFromRow(md, entity, row);
|
|
135
137
|
changes.push(item);
|
|
136
138
|
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
};
|
|
147
|
-
}));
|
|
148
|
-
item.Type = 'Update';
|
|
149
|
-
item.ChangedAt = row.UpdatedAt;
|
|
150
|
-
// push the item but first make sure it is NOT already in the changes from the
|
|
151
|
-
// create detection, if it is, we do not push it into changes
|
|
152
|
-
if (!changes.find(c => c.PrimaryKey.Equals(item.PrimaryKey))) {
|
|
153
|
-
changes.push(item);
|
|
154
|
-
}
|
|
139
|
+
});
|
|
140
|
+
// Detect deletions (single call — bounded by RecordChange entries, not entity size)
|
|
141
|
+
const deleteResult = await rq.RunQuery({
|
|
142
|
+
QueryName: 'ExternalChangeDetection_DetectDeletions',
|
|
143
|
+
Parameters: params.deletion
|
|
144
|
+
}, this.ContextUser);
|
|
145
|
+
if (deleteResult?.Success) {
|
|
146
|
+
for (const row of deleteResult.Results) {
|
|
147
|
+
changes.push(this.buildDeleteItem(entity, row));
|
|
155
148
|
}
|
|
156
149
|
}
|
|
157
|
-
|
|
158
|
-
deleteResult.Results.forEach(row => {
|
|
159
|
-
const item = new ChangeDetectionItem();
|
|
160
|
-
item.Entity = entity;
|
|
161
|
-
const ck = new CompositeKey();
|
|
162
|
-
// row.RecordID should have a format of Field1|Value1||Field2|Value2, however in some cases there is legacy
|
|
163
|
-
// data in the RecordChange table that just has a single value in it and in that case assuming that the entity
|
|
164
|
-
// in question has a single-valued primary key, we can just use that value as the key, so we need to test for that
|
|
165
|
-
// first and if we find that the RecordID is just a single value, we can use that as the key
|
|
166
|
-
if (row.RecordID.indexOf(CompositeKey.DefaultValueDelimiter) === -1) {
|
|
167
|
-
// there is no field delimiter, so we can assume this is a single value
|
|
168
|
-
ck.LoadFromSingleKeyValuePair(entity.PrimaryKeys[0].Name, row.RecordID); // this is a string like 'Field1Value' (no quotes
|
|
169
|
-
item.LegacyKey = true;
|
|
170
|
-
item.LegacyKeyValue = row.RecordID;
|
|
171
|
-
}
|
|
172
|
-
else
|
|
173
|
-
ck.LoadFromConcatenatedString(row.RecordID); // this is a string like 'Field1Value|Field2Value' (no quotes)
|
|
174
|
-
item.PrimaryKey = ck;
|
|
175
|
-
item.Type = 'Delete';
|
|
176
|
-
item.ChangedAt = row.ChangedAt;
|
|
177
|
-
item.Changes = []; // not relevant because the row is now deleted
|
|
178
|
-
changes.push(item);
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
await this.GetLatestDatabaseRecords(md, changes); // load everything from the database in one step
|
|
182
|
-
// now we have latest records, go back through and update the Changes field for the UPDATE types
|
|
150
|
+
// Determine field-level changes for updates
|
|
183
151
|
for (const c of changes) {
|
|
184
152
|
if (c.Type === 'Update') {
|
|
185
|
-
const
|
|
186
|
-
c.Changes =
|
|
153
|
+
const result = await this.DetermineRecordChanges(md, c);
|
|
154
|
+
c.Changes = result.changes;
|
|
187
155
|
}
|
|
188
156
|
}
|
|
189
|
-
return {
|
|
190
|
-
Success: true,
|
|
191
|
-
Changes: changes
|
|
192
|
-
};
|
|
157
|
+
return { Success: true, Changes: changes };
|
|
193
158
|
}
|
|
194
159
|
catch (e) {
|
|
195
160
|
LogError(e);
|
|
196
|
-
return {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
161
|
+
return { Success: false, ErrorMessage: e.message, Changes: [] };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Validates that entity is non-null and in the eligible list.
|
|
166
|
+
*/
|
|
167
|
+
validateEntityEligibility(entity) {
|
|
168
|
+
if (!entity)
|
|
169
|
+
throw new Error("entity parameter is required");
|
|
170
|
+
if (!this.EligibleEntities.find(e => UUIDsEqual(e.ID, entity.ID)))
|
|
171
|
+
throw new Error(`Entity ${entity.Name} is not eligible for external change detection. Refer to the documentation on the EligibleEntities and IneligibleEntities properties for more information.`);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Builds the template parameter objects for all three detection queries.
|
|
175
|
+
*/
|
|
176
|
+
buildDetectionParams(entity) {
|
|
177
|
+
const base = {
|
|
178
|
+
EntityID: entity.ID,
|
|
179
|
+
SchemaName: entity.SchemaName,
|
|
180
|
+
BaseView: entity.BaseView,
|
|
181
|
+
PrimaryKeyJoin: this.getPrimaryKeyString(entity, 'ot'),
|
|
182
|
+
PrimaryKeyOrderBy: entity.PrimaryKeys.map(pk => `ot.${this._dialect.QuoteIdentifier(pk.Name)}`).join(', ')
|
|
183
|
+
};
|
|
184
|
+
return {
|
|
185
|
+
creation: {
|
|
186
|
+
...base,
|
|
187
|
+
CreatedAtField: EntityInfo.CreatedAtFieldName,
|
|
188
|
+
UpdatedAtField: EntityInfo.UpdatedAtFieldName
|
|
189
|
+
},
|
|
190
|
+
update: {
|
|
191
|
+
...base,
|
|
192
|
+
UpdatedAtField: EntityInfo.UpdatedAtFieldName
|
|
193
|
+
},
|
|
194
|
+
deletion: {
|
|
195
|
+
EntityID: base.EntityID,
|
|
196
|
+
SchemaName: base.SchemaName,
|
|
197
|
+
BaseView: base.BaseView,
|
|
198
|
+
PrimaryKeyJoin: base.PrimaryKeyJoin,
|
|
199
|
+
PrimaryKeyIsNull: entity.PrimaryKeys.map(pk => `ot.${this._dialect.QuoteIdentifier(pk.Name)} IS NULL`).join(' AND ')
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Runs a detection query in pages of DETECTION_PAGE_SIZE, calling the
|
|
205
|
+
* provided handler for each result row. Stops when a page returns fewer
|
|
206
|
+
* rows than the page size.
|
|
207
|
+
*
|
|
208
|
+
* If a page query fails (timeout, connection error, etc.), logs the error
|
|
209
|
+
* and stops pagination for this entity rather than retrying or crashing.
|
|
210
|
+
* The caller's try/catch in DetectChangesForEntity will report partial results.
|
|
211
|
+
*/
|
|
212
|
+
async detectPages(rq, queryName, parameters, handleRow) {
|
|
213
|
+
let startRow = 0;
|
|
214
|
+
for (;;) {
|
|
215
|
+
const result = await rq.RunQuery({
|
|
216
|
+
QueryName: queryName,
|
|
217
|
+
Parameters: parameters,
|
|
218
|
+
MaxRows: DETECTION_PAGE_SIZE,
|
|
219
|
+
StartRow: startRow
|
|
220
|
+
}, this.ContextUser);
|
|
221
|
+
if (!result?.Success) {
|
|
222
|
+
// Query failed (timeout, connection error, etc.) — stop paginating
|
|
223
|
+
// this entity. Don't throw — let the caller report partial results.
|
|
224
|
+
LogError(`Detection query ${queryName} failed at offset ${startRow}: ${result?.ErrorMessage || 'unknown error'}`);
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
if (result.Results.length === 0)
|
|
228
|
+
break;
|
|
229
|
+
for (const row of result.Results) {
|
|
230
|
+
await handleRow(row);
|
|
231
|
+
}
|
|
232
|
+
// If we got fewer rows than requested, this was the last page
|
|
233
|
+
if (result.Results.length < DETECTION_PAGE_SIZE)
|
|
234
|
+
break;
|
|
235
|
+
startRow += DETECTION_PAGE_SIZE;
|
|
201
236
|
}
|
|
202
237
|
}
|
|
203
238
|
/**
|
|
204
|
-
*
|
|
205
|
-
|
|
239
|
+
* Builds a ChangeDetectionItem with PrimaryKey extracted from a query result row.
|
|
240
|
+
*/
|
|
241
|
+
buildChangeItem(entity, row, type) {
|
|
242
|
+
const item = new ChangeDetectionItem();
|
|
243
|
+
item.Entity = entity;
|
|
244
|
+
item.PrimaryKey = new CompositeKey(entity.PrimaryKeys.map(pk => ({
|
|
245
|
+
FieldName: pk.Name,
|
|
246
|
+
Value: row[pk.Name]
|
|
247
|
+
})));
|
|
248
|
+
item.Type = type;
|
|
249
|
+
item.ChangedAt = new Date();
|
|
250
|
+
item.Changes = [];
|
|
251
|
+
return item;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Builds a ChangeDetectionItem for a deletion from a RecordChanges row.
|
|
255
|
+
*/
|
|
256
|
+
buildDeleteItem(entity, row) {
|
|
257
|
+
const item = new ChangeDetectionItem();
|
|
258
|
+
item.Entity = entity;
|
|
259
|
+
const ck = new CompositeKey();
|
|
260
|
+
const recordID = row.RecordID;
|
|
261
|
+
// Legacy data may have a bare value instead of Field|Value format
|
|
262
|
+
if (recordID.indexOf(CompositeKey.DefaultValueDelimiter) === -1) {
|
|
263
|
+
ck.LoadFromSingleKeyValuePair(entity.PrimaryKeys[0].Name, recordID);
|
|
264
|
+
item.LegacyKey = true;
|
|
265
|
+
item.LegacyKeyValue = recordID;
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
ck.LoadFromConcatenatedString(recordID);
|
|
269
|
+
}
|
|
270
|
+
item.PrimaryKey = ck;
|
|
271
|
+
item.Type = 'Delete';
|
|
272
|
+
item.ChangedAt = row.ChangedAt;
|
|
273
|
+
item.Changes = [];
|
|
274
|
+
return item;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Creates a BaseEntity instance and loads it with data from a query result row.
|
|
278
|
+
* Strips __ecd_ prefixed columns (our timestamp aliases) before loading to
|
|
279
|
+
* avoid "field not found in entity" warnings from BaseEntity.SetMany().
|
|
280
|
+
*/
|
|
281
|
+
async buildEntityFromRow(md, entity, row) {
|
|
282
|
+
const cleanRow = {};
|
|
283
|
+
for (const key of Object.keys(row)) {
|
|
284
|
+
if (!key.startsWith('__ecd_'))
|
|
285
|
+
cleanRow[key] = row[key];
|
|
286
|
+
}
|
|
287
|
+
const record = await md.GetEntityObject(entity.Name, this.ContextUser);
|
|
288
|
+
await record.LoadFromData(cleanRow);
|
|
289
|
+
return record;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Compares the current record with the last RecordChange snapshot to determine field-level changes.
|
|
206
293
|
*/
|
|
207
294
|
async DetermineRecordChanges(md, change) {
|
|
208
295
|
try {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
NewValue: differResult.castValue1, // use the typecast values so they're the right types
|
|
227
|
-
OldValue: differResult.castValue2 // use the typecast values so they're the right types
|
|
228
|
-
});
|
|
229
|
-
}
|
|
296
|
+
const record = change.LatestRecord;
|
|
297
|
+
if (!record)
|
|
298
|
+
return { changes: [], latestRecord: null };
|
|
299
|
+
const result = await this.GetLatestRecordChangesDataForEntityRecord(change);
|
|
300
|
+
const fullRecordJSON = result?.FullRecordJSON;
|
|
301
|
+
if (fullRecordJSON?.length > 0) {
|
|
302
|
+
const json = JSON.parse(fullRecordJSON);
|
|
303
|
+
const changes = [];
|
|
304
|
+
for (const field of record.Fields) {
|
|
305
|
+
if (!field.IsPrimaryKey) {
|
|
306
|
+
const differResult = this.DoValuesDiffer(field.FieldType, field.Value, json[field.Name]);
|
|
307
|
+
if (differResult.differ) {
|
|
308
|
+
changes.push({
|
|
309
|
+
FieldName: field.Name,
|
|
310
|
+
NewValue: differResult.castValue1,
|
|
311
|
+
OldValue: differResult.castValue2
|
|
312
|
+
});
|
|
230
313
|
}
|
|
231
314
|
}
|
|
232
|
-
return { changes, latestRecord: record };
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
LogStatus(` WARNING: No record found, or no FullRecordJSON found, in vwRecordChanges for ${change.Entity.Name}: ${change.PrimaryKey.ToConcatenatedString()}`);
|
|
236
|
-
return { changes: [], latestRecord: record };
|
|
237
315
|
}
|
|
316
|
+
return { changes, latestRecord: record };
|
|
238
317
|
}
|
|
239
318
|
else {
|
|
240
|
-
|
|
241
|
-
return { changes: [], latestRecord:
|
|
319
|
+
LogStatus(` WARNING: No record found, or no FullRecordJSON found, in vwRecordChanges for ${change.Entity.Name}: ${change.PrimaryKey.ToConcatenatedString()}`);
|
|
320
|
+
return { changes: [], latestRecord: record };
|
|
242
321
|
}
|
|
243
322
|
}
|
|
244
323
|
catch (e) {
|
|
@@ -254,14 +333,11 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
|
|
|
254
333
|
castValue1 = value1 ? new Date(value1) : null;
|
|
255
334
|
castValue2 = value2 ? new Date(value2) : null;
|
|
256
335
|
if (castValue1 && castValue2) {
|
|
257
|
-
// check both to see if they're the same - up to 3 digits of precision
|
|
258
|
-
// because when we get the values back into JavaScript objects, Date objects only have 3 digits of precision
|
|
259
336
|
const d1 = castValue1.getTime();
|
|
260
337
|
const d2 = castValue2.getTime();
|
|
261
338
|
return { differ: d1 !== d2, castValue1, castValue2 };
|
|
262
339
|
}
|
|
263
|
-
|
|
264
|
-
return { differ: castValue1 !== castValue2, castValue1, castValue2 };
|
|
340
|
+
return { differ: castValue1 !== castValue2, castValue1, castValue2 };
|
|
265
341
|
case EntityFieldTSType.Number:
|
|
266
342
|
castValue1 = value1 ? parseFloat(value1) : 0;
|
|
267
343
|
castValue2 = value2 ? parseFloat(value2) : 0;
|
|
@@ -295,82 +371,10 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
|
|
|
295
371
|
ExtraFilter: `EntityID = '${change.Entity.ID}' AND RecordID = '${change.PrimaryKey.ToConcatenatedString()}' AND Type IN ('Update', 'Create')`,
|
|
296
372
|
OrderBy: "ChangedAt DESC"
|
|
297
373
|
}, this.ContextUser);
|
|
298
|
-
if (result
|
|
374
|
+
if (result?.Success && result.Results.length > 0)
|
|
299
375
|
return result.Results[0];
|
|
300
|
-
}
|
|
301
|
-
else
|
|
302
|
-
return null;
|
|
303
|
-
}
|
|
304
|
-
catch (e) {
|
|
305
|
-
LogError(e);
|
|
306
376
|
return null;
|
|
307
377
|
}
|
|
308
|
-
}
|
|
309
|
-
async GetLatestDatabaseRecords(md, changes) {
|
|
310
|
-
try {
|
|
311
|
-
const provider = Metadata.Provider;
|
|
312
|
-
// distinct list of entities
|
|
313
|
-
const entities = [];
|
|
314
|
-
for (const c of changes) {
|
|
315
|
-
if (c.Type === 'Update' || c.Type === 'Create') {
|
|
316
|
-
let entry = entities.find(e => UUIDsEqual(e.entity.ID, c.Entity.ID));
|
|
317
|
-
if (!entry) {
|
|
318
|
-
entry = { entity: c.Entity, keys: [] };
|
|
319
|
-
entities.push(entry);
|
|
320
|
-
}
|
|
321
|
-
entry.keys.push(c.PrimaryKey);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
// now we have a distinct list of entities and all of the pkeys for each one, so we can run a single
|
|
325
|
-
// select statement for each entity
|
|
326
|
-
for (const e of entities) {
|
|
327
|
-
const quotedTable = this._dialect.QuoteSchema(e.entity.SchemaName, e.entity.BaseView);
|
|
328
|
-
const sql = `SELECT * FROM ${quotedTable}
|
|
329
|
-
WHERE ${e.keys.map(k => `(${k.KeyValuePairs.map(kvp => {
|
|
330
|
-
const f = e.entity.Fields.find(f => kvp.FieldName.trim().toLowerCase() === f.Name.trim().toLowerCase());
|
|
331
|
-
const needsQuotes = f?.NeedsQuotes || typeof kvp.Value === 'string';
|
|
332
|
-
const quotes = needsQuotes ? "'" : "";
|
|
333
|
-
const quotedField = this._dialect.QuoteIdentifier(kvp.FieldName);
|
|
334
|
-
const escapedValue = typeof kvp.Value === 'string' ? kvp.Value.replace(/'/g, "''") : kvp.Value;
|
|
335
|
-
return `${quotedField}=${quotes}${escapedValue}${quotes}`;
|
|
336
|
-
}).join(' AND ')})`).join(' OR ')} `;
|
|
337
|
-
const result = await provider.ExecuteSQL(sql);
|
|
338
|
-
if (result) {
|
|
339
|
-
// we have the rows from the result, now go back through each of the changes we have in the changes array
|
|
340
|
-
// and associate the data with each one
|
|
341
|
-
for (const r of result) {
|
|
342
|
-
const kvp = e.entity.PrimaryKeys.map(pk => {
|
|
343
|
-
return {
|
|
344
|
-
FieldName: pk.Name,
|
|
345
|
-
Value: r[pk.Name]
|
|
346
|
-
};
|
|
347
|
-
});
|
|
348
|
-
const changeItem = changes.find(ci => ci.Entity === e.entity && ci.PrimaryKey.EqualsKey(kvp));
|
|
349
|
-
if (changeItem) {
|
|
350
|
-
// found the match, update latest Record
|
|
351
|
-
const record = await md.GetEntityObject(changeItem.Entity.Name, this.ContextUser);
|
|
352
|
-
await record.LoadFromData(r);
|
|
353
|
-
changeItem.LatestRecord = record;
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
return true;
|
|
359
|
-
}
|
|
360
|
-
catch (e) {
|
|
361
|
-
LogError(e);
|
|
362
|
-
return false;
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
async GetLatestDatabaseRecord(md, change) {
|
|
366
|
-
try {
|
|
367
|
-
const record = await md.GetEntityObject(change.Entity.Name, this.ContextUser);
|
|
368
|
-
if (await record.InnerLoad(change.PrimaryKey)) {
|
|
369
|
-
return record;
|
|
370
|
-
}
|
|
371
|
-
else
|
|
372
|
-
return null;
|
|
373
|
-
}
|
|
374
378
|
catch (e) {
|
|
375
379
|
LogError(e);
|
|
376
380
|
return null;
|
|
@@ -384,55 +388,239 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
|
|
|
384
388
|
return entity.PrimaryKeys.map(pk => `'${pk.Name}${CompositeKey.DefaultValueDelimiter}' ${concatOp} ${castToText(`${table}.${quote(pk.Name)}`)}`).join(` ${concatOp} '${CompositeKey.DefaultFieldDelimiter}' ${concatOp} `);
|
|
385
389
|
}
|
|
386
390
|
/**
|
|
387
|
-
*
|
|
391
|
+
* Row count thresholds for dynamic concurrency. Entities are sorted smallest-first
|
|
392
|
+
* and processed with a concurrency level appropriate to their size.
|
|
393
|
+
* Conservative values to avoid overwhelming production databases where
|
|
394
|
+
* detection queries use string-concat PK joins that force full table scans.
|
|
395
|
+
*/
|
|
396
|
+
static { this.CONCURRENCY_TIERS = [
|
|
397
|
+
{ maxRows: 1_000, concurrency: 5 }, // tiny tables
|
|
398
|
+
{ maxRows: 10_000, concurrency: 3 }, // small tables
|
|
399
|
+
{ maxRows: 50_000, concurrency: 2 }, // medium tables
|
|
400
|
+
{ maxRows: Infinity, concurrency: 1 }, // large tables — one at a time
|
|
401
|
+
]; }
|
|
402
|
+
/**
|
|
403
|
+
* Detects and replays external changes for the specified entities in an interleaved
|
|
404
|
+
* fashion: each entity's changes are detected, replayed, and then discarded before
|
|
405
|
+
* moving to the next entity. This keeps memory bounded to one entity's changes at
|
|
406
|
+
* a time rather than accumulating all changes across all entities.
|
|
407
|
+
*
|
|
408
|
+
* Entity concurrency is dynamically determined from approximate row counts
|
|
409
|
+
* (via sys.partitions) so small tables run in parallel while large tables
|
|
410
|
+
* don't overwhelm the DB.
|
|
411
|
+
*
|
|
412
|
+
* Production safety mechanisms:
|
|
413
|
+
* - **Circuit breaker**: Aborts if >50% of entities fail
|
|
414
|
+
* - **Cooldown**: Pauses 30s after 5 consecutive failures
|
|
415
|
+
* - **Heap guard**: Stops if heap usage exceeds 85%
|
|
416
|
+
*
|
|
388
417
|
* @param entities Array of entities to process
|
|
389
|
-
* @param
|
|
390
|
-
* @
|
|
418
|
+
* @param replayBatchSize Concurrent replays per entity. Defaults to 20.
|
|
419
|
+
* @param maxConcurrency Max parallel entity detection. Defaults to 5.
|
|
420
|
+
* @param staleTimeoutHours Hours before a stuck run is considered stale. Defaults to 24.
|
|
421
|
+
* @returns Summary with success status and aggregate counts
|
|
391
422
|
*/
|
|
392
|
-
async
|
|
423
|
+
async DetectAndReplayChanges(entities, replayBatchSize = 20, maxConcurrency = 5, staleTimeoutHours = 24) {
|
|
424
|
+
if (!entities || entities.length === 0)
|
|
425
|
+
throw new Error("entities parameter is required and must have at least one entity");
|
|
426
|
+
const rowCounts = await this.getApproxRowCounts(entities);
|
|
427
|
+
const sortedEntities = rowCounts.size > 0
|
|
428
|
+
? [...entities].sort((a, b) => (rowCounts.get(a.ID) ?? 0) - (rowCounts.get(b.ID) ?? 0))
|
|
429
|
+
: entities;
|
|
430
|
+
LogStatus(`Detecting and replaying changes for ${sortedEntities.length} entities with dynamic concurrency (max ${maxConcurrency})`);
|
|
431
|
+
// Start the replay run record (ensures no concurrent runs)
|
|
432
|
+
const run = await this.StartRun(staleTimeoutHours);
|
|
433
|
+
const replayProviders = await this.createReplayProviders(replayBatchSize);
|
|
434
|
+
let entitiesProcessed = 0;
|
|
435
|
+
let entitiesFailed = 0;
|
|
436
|
+
let consecutiveFailures = 0;
|
|
437
|
+
let totalDetected = 0;
|
|
438
|
+
let totalReplayed = 0;
|
|
439
|
+
let aborted = false;
|
|
440
|
+
let i = 0;
|
|
393
441
|
try {
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
442
|
+
while (i < sortedEntities.length && !aborted) {
|
|
443
|
+
// Heap guard
|
|
444
|
+
if (this.isHeapPressureHigh()) {
|
|
445
|
+
LogStatus(` ⚠ Heap usage exceeds ${Math.round(HEAP_USAGE_LIMIT_PERCENT * 100)}%, stopping to prevent OOM (${entitiesProcessed}/${sortedEntities.length} processed)`);
|
|
446
|
+
aborted = true;
|
|
447
|
+
break;
|
|
448
|
+
}
|
|
449
|
+
// Circuit breaker
|
|
450
|
+
if (entitiesProcessed >= 10 && entitiesFailed / entitiesProcessed > FAILURE_ABORT_THRESHOLD) {
|
|
451
|
+
LogStatus(` ⚠ Circuit breaker: ${entitiesFailed}/${entitiesProcessed} entities failed, aborting`);
|
|
452
|
+
aborted = true;
|
|
453
|
+
break;
|
|
454
|
+
}
|
|
455
|
+
// Dynamic concurrency for detection (entities run in parallel)
|
|
456
|
+
const dynamicSize = this.getConcurrencyForEntity(sortedEntities[i], rowCounts);
|
|
457
|
+
const concurrency = Math.min(dynamicSize, maxConcurrency);
|
|
458
|
+
const batch = sortedEntities.slice(i, i + concurrency);
|
|
459
|
+
// Detect changes for this batch of entities in parallel
|
|
405
460
|
const batchPromises = batch.map(e => {
|
|
406
|
-
|
|
461
|
+
const rows = rowCounts?.get(e.ID);
|
|
462
|
+
const rowInfo = rows != null ? ` (~${rows.toLocaleString()} rows)` : '';
|
|
463
|
+
UpdateCurrentConsoleLine(` Detecting: ${e.Name}${rowInfo}`, ConsoleColor.gray);
|
|
407
464
|
return this.DetectChangesForEntity(e);
|
|
408
465
|
});
|
|
409
466
|
const batchResults = await Promise.all(batchPromises);
|
|
467
|
+
// Replay each entity's changes immediately, then discard
|
|
410
468
|
for (let j = 0; j < batch.length; j++) {
|
|
411
|
-
const
|
|
412
|
-
const
|
|
413
|
-
|
|
414
|
-
|
|
469
|
+
const entity = batch[j];
|
|
470
|
+
const detection = batchResults[j];
|
|
471
|
+
entitiesProcessed++;
|
|
472
|
+
if (!detection.Success) {
|
|
473
|
+
entitiesFailed++;
|
|
474
|
+
consecutiveFailures++;
|
|
475
|
+
UpdateCurrentConsoleProgress(` Failed: ${entity.Name}`, entitiesProcessed, sortedEntities.length, ConsoleColor.crimson);
|
|
476
|
+
continue;
|
|
415
477
|
}
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
478
|
+
const changeCount = detection.Changes.length;
|
|
479
|
+
totalDetected += changeCount;
|
|
480
|
+
if (changeCount > 0) {
|
|
481
|
+
const replayed = await this.replayEntityChanges(detection.Changes, replayProviders, replayBatchSize);
|
|
482
|
+
totalReplayed += replayed;
|
|
419
483
|
}
|
|
420
|
-
|
|
484
|
+
consecutiveFailures = 0;
|
|
485
|
+
UpdateCurrentConsoleProgress(` Done: ${entity.Name} (${changeCount} changes)`, entitiesProcessed, sortedEntities.length, ConsoleColor.cyan);
|
|
486
|
+
// Changes go out of scope here — GC can reclaim the BaseEntity objects
|
|
487
|
+
}
|
|
488
|
+
i += batch.length;
|
|
489
|
+
// Cooldown after consecutive failures
|
|
490
|
+
if (consecutiveFailures >= CONSECUTIVE_FAILURE_COOLDOWN_THRESHOLD && i < sortedEntities.length) {
|
|
491
|
+
LogStatus(` ⏸ ${consecutiveFailures} consecutive failures, pausing ${COOLDOWN_PAUSE_MS / 1000}s...`);
|
|
492
|
+
await new Promise(resolve => setTimeout(resolve, COOLDOWN_PAUSE_MS));
|
|
493
|
+
consecutiveFailures = 0;
|
|
421
494
|
}
|
|
422
495
|
}
|
|
423
|
-
|
|
496
|
+
run.Status = aborted ? 'Error' : 'Complete';
|
|
497
|
+
run.EndedAt = new Date();
|
|
498
|
+
await run.Save();
|
|
499
|
+
const summary = `${entitiesProcessed} entities processed, ${entitiesFailed} failed, ${totalDetected} changes detected, ${totalReplayed} replayed`;
|
|
500
|
+
LogStatus(`Run complete: ${summary}`);
|
|
501
|
+
return {
|
|
502
|
+
Success: entitiesFailed === 0 && !aborted,
|
|
503
|
+
ErrorMessage: aborted ? `Aborted after ${entitiesProcessed} entities` : undefined,
|
|
504
|
+
TotalDetected: totalDetected,
|
|
505
|
+
TotalReplayed: totalReplayed,
|
|
506
|
+
EntitiesProcessed: entitiesProcessed,
|
|
507
|
+
EntitiesFailed: entitiesFailed
|
|
508
|
+
};
|
|
424
509
|
}
|
|
425
510
|
catch (e) {
|
|
426
511
|
LogError(e);
|
|
512
|
+
run.Status = 'Error';
|
|
513
|
+
run.EndedAt = new Date();
|
|
514
|
+
await run.Save();
|
|
427
515
|
return {
|
|
428
516
|
Success: false,
|
|
429
|
-
ErrorMessage: e.message,
|
|
430
|
-
|
|
517
|
+
ErrorMessage: e instanceof Error ? e.message : String(e),
|
|
518
|
+
TotalDetected: totalDetected,
|
|
519
|
+
TotalReplayed: totalReplayed,
|
|
520
|
+
EntitiesProcessed: entitiesProcessed,
|
|
521
|
+
EntitiesFailed: entitiesFailed
|
|
431
522
|
};
|
|
432
523
|
}
|
|
433
524
|
}
|
|
434
|
-
|
|
435
|
-
|
|
525
|
+
/**
|
|
526
|
+
* Replays a single entity's changes and returns the count of successful replays.
|
|
527
|
+
* Changes are processed in batches for concurrency but the entire set is for
|
|
528
|
+
* one entity only, keeping memory bounded.
|
|
529
|
+
*/
|
|
530
|
+
async replayEntityChanges(changes, providers, batchSize) {
|
|
531
|
+
let successCount = 0;
|
|
532
|
+
for (let i = 0; i < changes.length; i += batchSize) {
|
|
533
|
+
const batch = changes.slice(i, i + batchSize);
|
|
534
|
+
const results = await Promise.all(batch.map((c, idx) => this.ReplayChange(providers[idx], c)));
|
|
535
|
+
successCount += results.filter(r => r).length;
|
|
536
|
+
}
|
|
537
|
+
return successCount;
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Checks whether Node.js heap usage is approaching the V8 heap limit.
|
|
541
|
+
* Uses v8.getHeapStatistics().heap_size_limit which is the actual max
|
|
542
|
+
* (set by --max-old-space-size or V8's default), not the currently
|
|
543
|
+
* allocated heapTotal which starts small and grows on demand.
|
|
544
|
+
*/
|
|
545
|
+
isHeapPressureHigh() {
|
|
546
|
+
const stats = getHeapStatistics();
|
|
547
|
+
const usedRatio = stats.used_heap_size / stats.heap_size_limit;
|
|
548
|
+
return usedRatio > HEAP_USAGE_LIMIT_PERCENT;
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Queries sys.partitions for fast approximate row counts (no table scans).
|
|
552
|
+
* Returns a Map of entityID → approx row count.
|
|
553
|
+
*/
|
|
554
|
+
async getApproxRowCounts(entities) {
|
|
555
|
+
try {
|
|
556
|
+
const provider = Metadata.Provider;
|
|
557
|
+
const entityIDs = entities.map(e => `'${e.ID}'`).join(',');
|
|
558
|
+
const sql = `
|
|
559
|
+
SELECT
|
|
560
|
+
e.ID,
|
|
561
|
+
ISNULL(SUM(p.rows), 0) AS ApproxRows
|
|
562
|
+
FROM ${provider.MJCoreSchemaName}.vwEntities e
|
|
563
|
+
LEFT JOIN sys.partitions p
|
|
564
|
+
ON p.object_id = OBJECT_ID(e.SchemaName + '.' + e.BaseTable)
|
|
565
|
+
AND p.index_id IN (0, 1)
|
|
566
|
+
WHERE e.ID IN (${entityIDs})
|
|
567
|
+
GROUP BY e.ID
|
|
568
|
+
`;
|
|
569
|
+
const rows = await provider.ExecuteSQL(sql);
|
|
570
|
+
const map = new Map();
|
|
571
|
+
if (rows) {
|
|
572
|
+
for (const row of rows) {
|
|
573
|
+
map.set(row.ID, row.ApproxRows);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
return map;
|
|
577
|
+
}
|
|
578
|
+
catch (e) {
|
|
579
|
+
LogStatus(' Warning: Could not fetch row counts for dynamic concurrency, using default batch size');
|
|
580
|
+
return new Map();
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
584
|
+
* Determines the concurrency level for an entity based on its approximate row count.
|
|
585
|
+
*/
|
|
586
|
+
getConcurrencyForEntity(entity, rowCounts) {
|
|
587
|
+
if (!rowCounts || rowCounts.size === 0)
|
|
588
|
+
return 2;
|
|
589
|
+
const rows = rowCounts.get(entity.ID) ?? 0;
|
|
590
|
+
for (const tier of ExternalChangeDetectorEngine.CONCURRENCY_TIERS) {
|
|
591
|
+
if (rows <= tier.maxRows)
|
|
592
|
+
return tier.concurrency;
|
|
593
|
+
}
|
|
594
|
+
return 1;
|
|
595
|
+
}
|
|
596
|
+
/**
|
|
597
|
+
* @deprecated Use DetectAndReplayChanges() instead, which interleaves detection and replay
|
|
598
|
+
* per entity to keep memory bounded. This method accumulates all changes in memory.
|
|
599
|
+
*/
|
|
600
|
+
async DetectChangesForEntities(entities, maxConcurrency = 5) {
|
|
601
|
+
if (!entities)
|
|
602
|
+
throw new Error("entities parameter is required");
|
|
603
|
+
if (entities.length === 0)
|
|
604
|
+
throw new Error("entities parameter must have at least one entity in it");
|
|
605
|
+
const result = new ChangeDetectionResult();
|
|
606
|
+
result.Success = true;
|
|
607
|
+
result.Changes = [];
|
|
608
|
+
for (const entity of entities) {
|
|
609
|
+
const r = await this.DetectChangesForEntity(entity);
|
|
610
|
+
if (r.Success)
|
|
611
|
+
result.Changes.push(...r.Changes);
|
|
612
|
+
else {
|
|
613
|
+
result.Success = false;
|
|
614
|
+
result.ErrorMessage = (result.ErrorMessage || '') + `\n${entity.Name}: ${r.ErrorMessage}`;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
return result;
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* @deprecated Use DetectAndReplayChanges() instead.
|
|
621
|
+
*/
|
|
622
|
+
async DetectChangesForAllEligibleEntities(maxConcurrency) {
|
|
623
|
+
return await this.DetectChangesForEntities(this.EligibleEntities, maxConcurrency);
|
|
436
624
|
}
|
|
437
625
|
/**
|
|
438
626
|
* This method will replay all of the items in the changes array
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeDetector.js","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChangeDetector.js","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/external-change-detection",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "5.
|
|
4
|
+
"version": "5.15.0",
|
|
5
5
|
"description": "Library used by server side applications to determine if changes have been made to entities by external systems/integrations",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
"typescript": "^5.9.3"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@memberjunction/core": "5.
|
|
24
|
-
"@memberjunction/core-entities": "5.
|
|
25
|
-
"@memberjunction/global": "5.
|
|
26
|
-
"@memberjunction/sql-dialect": "5.
|
|
27
|
-
"@memberjunction/sqlserver-dataprovider": "5.
|
|
23
|
+
"@memberjunction/core": "5.15.0",
|
|
24
|
+
"@memberjunction/core-entities": "5.15.0",
|
|
25
|
+
"@memberjunction/global": "5.15.0",
|
|
26
|
+
"@memberjunction/sql-dialect": "5.15.0",
|
|
27
|
+
"@memberjunction/sqlserver-dataprovider": "5.15.0"
|
|
28
28
|
},
|
|
29
29
|
"repository": {
|
|
30
30
|
"type": "git",
|