Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
 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);
 }
Exemplo n.º 3
0
        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");
        }
Exemplo n.º 4
0
        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");
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
            }
        }
Exemplo n.º 8
0
        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);
            }
        }