private async System.Threading.Tasks.Task DeleteWrongEntries() { // delete entries for which companies weren't actually listed on GPW on the given date // (caused by incorrect data loaded from GPW site, spooq doesn't return those dates) var toDelete = _priceRepository.GetQueryable() .Where(PriceValidationHelper.IsInvalidExpression()); logger.Info($"Found {toDelete.Count()} records to delete"); if (toDelete.Any()) { await _priceRepository.RemoveRange(toDelete); await _priceRepository.Save(); } logger.Info("Deleted successfully\n"); }
/// <inheritdoc /> public async System.Threading.Tasks.Task Sync(DateTime date) { Logger.Debug("Syncing historical data started"); var dateString = date.ToString(Consts.Formats.DateGpwFormat); IList <Company> companies = _companyRepository.GetQueryable().ToList(); IList <Price> prices = _priceRepository.GetQueryable().Where(item => item.Date == date).ToList(); var pricesToInsert = new List <Price>(); string[,] data; try { data = LoadData(dateString); } catch (Exception ex) { Logger.Debug(date.ToString(CultureInfo.InvariantCulture) + ": " + ex.Message); return; } for (var i = 1; i < data.GetLength(0); ++i) { var day = DateTime.Parse(data[i, 0]); var name = data[i, 1].Trim(); var open = decimal.Parse(data[i, 4].Replace(",", "."), NumberStyles.Any, CultureInfo.InvariantCulture); var max = decimal.Parse(data[i, 5].Replace(",", "."), NumberStyles.Any, CultureInfo.InvariantCulture); var min = decimal.Parse(data[i, 6].Replace(",", "."), NumberStyles.Any, CultureInfo.InvariantCulture); var close = decimal.Parse(data[i, 7].Replace(",", "."), NumberStyles.Any, CultureInfo.InvariantCulture); var volumen = int.Parse(data[i, 9]); if (companies.All(item => item.Code != name)) { _companyRepository.Insert(new Company { Code = name, Name = "" }); await _companyRepository.Save(); companies = _companyRepository.GetQueryable().ToList(); } var company = companies.First(item => item.Code == name); if (prices.Any(item => item.CompanyId == company.Id)) { continue; } var price = new Price { Date = day, ClosePrice = close, CompanyId = company.Id, HighPrice = max, LowPrice = min, OpenPrice = open, Volume = volumen }; if (!PriceValidationHelper.IsInvalid(price)) { pricesToInsert.Add(price); } } _priceRepository.BulkInsert(pricesToInsert); await _priceRepository.Save(); await _cache.Flush(); Logger.Debug("Syncing historical data ended."); }