Example #1
0
 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);
         }
     }
Example #2
0
        /// <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.");
        }
Example #3
0
        /// <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}");
        }
Example #4
0
 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);
         }
     }
 }
Example #5
0
 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)));
     }
 }
Example #7
0
 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)));
         }
     }
 }
Example #9
0
        /// <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);
        }
Example #10
0
 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);
             }
         }
     }
 }
Example #11
0
        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);
                }
            }
        }
Example #13
0
        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)));
     }
 }
Example #15
0
 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)));
     }
 }
Example #16
0
 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);
         }
     }
 }
Example #17
0
 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));
     }
 }
Example #19
0
        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);
            }
        }