private IEnumerable <T> ConstructActualValues(HashEntry[] result) { var values = GetRedisValues(result); var actualValues = objectSerialization.GetInstances(values); return(actualValues); }
public IObservable <T> GetRecords(IDatabaseAsync database, IDataKey dataKey, long fromRecord = 0, long toRecord = -1) { if (database == null) { throw new ArgumentNullException(nameof(database)); } if (dataKey == null) { throw new ArgumentNullException(nameof(dataKey)); } var key = link.GetKey(dataKey); logger.LogDebug("GetRecords: {0} {1}:{2}", key, fromRecord, toRecord); return(Observable.Create <T>( async observer => { if (!columnsCache.TryGetValue(typeof(T), out RedisValue[] columns)) { var subKey = link.GetKey("object"); columns = objectSerialization.GetColumns() .Select(item => (RedisValue)($"{subKey}:*->" + item)) .ToArray(); columnsCache[typeof(T)] = columns; } var exist = await link.Resilience.AsyncRetryPolicy.ExecuteAsync( async() => await database.KeyExistsAsync(key).ConfigureAwait(false)).ConfigureAwait(false); if (!exist) { logger.LogDebug("Key doesn't exist: {0}", key); observer.OnCompleted(); return; } var result = await link.Resilience.AsyncRetryPolicy.ExecuteAsync( async() => await database.SortAsync( key, fromRecord, toRecord, Order.Ascending, SortType.Numeric, "nosort", columns).ConfigureAwait(false)) .ConfigureAwait(false); if (result.Length % columns.Length != 0) { logger.LogError( "Result {0} mismatched with requested number of columns {1}", result.Length, columns.Length); observer.OnCompleted(); return; } var values = objectSerialization.GetInstances(result); foreach (var value in values) { observer.OnNext(value); } observer.OnCompleted(); }));