示例#1
0
        public IObservable <IDataKey> GetKeys(IDatabaseAsync database, IIndexKey indexes, long start = 0, long stop = -1)
        {
            log.LogTrace("GetKeys");
            var keys = GetIds(database, indexes, start, stop);

            return(keys.Select(item => GetKey(item, indexes)));
        }
示例#2
0
        public virtual void AddIndex(IIndexKey key)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }

            indexes[key.Key] = key;
        }
示例#3
0
        public Task RemoveIndex(IDatabaseAsync database, IDataKey key, IIndexKey indexes)
        {
            if (key?.RecordId == null)
            {
                throw new ArgumentNullException(nameof(key));
            }

            return(RemoveRawIndex(database, indexes, key.RecordId));
        }
示例#4
0
        public Task AddRawIndex(IDatabaseAsync database, string rawKey, IIndexKey indexes)
        {
            if (string.IsNullOrEmpty(rawKey))
            {
                throw new ArgumentException("Value cannot be null or empty.", nameof(rawKey));
            }

            return(AddRawIndex(database, indexes, rawKey));
        }
示例#5
0
        public Task AddIndex(IDatabaseAsync database, IDataKey key, IIndexKey indexes)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }

            return(AddRawIndex(database, key.RecordId, indexes));
        }
示例#6
0
        public override void AddIndex(IIndexKey key)
        {
            if (key?.RepositoryKey == null)
            {
                throw new ArgumentNullException(nameof(key));
            }

            base.AddIndex(key);
        }
示例#7
0
        private IDataKey GetKey(string key, IIndexKey indexes)
        {
            var repository = indexes.RepositoryKey;

            if (!string.IsNullOrEmpty(repository))
            {
                return(SimpleKey.GenerateKey(repository, key));
            }

            return(new ObjectKey(key));
        }
示例#8
0
        public static RedisKey GetIndexKey(this IRedisLink link, IIndexKey index)
        {
            if (link == null)
            {
                throw new ArgumentNullException(nameof(link));
            }

            if (index == null)
            {
                throw new ArgumentNullException(nameof(index));
            }

            return(string.IsNullOrEmpty(index.RepositoryKey) ? link.GetKey(index.Key) : link.GetKey($"{index.RepositoryKey}:{index.Key}"));
        }
示例#9
0
        public IObservable <T> GetRecords <T>(IIndexKey index, long start = 0, long end = -1)
        {
            logger.LogDebug($"GetRecords {start}-{end}");
            var indexManager = mainIndexManager.GetManager(index);
            int batch        = BatchSize;

            return(ObserverHelpers.Batch(
                       indexManager.Count(GetDatabase(), index),
                       (fromIndex, toIndex) => indexManager.GetKeys(GetDatabase(), index, fromIndex, toIndex),
                       GetRecords <T>,
                       batch,
                       start,
                       end));
        }
示例#10
0
        public Task <long> Count(IIndexKey index)
        {
            if (index == null)
            {
                throw new ArgumentNullException(nameof(index));
            }

            var indexManager = mainIndexManager.GetManager(index);

            if (indexManager == null)
            {
                return(Task.FromResult(0L));
            }

            return(link.Resilience
                   .AsyncRetryPolicy
                   .ExecuteAsync(async() => await indexManager.Count(GetDatabase(), index).ConfigureAwait(false)));
        }
示例#11
0
        public IIndexManager Create(IIndexKey index)
        {
            if (index == null)
            {
                throw new ArgumentNullException(nameof(index));
            }

            switch (index)
            {
            case IndexKey indexKey:
                return(indexKey.IsSet ? table[setName] : table[listName]);

            case HashIndexKey indexKey:
                return(table[hashName]);
            }

            throw new NotSupportedException("Indexing type is not supported: " + index);
        }
示例#12
0
        protected override Task RemoveRawIndex(IDatabaseAsync database, IIndexKey index, string rawKey)
        {
            var hashIndex = (HashIndexKey)index;

            return(database.HashDeleteAsync(Link.GetIndexKey(index), hashIndex.HashKey));
        }
示例#13
0
 public abstract Task <long> Count(IDatabaseAsync database, IIndexKey index);
示例#14
0
 protected override Task AddRawIndex(IDatabaseAsync database, IIndexKey index, string rawKey)
 {
     return(database.SortedSetAddAsync(Link.GetIndexKey(index), rawKey, DateTime.UtcNow.ToUnixTime()));
 }
示例#15
0
        protected override IObservable <RedisValue> GetIdsSingle(IDatabaseAsync database, IIndexKey index, long start = 0, long stop = -1)
        {
            return(Observable.Create <RedisValue>(
                       async observer =>
            {
                var keys = await Link.Resilience.AsyncRetryPolicy
                           .ExecuteAsync(async() => await database.SortedSetRangeByRankAsync(Link.GetIndexKey(index), start, stop, Order.Descending).ConfigureAwait(false))
                           .ConfigureAwait(false);

                foreach (var key in keys)
                {
                    observer.OnNext(key);
                }

                observer.OnCompleted();
            }));
        }
示例#16
0
 public override Task <long> Count(IDatabaseAsync database, IIndexKey index)
 {
     return(database.SortedSetLengthAsync(Link.GetIndexKey(index)));
 }
示例#17
0
 protected override Task RemoveRawIndex(IDatabaseAsync database, IIndexKey index, string rawKey)
 {
     return(database.SortedSetRemoveAsync(Link.GetIndexKey(index), rawKey));
 }
示例#18
0
 protected override Task RemoveRawIndex(IDatabaseAsync database, IIndexKey index, string rawKey)
 {
     // not supported
     return(Task.CompletedTask);
 }
示例#19
0
 protected override Task AddRawIndex(IDatabaseAsync database, IIndexKey index, string rawKey)
 {
     return(database.ListLeftPushAsync(Link.GetIndexKey(index), rawKey));
 }
示例#20
0
        protected override IObservable <RedisValue> GetIdsSingle(IDatabaseAsync database, IIndexKey index, long start = 0, long stop = -1)
        {
            var hashKey = ((HashIndexKey)index).HashKey;

            return(Observable.Create <RedisValue>(
                       async observer =>
            {
                var result = await Link.Resilience.AsyncRetryPolicy
                             .ExecuteAsync(async() => await database.HashGetAsync(Link.GetIndexKey(index), hashKey).ConfigureAwait(false))
                             .ConfigureAwait(false);
                observer.OnNext(result);
                observer.OnCompleted();
            }));
        }
示例#21
0
 public IIndexManager GetManager(IIndexKey index)
 {
     return(factory.Create(index));
 }
示例#22
0
        protected override Task AddRawIndex(IDatabaseAsync database, IIndexKey index, string rawKey)
        {
            var hashIndex = (HashIndexKey)index;

            return(database.HashSetAsync(Link.GetIndexKey(index), new[] { new HashEntry(hashIndex.HashKey, rawKey) }));
        }
示例#23
0
 public IObservable <RedisValue> GetIds(IDatabaseAsync database, IIndexKey indexes, long start = 0, long stop = -1)
 {
     return(GetIdsSingle(database, indexes, start, stop));
 }
示例#24
0
 public Task Reset(IDatabaseAsync database, IIndexKey indexes)
 {
     log.LogDebug("Reset");
     return(database.KeyDeleteAsync(Link.GetIndexKey(indexes)));
 }
示例#25
0
 protected abstract Task AddRawIndex(IDatabaseAsync database, IIndexKey index, string rawKey);
示例#26
0
 protected abstract IObservable <RedisValue> GetIdsSingle(IDatabaseAsync database, IIndexKey key, long start = 0, long stop = -1);