예제 #1
0
        public void Setup()
        {
            _reader = new CSVReader(Path.Combine(Common.TestDataPath, "lakeTutira120120110648_extra_small.csv"));
            _ds = new Dataset(_s, _reader.ReadSensors());
            var sensorVariables = SensorVariable.CreateSensorVariablesFromSensors(_ds.Sensors);
            foreach (var sensor in _ds.Sensors)
            {
                sensor.Owner = _ds;
                sensor.Variable = sensorVariables.FirstOrDefault(x => x.Sensor == sensor);
            }

            _eval = new FormulaEvaluator(_ds.Sensors);
        }
예제 #2
0
        /// <summary>
        /// starts an import of data
        /// </summary>
        /// <param name="filename">filepath of data file</param>
        public void Import(string filename)
        {
            DisableFeatures();
            var result = new List<Sensor>();

            ShowProgressArea = true;
            ProgressIndeterminate = false;
            ProgressValue = 0;

            var reader = new CSVReader(filename);

            reader.ProgressChanged += (sender, args) =>
                                          {
                                              ProgressValue = args.Progress;
                                              WaitEventString =
                                                  string.Format("Importing from {0} {1}%",
                                                                filename,
                                                                ProgressValue);
                                          };
            try
            {
                result = reader.ReadSensors(null, CurrentDataset);
            }
            catch (Exception ex)
            {
                Common.ShowMessageBoxWithException("Failed Import", "Bad File Format", false, true, ex);
                result = null;
            }

            if (result == null)
            {
                ShowProgressArea = false;
                EnableFeatures();
                return;
            }

            var sensors = (List<Sensor>)result;

            if (CurrentDataset.Sensors == null || CurrentDataset.Sensors.Count == 0)
            {
                CurrentDataset.Sensors = sensors;
                CurrentDataset.HighestYearLoaded = NumberOfDataChunks() - 1;
            }
            else
            {
                var askUser =
                    _container.GetInstance(typeof(SpecifyValueViewModel),
                                           "SpecifyValueViewModel") as
                    SpecifyValueViewModel;

                if (askUser == null)
                {
                    Common.ShowMessageBox("EPIC FAIL", "RUN AROUND WITH NO REASON",
                                          false, true);
                    return;
                }

                askUser.ComboBoxItems = new List<string> { "Keep old values", "Keep new values" };
                askUser.Text = "Keep old values";
                askUser.ShowComboBox = true;
                askUser.Message = "How do you want to handle overlapping points. Note this will also overwrite empty or missing values within the overlaping period";
                askUser.CanEditComboBox = false;
                askUser.ComboBoxSelectedIndex = 0;
                askUser.Title = "Importing";

                _windowManager.ShowDialog(askUser);

                var keepOldValues = askUser.ComboBoxSelectedIndex == 0;

                var sensorMatchView =
                    _container.GetInstance(typeof(MatchToExistingSensorsViewModel),
                                           "MatchToExistingSensorsViewModel") as
                    MatchToExistingSensorsViewModel;

                if (sensorMatchView == null)
                    return;

                sensorMatchView.ExistingSensors = CurrentDataset.Sensors;
                sensorMatchView.NewSensors = sensors;

                _windowManager.ShowDialog(sensorMatchView);

                var orderedTimestamps = sensors.SelectMany(x => x.CurrentState.Values).Select(x => x.Key).Distinct().ToArray();
                var firstTimestamp = orderedTimestamps.Min();
                var lastTimestamp = orderedTimestamps.Max();
                orderedTimestamps = new DateTime[0];
                var highestYear = NumberOfDataChunks() - 1;

                var firstNewYear = firstTimestamp.Year - CurrentDataset.StartYear.Year;

                if (firstNewYear < CurrentDataset.LowestYearLoaded)
                {
                    CurrentDataset.LoadInSensorData(firstNewYear < 0 ?
                           Enumerable.Range(0, CurrentDataset.LowestYearLoaded).ToArray()
                         : Enumerable.Range(firstNewYear, CurrentDataset.LowestYearLoaded - firstNewYear).ToArray(), true);
                }

                var lastNewYear = lastTimestamp.Year - CurrentDataset.StartYear.Year;
                var reason = ChangeReason.AddNewChangeReason("[Importer] Imported new values on " + DateTime.Now);
                if (lastNewYear > CurrentDataset.HighestYearLoaded)
                {
                    CurrentDataset.LoadInSensorData(lastNewYear > highestYear ?
                        Enumerable.Range(CurrentDataset.HighestYearLoaded + 1, highestYear - CurrentDataset.HighestYearLoaded).ToArray()
                      : Enumerable.Range(CurrentDataset.HighestYearLoaded + 1, lastNewYear - CurrentDataset.HighestYearLoaded).ToArray(), true);
                }

                foreach (var newSensor in sensors)
                {
                    var match =
                        sensorMatchView.SensorLinks.FirstOrDefault(
                            x => x.MatchingSensor == newSensor);
                    if (match == null)
                    {
                        Debug.WriteLine("Adding new sensor");
                        CurrentDataset.Sensors.Add(newSensor);
                    }
                    else
                    {
                        var matchingSensor =
                            CurrentDataset.Sensors.FirstOrDefault(
                                x => x == match.ExistingSensor);

                        if (matchingSensor == null)
                        {
                            Debug.WriteLine(
                                "Failed to find the sensor again, embarrasing!");
                            continue;
                        }

                        Debug.WriteLine("Merging sensors");
                        //Otherwise clone the current state
                        var newState = matchingSensor.CurrentState.Clone();
                        //Check to see if values are inserted
                        var insertedValues = false;

                        //And add values for any new dates we want
                        foreach (var value in newSensor.CurrentState.Values.Where(value =>
                                    !keepOldValues || !(matchingSensor.CurrentState.Values.ContainsKey(value.Key) || matchingSensor.RawData.Values.ContainsKey(value.Key))))
                        {
                            newState.Values[value.Key] = value.Value;
                            if (matchingSensor.CurrentState.Values.ContainsKey(value.Key) || matchingSensor.RawData.Values.ContainsKey(value.Key))
                                newState.AddToChanges(value.Key, reason.ID);
                            matchingSensor.RawData.Values[value.Key] = value.Value;
                            insertedValues = true;
                        }

                        if (insertedValues)
                        {
                            //Give a reason
                            newState.Reason = reason;
                            //Insert new state
                            matchingSensor.AddState(newState);
                            matchingSensor.ClearUndoStates();
                            EventLogger.LogSensorInfo(CurrentDataset,
                                                      matchingSensor.Name,
                                                      "Added values from new import");
                        }
                    }
                }
                CurrentDataset.CalculateDataSetValues();
                if (CurrentDataset.HighestYearLoaded == highestYear)
                    CurrentDataset.HighestYearLoaded = NumberOfDataChunks() - 1;
            }

            UpdateGUI();

            if (Sensors.FirstOrDefault(x => x.Variable == null) != null)
            {
                var sensorVariables = SensorVariable.CreateSensorVariablesFromSensors(Sensors);
                foreach (var sensor in Sensors)
                {
                    sensor.Variable = sensorVariables.FirstOrDefault(x => x.Sensor == sensor);
                }
            }
            _evaluator = new FormulaEvaluator(Sensors);
            _dateAnnotator.DataInterval = CurrentDataset.DataInterval;

            ShowProgressArea = false;
            EnableFeatures();
            NotifyOfPropertyChange(() => LowestYearLoadedOptions);
            NotifyOfPropertyChange(() => HighestYearLoadedOptions);
            NotifyOfPropertyChange(() => LowestYearLoaded);
            NotifyOfPropertyChange(() => HighestYearLoaded);

            CurrentDataset.SaveToFile();
        }