From 33a04f4022968248354289d9bd1b004d216df01c Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Wed, 7 Jan 2026 08:01:23 -0500 Subject: [PATCH] feat(datasync): implement GetRecentUpdatesAsync and GetLastRunsAsync - GetRecentUpdatesAsync: Returns last N DataUpdate records for a table, optionally filtered by UpdateType, ordered by StartDt descending - GetLastRunsAsync: Returns the most recent run (successful or not) for each UpdateType for a given table using a CTE with ROW_NUMBER --- .../Services/DataUpdateRepository.cs | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/NEW/src/JdeScoping.DataSync/Services/DataUpdateRepository.cs b/NEW/src/JdeScoping.DataSync/Services/DataUpdateRepository.cs index 3d21263..f0aa012 100644 --- a/NEW/src/JdeScoping.DataSync/Services/DataUpdateRepository.cs +++ b/NEW/src/JdeScoping.DataSync/Services/DataUpdateRepository.cs @@ -256,4 +256,54 @@ FROM LastSuccessful"; return lastSync.Value < overdueThreshold; } + + /// + public async Task> GetRecentUpdatesAsync( + string tableName, + UpdateTypes? updateType = null, + int count = 30, + CancellationToken cancellationToken = default) + { + var sql = updateType.HasValue + ? @"SELECT TOP (@count) du.Id, du.SourceSystem, du.SourceData, du.TableName, + du.StartDt, du.EndDt, du.UpdateType, du.WasSuccessful, du.NumberRecords + FROM dbo.DataUpdate du + WHERE du.TableName = @tableName AND du.UpdateType = @updateType + ORDER BY du.StartDt DESC" + : @"SELECT TOP (@count) du.Id, du.SourceSystem, du.SourceData, du.TableName, + du.StartDt, du.EndDt, du.UpdateType, du.WasSuccessful, du.NumberRecords + FROM dbo.DataUpdate du + WHERE du.TableName = @tableName + ORDER BY du.StartDt DESC"; + + await using var connection = await _connectionFactory.CreateLotFinderConnectionAsync(cancellationToken); + var results = await connection.QueryAsync( + sql, + new { tableName, updateType = updateType.HasValue ? (int)updateType.Value : 0, count }, + commandTimeout: 30); + + return results.ToList(); + } + + /// + public async Task> GetLastRunsAsync( + string tableName, + CancellationToken cancellationToken = default) + { + const string sql = @" +WITH LastRuns AS ( + SELECT du.*, + ROW_NUMBER() OVER (PARTITION BY du.UpdateType ORDER BY du.StartDt DESC) AS RN + FROM dbo.DataUpdate du + WHERE du.TableName = @tableName +) +SELECT Id, SourceSystem, SourceData, TableName, StartDt, EndDt, UpdateType, WasSuccessful, NumberRecords +FROM LastRuns +WHERE RN = 1"; + + await using var connection = await _connectionFactory.CreateLotFinderConnectionAsync(cancellationToken); + var results = await connection.QueryAsync(sql, new { tableName }, commandTimeout: 30); + + return results.ToDictionary(du => du.UpdateType, du => du); + } }