public void AddDataEntry(CurrencyDataEntry currencyData) { var data = _currencyDataContext.CurrencyDataEntries.Where(x => x.Equals(currencyData)); if (!data.Any()) { _currencyDataContext.CurrencyDataEntries.Add(currencyData); _currencyDataContext.SaveChanges(); } }
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); }
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;*/ }
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); }