private int SaveOperation(AdoDataConnection connection, DataRescueOperation operation) { const string QueryFormat = "UPDATE DataRescueOperation " + "SET " + " MeterID = {1}, " + " StartTime = {2}, " + " EndTime = {3} " + "WHERE ID = {0} " + "" + "DECLARE @count INT = @@ROWCOUNT " + "" + "INSERT INTO DataRescueOperation(MeterID, StartTime, EndTime) " + "SELECT {1} MeterID, {2} StartTime, {3} EndTime " + "WHERE @count = 0 " + "" + "DECLARE @id INT = " + "( " + " SELECT @@IDENTITY " + " WHERE @count = 0 " + ") " + "" + "SELECT COALESCE(@id, {0})"; int id = operation.ID; int meterID = operation.MeterID; DateTime startTime = operation.StartTime; DateTime endTime = operation.EndTime; IDbDataParameter startTime2 = ToDateTime2(connection, startTime); IDbDataParameter endTime2 = ToDateTime2(connection, endTime); return(connection.ExecuteScalar <int>(QueryFormat, id, meterID, startTime2, endTime2)); }
private async Task PurgeStaleTrendingDataAsync(DataRescueOperation operation, CancellationToken cancellationToken) { int meterID = operation.MeterID; DateTime startTime = operation.StartTime; DateTime endTime = operation.EndTime; await HIDSClient.DeleteTrendingDataAsync(meterID, startTime, endTime, cancellationToken); }
private void PurgeStaleEventData(AdoDataConnection connection, DataRescueOperation operation) { string baseCriteria = $"FileGroupID IN " + $"( " + $" SELECT FileGroupID " + $" FROM DataRescueFileGroup " + $" WHERE DataRescueOperationID = {operation.ID} " + $")"; CascadeDelete(connection, "Event", baseCriteria); XDANodeClient.NotifyNodes("openXDA.Nodes.dll", "openXDA.Nodes.Types.FilePruning.FilePrunerNode", "PurgeOrphanData"); }
private void ReprocessAffectedFiles(AdoDataConnection connection, DataRescueOperation operation) { const string QueryFormat = "INSERT INTO AnalysisTask(FileGroupID, MeterID, Priority) " + "SELECT " + " DataRescueFileGroup.FileGroupID, " + " {1} MeterID, " + " 1 Priority " + "FROM DataRescueFileGroup " + "WHERE DataRescueFileGroup.DataRescueOperationID = {0}"; int operationID = operation.ID; int meterID = operation.MeterID; connection.ExecuteNonQuery(QueryFormat, operationID, meterID); XDANodeClient.NotifyNodes("openXDA.Nodes.dll", "openXDA.Nodes.Types.Analysis.AnalysisNode", "PollTaskQueue"); }
private void SetAffectedFiles(AdoDataConnection connection, DataRescueOperation operation) { const string QueryFormat = "INSERT INTO DataRescueFileGroup(DataRescueOperationID, FileGroupID) " + "SELECT {0} DataRescueOperationID, FileGroup.ID FileGroupID " + "FROM FileGroup " + "WHERE " + " MeterID = {1} AND " + " DataEndTime >= {2} AND " + " DataStartTime <= {3}"; int operationID = operation.ID; int meterID = operation.MeterID; DateTime startTime = operation.StartTime; DateTime endTime = operation.EndTime; connection.ExecuteNonQuery(QueryFormat, operationID, meterID, startTime, endTime); }
private void SetTimeShift(AdoDataConnection connection, DataRescueOperation operation) { const string InsertUpdateFormat = "UPDATE DataRescueTimeShift " + "SET Ticks = {1} " + "WHERE DataRescueOperationID = {0} " + "" + "DECLARE @count INT = @@ROWCOUNT " + "" + "INSERT INTO DataRescueTimeShift(DataRescueOperationID, Ticks) " + "SELECT {0} DataRescueOperationID, {1} Ticks " + "WHERE @count = 0"; const string DeleteFormat = "DELETE FROM DataRescueTimeShift " + "WHERE DataRescueOperationID = {0}"; int operationID = operation.ID; TimeSpan timeShift = operation.TimeShiftSpan; string queryFormat = (timeShift != TimeSpan.Zero) ? InsertUpdateFormat : DeleteFormat; connection.ExecuteNonQuery(queryFormat, operationID, timeShift.Ticks); }
public async Task PostOperationAsync([FromBody] JObject jOperation, CancellationToken cancellationToken = default) { DataRescueOperation operation = jOperation.ToObject <DataRescueOperation>(); using (AdoDataConnection connection = CreateDbConnection()) { int id = operation.ID; operation.ID = SaveOperation(connection, operation); SetTimeShift(connection, operation); SetChannelAdjustments(connection, operation); if (id != operation.ID) { SetAffectedFiles(connection, operation); } PurgeStaleEventData(connection, operation); await PurgeStaleTrendingDataAsync(operation, cancellationToken); ReprocessAffectedFiles(connection, operation); } }
private void SetChannelAdjustments(AdoDataConnection connection, DataRescueOperation operation) { int operationID = operation.ID; HashSet <int> previouslyAdjusted = new Func <HashSet <int> >(() => { const string QueryFormat = "SELECT ChannelID " + "FROM DataRescueChannelAdjustment " + "WHERE DataRescueOperationID = {0}"; using (DataTable table = connection.RetrieveData(QueryFormat, operationID)) { IEnumerable <int> channelIDs = table .AsEnumerable() .Select(row => row.ConvertField <int>("ChannelID")); return(new HashSet <int>(channelIDs)); } })(); List <DataRescueChannelAdjustment> channelAdjustments = operation.ChannelAdjustments; IEnumerable <DataRescueChannelAdjustment> newAdjustments = channelAdjustments .Where(adjustment => !previouslyAdjusted.Contains(adjustment.ChannelID)); IEnumerable <DataRescueChannelAdjustment> updatedAdjustments = channelAdjustments .Where(adjustment => previouslyAdjusted.Contains(adjustment.ChannelID)); IEnumerable <int> removedAdjustments = previouslyAdjusted .Except(channelAdjustments.Select(adjustment => adjustment.ChannelID)); foreach (DataRescueChannelAdjustment adjustment in newAdjustments) { const string InsertFormat = "INSERT INTO DataRescueChannelAdjustment(DataRescueOperationID, ChannelID, Multiplier, Adder) " + "VALUES({0}, {1}, {2}, {3})"; int channelID = adjustment.ChannelID; double multiplier = adjustment.Multiplier; double adder = adjustment.Adder; connection.ExecuteNonQuery(InsertFormat, operationID, channelID, multiplier, adder); } foreach (DataRescueChannelAdjustment adjustment in updatedAdjustments) { const string UpdateFormat = "UPDATE DataRescueChannelAdjustment " + "SET " + " Multiplier = {2}, " + " Adder = {3} " + "WHERE " + " DataRescueOperationID = {0} AND " + " ChannelID = {1}"; int channelID = adjustment.ChannelID; double multiplier = adjustment.Multiplier; double adder = adjustment.Adder; connection.ExecuteNonQuery(UpdateFormat, operationID, channelID, multiplier, adder); } foreach (int channelID in removedAdjustments) { const string DeleteFormat = "DELETE FROM DataRescueChannelAdjustment " + "WHERE " + " DataRescueOperationID = {0} AND " + " ChannelID = {1}"; connection.ExecuteNonQuery(DeleteFormat, operationID, channelID); } }