Пример #1
0
        public async Task <RateResult> DetailsAsync(string eventSource, Granularity granularity, int range = 0, DateTime?from = null, string[] dimensions = null, RankingOptions options = null)
        {
            options = options ?? new RankingOptions();
            var cacheKey = await ComputeAggregationAsync(granularity, range, from, dimensions, options).ConfigureAwait(false);

            var rank = await DB.SortedSetRankAsync(cacheKey, eventSource, Order.Descending).ConfigureAwait(false);

            var score = await DB.SortedSetScoreAsync(cacheKey, eventSource).ConfigureAwait(false);

            return(new RateResult(eventSource, score, rank + 1));
        }
Пример #2
0
        private async Task <string> ComputeAggregationAsync(Granularity granularity, int range = 0, DateTime?from = null, string[] dimensions = null, RankingOptions options = null)
        {
            var allkeys = await this.GetKeysAsync(this.DB, granularity, range, from, dimensions).ConfigureAwait(false);

            var allweights = new List <double>();

            for (var k = 0; k < allkeys.Length; k++)
            {
                allweights.Add(options.weightFunc.Weight(k, allkeys.Count()));
            }

            var cacheKey = this.context.KeyFactory.NsKey(dimensions != null ? this.context.KeyFactory.RawKey(dimensions) : Constants.SetAllDimensions, Constants.CacheKeyPart, options.weightFunc.Name, granularity.Name, range.ToString());

            if (options.CacheDuration.HasValue && options.CacheDuration.Value != TimeSpan.Zero)
            {
                //use cache
                bool exists = await this.DB.KeyExistsAsync(cacheKey).ConfigureAwait(false);

                if (!exists)
                {
                    await this.DB.SortedSetCombineAndStoreAsync(SetOperation.Union, cacheKey, allkeys).ConfigureAwait(false);

                    await this.DB.KeyExpireAsync(cacheKey, DateTime.UtcNow.Add(options.CacheDuration.Value), CommandFlags.FireAndForget).ConfigureAwait(false);
                }
            }
            else
            {
                await this.DB.SortedSetCombineAndStoreAsync(SetOperation.Union, cacheKey, allkeys, allweights.ToArray()).ConfigureAwait(false);
            }

            return(cacheKey);
        }
Пример #3
0
        public async Task <IEnumerable <RateResult> > AllAsync(Granularity granularity, int range = 0, DateTime?from = null, string[] dimensions = null, RankingOptions options = null)
        {
            options = options ?? new RankingOptions();
            var cacheKey = await ComputeAggregationAsync(granularity, range, from, dimensions, options).ConfigureAwait(false);

            var entries = await this.DB.SortedSetRangeByRankWithScoresAsync(cacheKey, 0, options.TopN, Order.Descending).ConfigureAwait(false);

            return(entries.Select((e, i) =>
            {
                return new RateResult(e.Element, e.Score, i + 1);
            }));
        }