private void AddTeamCompetitor(URN id, TeamCompetitorDTO item, CultureInfo culture, bool useSemaphore) { if (_cache.Contains(id.ToString())) { try { var ci = (CompetitorCI)_cache.Get(id.ToString()); var teamCI = ci as TeamCompetitorCI; if (teamCI != null) { if (useSemaphore) { _semaphoreCacheMerge.Wait(); } teamCI.Merge(item, culture); } else { if (useSemaphore) { _semaphoreCacheMerge.Wait(); } teamCI = new TeamCompetitorCI(ci); teamCI.Merge(item, culture); _cache.Set(id.ToString(), teamCI, GetCorrectCacheItemPolicy(id)); } } catch (Exception ex) { ExecutionLog.Error( $"Error adding team competitor for id={id}, dto type={item?.GetType().Name} and lang={culture.TwoLetterISOLanguageName}.", ex); } }
/// <summary> /// Adds the category /// </summary> /// <param name="id">The identifier of the CategoryId or SportId !!!</param> /// <param name="item">The category dto item</param> /// <param name="culture">The culture</param> private void AddCategory(URN id, CategoryDTO item, CultureInfo culture) { //WriteLog($"Saving CategoryDTO for id:{id} and lang:[{culture.TwoLetterISOLanguageName}]."); lock (_mergeLock) { try { if (Categories.ContainsKey(item.Id)) { CategoryCI ci; Categories.TryGetValue(item.Id, out ci); ci?.Merge(new CategoryCI(item, culture, item.Tournaments?.FirstOrDefault()?.Sport.Id ?? id), culture); } else { Categories.Add(item.Id, new CategoryCI(item, culture, item.Tournaments?.FirstOrDefault()?.Sport.Id ?? id)); } } catch (Exception e) { ExecutionLog.Error($"Error saving CategoryDTO for {id} and lang={culture.TwoLetterISOLanguageName}.", e); } } //WriteLog($"Saving CategoryDTO for id:{id} and lang:[{culture.TwoLetterISOLanguageName}] COMPLETED."); }
/// <summary> /// Asynchronously gets a <see cref="ITeamCompetitor" /> representing away competitor of the match associated with the current instance /// </summary> /// <returns>A <see cref="Task{ITeamCompetitor}"/> representing the retrieval operation</returns> public async Task<ITeamCompetitor> GetAwayCompetitorAsync() { var matchCI = (IMatchCI)SportEventCache.GetEventCacheItem(Id); if (matchCI == null) { ExecutionLog.Debug($"Missing data. No match cache item for id={Id}."); return null; } var items = ExceptionStrategy == ExceptionHandlingStrategy.THROW ? await matchCI.GetCompetitorsIdsAsync(Cultures).ConfigureAwait(false) : await new Func<IEnumerable<CultureInfo>, Task<IEnumerable<URN>>>(matchCI.GetCompetitorsIdsAsync).SafeInvokeAsync(Cultures, ExecutionLog, GetFetchErrorMessage("CompetitorsIds")).ConfigureAwait(false); if (items == null) { return null; } var competitorUrns = items.ToList(); if (competitorUrns.Count == 2) { return await _sportEntityFactory.BuildTeamCompetitorAsync(competitorUrns[1], Cultures, matchCI, ExceptionStrategy).ConfigureAwait(false); } ExecutionLog.Error($"Received {competitorUrns.Count} competitors for match[Id = {Id}]. Match can have only 2 competitors."); throw new InvalidOperationException($"Invalid number of competitors. Match must have exactly 2 competitors, received {competitorUrns.Count}"); }
private void AddSport(URN id, SportDTO item, CultureInfo culture) { lock (_mergeLock) { try { if (Sports.ContainsKey(id)) { SportCI ci; Sports.TryGetValue(id, out ci); ci?.Merge(new SportCI(item, _dataRouterManager, culture), culture); } else { Sports.Add(id, new SportCI(item, _dataRouterManager, culture)); } if (item.Categories != null) { foreach (var categoryData in item.Categories) { AddCategory(categoryData.Id, categoryData, culture); } } } catch (Exception e) { ExecutionLog.Error($"Error saving SportDTO for {id} and lang={culture.TwoLetterISOLanguageName}.", e); } } }
private void AddCompetitorProfile(URN id, SimpleTeamProfileDTO item, CultureInfo culture, bool useSemaphore) { if (_cache.Contains(id.ToString())) { try { var ci = (CompetitorCI)_cache.Get(id.ToString()); if (useSemaphore) { _semaphoreCacheMerge.Wait(); } ci.Merge(item, culture); } catch (Exception ex) { ExecutionLog.Error($"Error adding competitor for id={id}, dto type={item?.GetType().Name} and lang={culture.TwoLetterISOLanguageName}.", ex); } finally { if (useSemaphore) { if (!_isDisposed) { _semaphoreCacheMerge.Release(); } } } } else { _cache.Add(id.ToString(), new CompetitorCI(item, culture, _dataRouterManager), GetCorrectCacheItemPolicy(id)); } }
private void AddPlayerProfile(ExportablePlayerProfileCI item) { if (_cache.Contains(item.Id)) { var itemId = URN.Parse(item.Id); try { var ci = (PlayerProfileCI)_cache.Get(item.Id); WaitTillIdIsAvailable(_mergeUrns, itemId); ci.Import(item); } catch (Exception ex) { ExecutionLog.Error($"Error importing player profile for id={item.Id}.", ex); } finally { if (!_isDisposed) { ReleaseId(_mergeUrns, itemId); } } } else { _cache.Add(item.Id, new PlayerProfileCI(item, _dataRouterManager), GetCorrectCacheItemPolicy(URN.Parse(item.Id))); } }
private void AddPlayerProfile(ExportablePlayerProfileCI item) { if (_cache.Contains(item.Id)) { try { var ci = (PlayerProfileCI)_cache.Get(item.Id); _semaphoreCacheMerge.Wait(); ci.Merge(new PlayerProfileCI(item, _dataRouterManager)); } catch (Exception ex) { ExecutionLog.Error($"Error importing player profile for id={item.Id}.", ex); } finally { if (!_isDisposed) { _semaphoreCacheMerge.Release(); } } } else { _cache.Add(item.Id, new PlayerProfileCI(item, _dataRouterManager), GetCorrectCacheItemPolicy(URN.Parse(item.Id))); } }
private void AddCompetitor(ExportableCompetitorCI item) { if (_cache.Contains(item.Id)) { var itemId = URN.Parse(item.Id); try { var ci = (CompetitorCI)_cache.Get(item.Id); WaitTillIdIsAvailable(_mergeUrns, itemId); ci.Import(item); } catch (Exception ex) { ExecutionLog.Error($"Error importing competitor for id={item.Id}.", ex); } finally { if (!_isDisposed) { ReleaseId(_mergeUrns, itemId); } } } else { if (!string.IsNullOrEmpty(item.Id)) { _cache.Add(item.Id, new CompetitorCI(item, _dataRouterManager), GetCorrectCacheItemPolicy(URN.Parse(item.Id))); } } }
/// <summary> /// Gets a <see cref="SportEventCI"/> instance representing cached sport event data /// </summary> /// <param name="id">A <see cref="URN"/> specifying the id of the sport event which cached representation to return</param> /// <returns>a <see cref="SportEventCI"/> instance representing cached sport event data</returns> public SportEventCI GetEventCacheItem(URN id) { Metric.Context("CACHE").Meter("SportEventCache->GetEventCacheItem", Unit.Calls); lock (_addLock) { try { var item = (SportEventCI)Cache.Get(id.ToString()); if (item != null) { return(item); } item = _sportEventCacheItemFactory.Build(id); AddNewCacheItem(item); // if there are events for non-standard tournaments (tournaments not on All tournaments for all sports) if (item is TournamentInfoCI && !SpecialTournaments.Contains(item.Id)) { SpecialTournaments.Add(item.Id); } return(item); } catch (Exception ex) { ExecutionLog.Error($"Error getting cache item for id={id}", ex); } } return(null); }
private void AddCategories(SportCategoriesDTO item, CultureInfo culture) { lock (_mergeLock) { foreach (var category in item.Categories) { try { if (Categories.ContainsKey(category.Id)) { CategoryCI ci; Categories.TryGetValue(category.Id, out ci); ci?.Merge(new CategoryCI(category, culture, item.Sport.Id), culture); } else { Categories.Add(category.Id, new CategoryCI(category, culture, item.Sport.Id)); } } catch (Exception e) { ExecutionLog.Error($"Error saving CategoryDTO for {category.Id} and lang={culture.TwoLetterISOLanguageName}.", e); } } } }
private void AddPlayerCompetitor(PlayerCompetitorDTO item, URN competitorId, CultureInfo culture, bool useSemaphore) { if (item == null) { return; } if (_cache.Contains(item.Id.ToString())) { try { if (item.Id.Type.Equals(SdkInfo.PlayerProfileIdentifier, StringComparison.InvariantCultureIgnoreCase)) { var ci = (PlayerProfileCI)_cache.Get(item.Id.ToString()); if (useSemaphore) { _semaphoreCacheMerge.Wait(); } ci.Merge(item, competitorId, culture); } else { var ci = (CompetitorCI)_cache.Get(item.Id.ToString()); if (useSemaphore) { _semaphoreCacheMerge.Wait(); } ci.Merge(item, culture); } } catch (Exception ex) { ExecutionLog.Error($"Error adding player profile for id={item.Id}, dto type={item.GetType().Name} and lang={culture.TwoLetterISOLanguageName}.", ex); } finally { if (useSemaphore) { if (!_isDisposed) { _semaphoreCacheMerge.Release(); } } } } else { if (item.Id.Type.Equals(SdkInfo.PlayerProfileIdentifier, StringComparison.InvariantCultureIgnoreCase)) { _cache.Add(item.Id.ToString(), new PlayerProfileCI(item, competitorId, culture, _dataRouterManager), GetCorrectCacheItemPolicy(item.Id)); } else { _cache.Add(item.Id.ToString(), new CompetitorCI(item, culture, _dataRouterManager), GetCorrectCacheItemPolicy(item.Id)); } } }
private void AddTeamCompetitor(URN id, TeamCompetitorDTO item, CultureInfo culture, bool useSemaphore) { if (_cache.Contains(id.ToString())) { try { var ci = (CompetitorCI)_cache.Get(id.ToString()); var teamCI = ci as TeamCompetitorCI; if (teamCI != null) { if (useSemaphore) { WaitTillIdIsAvailable(_mergeUrns, id); } teamCI.Merge(item, culture); } else { if (useSemaphore) { WaitTillIdIsAvailable(_mergeUrns, id); } teamCI = new TeamCompetitorCI(ci); teamCI.Merge(item, culture); _cache.Set(id.ToString(), teamCI, GetCorrectCacheItemPolicy(id)); } } catch (Exception ex) { ExecutionLog.Error($"Error adding team competitor for id={id}, dto type={item?.GetType().Name} and lang={culture.TwoLetterISOLanguageName}.", ex); } finally { if (useSemaphore) { if (!_isDisposed) { ReleaseId(_mergeUrns, id); } } } } else { var teamCompetitor = new TeamCompetitorCI(item, culture, _dataRouterManager); _cache.Add(id.ToString(), teamCompetitor, GetCorrectCacheItemPolicy(id)); } if (item?.Players != null && item.Players.Any()) { foreach (var player in item.Players) { AddPlayerCompetitor(player, item.Id, culture, false); } } }
private void AddMatchTimeLine(MatchTimelineDTO item, CultureInfo culture, ISportEventCI requester, DtoType dtoType) { AddSportEvent(item.SportEvent.Id, item.SportEvent, culture, requester, dtoType); lock (_addLock) { try { UpdateMatchWithTimeline(item, culture); } catch (Exception ex) { ExecutionLog.Error($"Error adding timeline for id={item.SportEvent.Id}, dto type={item.GetType().Name} and lang={culture.TwoLetterISOLanguageName}.", ex); } } }
private void AddTeamCompetitor(ExportableTeamCompetitorCI item) { if (_cache.Contains(item.Id)) { var itemId = URN.Parse(item.Id); try { var competitorCI = (CompetitorCI)_cache.Get(item.Id); var teamCI = competitorCI as TeamCompetitorCI; if (teamCI != null) { WaitTillIdIsAvailable(_mergeUrns, itemId); teamCI.Import(item); } else { WaitTillIdIsAvailable(_mergeUrns, itemId); teamCI = new TeamCompetitorCI(competitorCI); teamCI.Import(item); _cache.Set(item.Id, teamCI, GetCorrectCacheItemPolicy(URN.Parse(item.Id))); } } catch (Exception ex) { ExecutionLog.Error($"Error importing team competitor for id={item.Id}.", ex); } finally { if (!_isDisposed) { ReleaseId(_mergeUrns, itemId); } } } else { _cache.Add(item.Id, new TeamCompetitorCI(item, _dataRouterManager), GetCorrectCacheItemPolicy(URN.Parse(item.Id))); } }
private void AddTeamCompetitor(ExportableTeamCompetitorCI item) { if (_cache.Contains(item.Id)) { try { var ci = (CompetitorCI)_cache.Get(item.Id); var teamCI = ci as TeamCompetitorCI; if (teamCI != null) { _semaphoreCacheMerge.Wait(); teamCI.Merge(new TeamCompetitorCI(item, _dataRouterManager)); } else { _semaphoreCacheMerge.Wait(); teamCI = new TeamCompetitorCI(ci); teamCI.Merge(new TeamCompetitorCI(item, _dataRouterManager)); _cache.Set(item.Id, teamCI, GetCorrectCacheItemPolicy(URN.Parse(item.Id))); } } catch (Exception ex) { ExecutionLog.Error($"Error importing team competitor for id={item.Id}.", ex); } finally { if (!_isDisposed) { _semaphoreCacheMerge.Release(); } } } else { _cache.Add(item.Id, new TeamCompetitorCI(item, _dataRouterManager), GetCorrectCacheItemPolicy(URN.Parse(item.Id))); } }
private void AddSport(URN id, SportCategoriesDTO item, CultureInfo culture) { lock (_mergeLock) { try { if (Sports.ContainsKey(id)) { SportCI ci; Sports.TryGetValue(id, out ci); ci?.Merge(new SportCI(new SportDTO(item.Sport.Id.ToString(), item.Sport.Name, item.Categories), _dataRouterManager, culture), culture); } else { Sports.Add(id, new SportCI(new SportDTO(item.Sport.Id.ToString(), item.Sport.Name, item.Categories), _dataRouterManager, culture)); } } catch (Exception e) { ExecutionLog.Error($"Error saving SportEntityDTO for {id} and lang={culture.TwoLetterISOLanguageName}.", e); } } }
private void AddCategory(URN id, CategorySummaryDTO item, URN sportId, IEnumerable <URN> tournamentIds, CultureInfo culture) { lock (_mergeLock) { try { if (Categories.ContainsKey(id)) { CategoryCI ci; Categories.TryGetValue(id, out ci); ci?.Merge(new CategoryCI(item, culture, sportId, tournamentIds), culture); } else { Categories.Add(id, new CategoryCI(item, culture, sportId, tournamentIds)); } } catch (Exception e) { ExecutionLog.Error($"Error saving CategorySummaryDTO for {id} and lang={culture.TwoLetterISOLanguageName}.", e); } } }
private void AddPlayerProfile(PlayerProfileDTO item, URN competitorId, CultureInfo culture, bool useSemaphore) { if (item == null) { return; } if (_cache.Contains(item.Id.ToString())) { try { var ci = (PlayerProfileCI)_cache.Get(item.Id.ToString()); if (useSemaphore) { WaitTillIdIsAvailable(_mergeUrns, item.Id); } ci.Merge(item, competitorId, culture); } catch (Exception ex) { ExecutionLog.Error($"Error adding player profile for id={item.Id}, dto type={item.GetType().Name} and lang={culture.TwoLetterISOLanguageName}.", ex); } finally { if (useSemaphore) { if (!_isDisposed) { ReleaseId(_mergeUrns, item.Id); } } } } else { _cache.Add(item.Id.ToString(), new PlayerProfileCI(item, competitorId, culture, _dataRouterManager), GetCorrectCacheItemPolicy(item.Id)); } }
private void AddSportEvent(URN id, SportEventSummaryDTO item, CultureInfo culture, ISportEventCI requester, DtoType dtoType) { TournamentInfoDTO tournamentInfoDTO = null; lock (_addLock) { try { var cacheItem = _sportEventCacheItemFactory.Get(Cache.Get(id.ToString())); if (requester != null && !Equals(requester, cacheItem) && id.Equals(requester.Id)) { try { var requesterMerged = false; var fixture = item as FixtureDTO; if (fixture != null) { if (requester.Id.TypeGroup == ResourceTypeGroup.MATCH) { ((MatchCI)requester).MergeFixture(fixture, culture, true); } else if (requester.Id.TypeGroup == ResourceTypeGroup.STAGE) { ((StageCI)requester).MergeFixture(fixture, culture, true); } else { ((TournamentInfoCI)requester).MergeFixture(fixture, culture, true); } requesterMerged = true; } if (!requesterMerged) { var match = item as MatchDTO; if (match != null) { ((MatchCI)requester).Merge(match, culture, true); requesterMerged = true; } } if (!requesterMerged) { var stage = item as StageDTO; if (stage != null) { ((StageCI)requester).Merge(stage, culture, true); requesterMerged = true; } } if (!requesterMerged) { var tour = item as TournamentInfoDTO; if (tour != null) { var stageCI = requester as StageCI; if (stageCI != null) { stageCI.Merge(tour, culture, true); requesterMerged = true; } else { var tourCI = requester as TournamentInfoCI; if (tourCI != null) { tourCI.Merge(tour, culture, true); requesterMerged = true; } } } } if (!requesterMerged) { var draw = item as DrawDTO; if (draw != null) { ((DrawCI)requester).Merge(draw, culture, true); requesterMerged = true; } } if (!requesterMerged) { var lottery = item as LotteryDTO; if (lottery != null) { ((LotteryCI)requester).Merge(lottery, culture, true); requesterMerged = true; } } if (!requesterMerged) { requester.Merge(item, culture, true); } } catch (Exception) { ExecutionLog.Debug($"Merging failed for {id} and item type: {item.GetType().Name} and dto type: {dtoType} for requester: {requester.Id}."); } } if (cacheItem != null) { //ExecutionLog.Debug($"Saving OLD data for {id} and item type: {item.GetType().Name} and dto type: {dtoType}."); var merged = false; //var cacheItem = _sportEventCacheItemFactory.Get(Cache.Get(id.ToString())); var fixture = item as FixtureDTO; if (fixture != null) { if (cacheItem.Id.TypeGroup == ResourceTypeGroup.MATCH) { ((MatchCI)cacheItem).MergeFixture(fixture, culture, true); } else if (cacheItem.Id.TypeGroup == ResourceTypeGroup.STAGE) { ((StageCI)cacheItem).MergeFixture(fixture, culture, true); } else { ((TournamentInfoCI)cacheItem).MergeFixture(fixture, culture, true); } if (fixture.Tournament != null) { tournamentInfoDTO = new TournamentInfoDTO(fixture.Tournament); } merged = true; } if (!merged) { var stage = item as StageDTO; if (stage != null) { ((StageCI)cacheItem).Merge(stage, culture, true); merged = true; if (stage.Tournament != null) { tournamentInfoDTO = new TournamentInfoDTO(stage.Tournament); } } } if (!merged) { var tour = item as TournamentInfoDTO; if (tour != null) { var stageCI = cacheItem as StageCI; if (stageCI != null) { stageCI.Merge(tour, culture, true); merged = true; } else { var tourCI = cacheItem as TournamentInfoCI; if (tourCI != null) { tourCI.Merge(tour, culture, true); merged = true; } } } } if (!merged) { var match = item as MatchDTO; if (match != null) { ((MatchCI)cacheItem).Merge(match, culture, true); merged = true; if (match.Tournament != null) { tournamentInfoDTO = new TournamentInfoDTO(match.Tournament); } } } if (!merged) { var draw = item as DrawDTO; if (draw != null) { ((DrawCI)cacheItem).Merge(draw, culture, true); merged = true; } } if (!merged) { var lottery = item as LotteryDTO; if (lottery != null) { ((LotteryCI)cacheItem).Merge(lottery, culture, true); merged = true; } } if (!merged) { cacheItem.Merge(item, culture, true); } } else { //ExecutionLog.Debug($"Saving NEW data for {id} and item type: {item.GetType().Name} and dto type: {dtoType}."); var ci = _sportEventCacheItemFactory.Build(item, culture); if (dtoType == DtoType.SportEventSummary || dtoType == DtoType.LotteryDraw || dtoType == DtoType.MatchSummary) { ci.LoadedSummaries.Add(culture); } else if (dtoType == DtoType.Fixture) { ci.LoadedFixtures.Add(culture); } AddNewCacheItem(ci); if (!ci.Id.Equals(id)) { var tInfo = item as TournamentInfoDTO; if (tInfo != null) { var newTournamentDto = new TournamentInfoDTO(tInfo, tInfo.Season != null, tInfo.CurrentSeason != null); var ci2 = _sportEventCacheItemFactory.Build(newTournamentDto, culture); AddNewCacheItem(ci2); } else { var ci2 = _sportEventCacheItemFactory.Build(item, culture); ci2.Id = id; AddNewCacheItem(ci2); } } } } catch (Exception ex) { ExecutionLog.Error($"Error adding sport event for id={id}, dto type={item?.GetType().Name} and lang={culture.TwoLetterISOLanguageName}.", ex); } } // if there are events for non-standard tournaments (tournaments not on All tournaments for all sports) // TODO: should we save/merge all, or just adding non-existing??? if (tournamentInfoDTO != null && (SpecialTournaments.Contains(tournamentInfoDTO.Id) || !Cache.Contains(tournamentInfoDTO.Id.ToString()))) { if (SpecialTournaments.Contains(tournamentInfoDTO.Id)) { //ExecutionLog.Debug($"Updating tournament id={tournamentInfoDTO.Id}, introduced by event id={id} and lang=[{culture.TwoLetterISOLanguageName}]."); } else { //ExecutionLog.Debug($"Saving tournament id={tournamentInfoDTO.Id}, introduced by event id={id} and lang=[{culture.TwoLetterISOLanguageName}]."); SpecialTournaments.Add(tournamentInfoDTO.Id); } AddSportEvent(tournamentInfoDTO.Id, tournamentInfoDTO, culture, null, dtoType); } }