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)); }
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); }
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); })); }