Exemplo n.º 1
0
        public void AddDataEntry(CurrencyDataEntry currencyData)
        {
            var data = _currencyDataContext.CurrencyDataEntries.Where(x => x.Equals(currencyData));

            if (!data.Any())
            {
                _currencyDataContext.CurrencyDataEntries.Add(currencyData);

                _currencyDataContext.SaveChanges();
            }
        }
Exemplo n.º 2
0
        private CurrencyDataEntry TryGetSingleDatabaseData(DateTime time, CurrencyCodeEntry codeEntry)
        {
            CurrencyDataEntry result = null;

            var dbEntries = _currencyRepository.GetDataEntries().Where(data => data.ActualDate.Date == time.Date && codeEntry.Equals(data.DbCurrencyCodeEntry));

            //var dbCode = _currencyRepository.GetCodeEntries().First(x => x.Equals(code));

            if (dbEntries.Any())
            {
                result = dbEntries.First();
                result.DbCurrencyCodeEntry = codeEntry;
            }

            return(result);
        }
Exemplo n.º 3
0
        public IDictionary <CurrencyCodeEntry, List <CurrencyDataEntry> > RequestPeriodData(ChartTimePeriod timePeriod, ICollection <CurrencyCodeEntry> codes)
        {
            IDictionary <CurrencyCodeEntry, List <CurrencyDataEntry> > periodCurrencyData =
                new Dictionary <CurrencyCodeEntry, List <CurrencyDataEntry> >();

            DateTime beginTime = SelectWorkingDate(timePeriod.Begin, DateSelection.BeforeWeekends);
            DateTime endTime   = SelectWorkingDate(timePeriod.End, DateSelection.AfterWeekends);


            foreach (CurrencyCodeEntry code in codes)
            {
                // Try get from database.
                var dbEntries = TryGetPeriodDatabaseData(beginTime, endTime, code);

                List <CurrencyDataEntry> correctedEntries = null;

                if (dbEntries == null)
                {
                    correctedEntries = new List <CurrencyDataEntry>();
                }
                else
                {
                    correctedEntries = dbEntries.ToList();
                }

                CurrencyDataEntry lastSingleData = null;
                CurrencyDataEntry tempSingleData = null;

                // Check currency data per date.
                for (DateTime iterator = beginTime; iterator < endTime; iterator = iterator.AddDays(1))
                {
                    tempSingleData = correctedEntries.FirstOrDefault(x => x.ActualDate.Date == iterator.Date);

                    if (
                        !correctedEntries.Exists(
                            p => p.ActualDate.Date == iterator.Date && p.DbCurrencyCodeEntry.Equals(code)))
                    {
                        if (_weekends.Contains(iterator.DayOfWeek))
                        {
                            if (lastSingleData != null)
                            {
                                CurrencyDataEntry newCurrencyData = lastSingleData.Clone();
                                newCurrencyData.ActualDate = iterator;
                                correctedEntries.Add(newCurrencyData);
                            }
                            continue;
                        }

                        // If database doesn't have record for this date.
                        var downloadedData = RequestSingleData(iterator, new CurrencyCodeEntry[] { code }, false);

                        if (tempSingleData == null)
                        {
                            tempSingleData = lastSingleData;
                        }

                        if (downloadedData != null)
                        {
                            correctedEntries.Add(downloadedData[code]);
                        }
                    }

                    lastSingleData = tempSingleData;
                }

                correctedEntries.Sort(
                    (d1, d2) => d1.ActualDate > d2.ActualDate ? 1 : (d1.ActualDate == d2.ActualDate ? 0 : -1));

                if (!periodCurrencyData.ContainsKey(code))
                {
                    periodCurrencyData.Add(code, new List <CurrencyDataEntry>());
                }

                periodCurrencyData[code].AddRange(correctedEntries);
            }

            return(periodCurrencyData);

/*
 *          //var mData = TryGetPeriodDatabaseData(beginTime, endTime, codes.ElementAt(0)).ToList();
 *
 *          // Format the keys of data structure to be returned.
 *          foreach (CurrencyCode code in codes)
 *          {
 *              periodCurrencyData.Add(code, new List<CurrencyData>());
 *          }
 *
 *          IDictionary<CurrencyCode, CurrencyData> lastSingleData = null;
 *          IDictionary<CurrencyCode, CurrencyData> tempSingleData = null;
 *
 *          // TODO: fix iterator to make possible to change the step of selection so that select less data in large queries.
 *          for (DateTime iterator = beginTime; iterator < endTime; iterator = iterator.AddDays(1))
 *          {
 *              // TODO: select using one query instead of query per day.
 *
 *              tempSingleData = this.RequestSingleData(iterator, codes);
 *
 *              if (tempSingleData == null)
 *              {
 *                  tempSingleData = lastSingleData;
 *              }
 *
 *              if (tempSingleData != null)
 *              {
 *                  foreach (var pair in tempSingleData)
 *                  {
 *                      periodCurrencyData[pair.Key].Add(pair.Value);
 *                  }
 *              }
 *              else
 *              {
 *                  throw new Exception("Unhandled NULL reference exception. The previous data does not");
 *              }
 *
 *
 *              lastSingleData = tempSingleData;
 *          }
 *
 *          return periodCurrencyData;*/
        }
Exemplo n.º 4
0
        public IDictionary <CurrencyCodeEntry, List <CurrencyDataEntry> > RequestPeriodData(ChartTimePeriod timePeriod, ICollection <CurrencyCodeEntry> codes)
        {
            IDictionary <CurrencyCodeEntry, List <CurrencyDataEntry> > periodCurrencyData =
                new Dictionary <CurrencyCodeEntry, List <CurrencyDataEntry> >();

            DateTime beginTime = SelectWorkingDate(timePeriod.Begin, DateSelection.BeforeWeekends);
            DateTime endTime   = SelectWorkingDate(timePeriod.End, DateSelection.AfterWeekends);


            foreach (CurrencyCodeEntry code in codes)
            {
                // Try get from database.
                var dbEntries = TryGetPeriodDatabaseData(beginTime, endTime, code);

                List <CurrencyDataEntry> correctedEntries = null;

                if (dbEntries == null)
                {
                    correctedEntries = new List <CurrencyDataEntry>();
                }
                else
                {
                    correctedEntries = dbEntries.ToList();
                }

                CurrencyDataEntry lastSingleData = null;
                CurrencyDataEntry tempSingleData = null;

                // Check currency data per date.
                for (DateTime iterator = beginTime; iterator < endTime; iterator = iterator.AddDays(1))
                {
                    tempSingleData = correctedEntries.FirstOrDefault(x => x.ActualDate.Date == iterator.Date);

                    if (
                        !correctedEntries.Exists(
                            p => p.ActualDate.Date == iterator.Date && p.DbCurrencyCodeEntry.Equals(code)))
                    {
                        if (_weekends.Contains(iterator.DayOfWeek))
                        {
                            if (lastSingleData != null)
                            {
                                CurrencyDataEntry newCurrencyData = lastSingleData.Clone();
                                newCurrencyData.ActualDate = iterator;
                                correctedEntries.Add(newCurrencyData);
                            }
                            continue;
                        }

                        // If database doesn't have record for this date.
                        var downloadedData = RequestSingleData(iterator, new CurrencyCodeEntry[] { code }, false);

                        if (tempSingleData == null)
                        {
                            tempSingleData = lastSingleData;
                        }

                        if (downloadedData != null)
                        {
                            correctedEntries.Add(downloadedData[code]);
                        }
                    }

                    lastSingleData = tempSingleData;
                }

                correctedEntries.Sort(
                    (d1, d2) => d1.ActualDate > d2.ActualDate ? 1 : (d1.ActualDate == d2.ActualDate ? 0 : -1));

                if (!periodCurrencyData.ContainsKey(code))
                {
                    periodCurrencyData.Add(code, new List <CurrencyDataEntry>());
                }

                periodCurrencyData[code].AddRange(correctedEntries);
            }

            return(periodCurrencyData);
        }