feat: 为 G5 room_status 写入添加强制 online_status 为 1 的功能,并确保冲突时始终更新,即使业务字段未变化
This commit is contained in:
@@ -785,7 +785,7 @@ class DatabaseManager {
|
||||
}
|
||||
|
||||
_buildRoomStatusUpsertQuery(events, target) {
|
||||
const { tableName, conflictColumns, includeGuid, tableRef } = target;
|
||||
const { tableName, conflictColumns, includeGuid, tableRef, forceOnlineStatusOnWrite, forceUpdateOnConflict } = target;
|
||||
const columns = this._getRoomStatusBaseColumns();
|
||||
const uniqueEventsMap = new Map();
|
||||
|
||||
@@ -804,29 +804,43 @@ class DatabaseManager {
|
||||
return { sql: null, values: [], uniqueEvents: [] };
|
||||
}
|
||||
|
||||
const allColumns = includeGuid ? [...columns, 'guid'] : [...columns];
|
||||
const allColumns = forceOnlineStatusOnWrite ? [...columns, 'online_status'] : [...columns];
|
||||
if (includeGuid) {
|
||||
allColumns.push('guid');
|
||||
}
|
||||
const updateColumns = columns.filter((column) => !['ts_ms', ...conflictColumns].includes(column));
|
||||
const updateSet = updateColumns.map((column) => `${column} = EXCLUDED.${column}`).join(', ');
|
||||
const updateAssignments = updateColumns.map((column) => `${column} = EXCLUDED.${column}`);
|
||||
if (forceOnlineStatusOnWrite) {
|
||||
updateAssignments.push('online_status = 1');
|
||||
}
|
||||
const updateSet = updateAssignments.join(', ');
|
||||
const whereConditions = updateColumns.map((column) => `${tableRef}.${column} IS DISTINCT FROM EXCLUDED.${column}`).join(' OR ');
|
||||
|
||||
const values = [];
|
||||
const placeholders = uniqueEvents.map((event, eventIndex) => {
|
||||
const rowValues = this._roomStatusToRowValues(event);
|
||||
if (forceOnlineStatusOnWrite) {
|
||||
rowValues.push(1);
|
||||
}
|
||||
values.push(...rowValues);
|
||||
const start = eventIndex * rowValues.length;
|
||||
const params = rowValues.map((_, valueIndex) => `$${start + valueIndex + 1}`).join(', ');
|
||||
return includeGuid ? `(${params}, gen_random_uuid())` : `(${params})`;
|
||||
}).join(', ');
|
||||
|
||||
const whereClause = forceUpdateOnConflict
|
||||
? ''
|
||||
: `
|
||||
WHERE
|
||||
${tableRef}.ts_ms <= EXCLUDED.ts_ms
|
||||
AND (${whereConditions})`;
|
||||
|
||||
const sql = `
|
||||
INSERT INTO ${tableName} (${allColumns.join(', ')})
|
||||
VALUES ${placeholders}
|
||||
ON CONFLICT (${conflictColumns.join(', ')})
|
||||
DO UPDATE SET
|
||||
${updateSet}
|
||||
WHERE
|
||||
${tableRef}.ts_ms <= EXCLUDED.ts_ms
|
||||
AND (${whereConditions})
|
||||
${updateSet}${whereClause}
|
||||
`;
|
||||
|
||||
return { sql, values, uniqueEvents };
|
||||
@@ -876,6 +890,8 @@ class DatabaseManager {
|
||||
includeGuid: true,
|
||||
autoCreatePartitions: true,
|
||||
tableRef: this.config.roomStatusTable ?? 'room_status.room_status_moment',
|
||||
forceOnlineStatusOnWrite: false,
|
||||
forceUpdateOnConflict: false,
|
||||
logPrefix: 'upsertRoomStatus',
|
||||
});
|
||||
}
|
||||
@@ -887,6 +903,8 @@ class DatabaseManager {
|
||||
includeGuid: false,
|
||||
autoCreatePartitions: false,
|
||||
tableRef: this.config.roomStatusTable ?? 'room_status.room_status_moment_g5',
|
||||
forceOnlineStatusOnWrite: true,
|
||||
forceUpdateOnConflict: true,
|
||||
logPrefix: 'upsertRoomStatusG5',
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user