예제 #1
0
        private void ServiceHost_Opening(object sender, EventArgs e)
        {
            IReplicationRepository repo = new ReplicationRepository(new ScadaDbContext());
            var result = repo.Get();

            ScadaStorageProvider.Model = result;
            Console.WriteLine($"Readed from replica: {ScadaStorageProvider.Model.Count}");
        }
예제 #2
0
        public void SetModel(Dictionary <Tuple <RegisterType, int>, BasePoint> model)
        {
            Model = model;
            IReplicationRepository repo = new ReplicationRepository(new ScadaDbContext());

            repo.Set(Model.Values.ToList());
            repo = null;
        }
예제 #3
0
        public async Task <ServiceResult> GetLeaderboard(int?topRecords = null)
        {
            topRecords = Math.Max(topRecords ?? 100, MaxLeaderboardSize);

            var list = Cache.GetOrCreate <List <LeaderboardItem> >(LeaderboardCacheKey,
                                                                   context =>
            {
                context.SetAbsoluteExpiration(TimeSpan.FromMilliseconds(1));

                const string PlayerAggs      = "playeraggs";
                const string LastUpdatedDate = "lastupdateddate";
                const string PointsSum       = "pointssum";
                const string SortByPointsSum = "sortbypointssum";

                var searchResponse =
                    ReplicationRepository.Search(s => s
                                                 .Index(ReplicationRepository.IndexName)
                                                 .Size(MaxLeaderboardSize)
                                                 .Aggregations(a1 => a1
                                                               .Terms(PlayerAggs, t1 => t1
                                                                      .Field(f1 => f1.PlayerID)
                                                                      .Size(int.MaxValue)
                                                                      .Aggregations(a2 => a2
                                                                                    .Max(LastUpdatedDate, m2 => m2
                                                                                         .Field(fm2 => fm2.ReplicatedTimestamp)
                                                                                         )
                                                                                    .Sum(PointsSum, s2 => s2
                                                                                         .Field(f2 => f2.WinPoints
                                                                                                )
                                                                                         )
                                                                                    .BucketSort(SortByPointsSum, t3 => t3
                                                                                                .Sort(s3 => s3
                                                                                                      .Field(PointsSum, SortOrder.Descending)
                                                                                                      )
                                                                                                )
                                                                                    )
                                                                      )
                                                               )
                                                 );

                if (!searchResponse.IsValid)
                {
                    return(null);
                }

                context.SetAbsoluteExpiration(TimeSpan.FromMinutes(LeaderboardCacheExpiration));
                context.SetPriority(CacheItemPriority.High);

                return(searchResponse.Aggregations.Terms(PlayerAggs).Buckets.Select(x => new LeaderboardItem()
                {
                    PlayerID = Convert.ToInt64(x.Key),
                    Balance = Convert.ToInt64(x.Sum(PointsSum).Value),
                    LastUpdateDate = new DateTime(Convert.ToInt64(x.Max(LastUpdatedDate).Value)),
                }).ToList());
            });

            return(list.Take(topRecords.Value).ToList().AsServiceResult().Valid());
        }