示例#1
0
        public async Task Lookup(IOrleansQueryResultStream <V> result, K key)
        {
            this.Logger.Trace($"Streamed index lookup called for key = {key}");

            if (!(this.State.IndexStatus == IndexStatus.Available))
            {
                throw LogException("Index is not still available", IndexingErrorCode.IndexingIndexIsNotReadyYet_GrainBucket1);
            }
            if (this.State.IndexMap.TryGetValue(key, out HashIndexSingleBucketEntry <V> entry))
            {
                if (!entry.IsTentative)
                {
                    await result.OnNextBatchAsync(entry.Values);
                }
                await result.OnCompletedAsync();
            }
            else if (this.State.NextBucket != null)
            {
                await GetNextBucket().Lookup(result, key);
            }
            else
            {
                await result.OnCompletedAsync();
            }
        }
        public async Task Lookup(IOrleansQueryResultStream <V> result, K key)
        {
            if (getLogger().IsVerbose)
            {
                getLogger().Verbose("Streamed index lookup called for key = {0}", key);
            }

            if (!(State.IndexStatus == IndexStatus.Available))
            {
                var e = new Exception(string.Format("Index is not still available."));
                GetLogger().Error((int)ErrorCode.IndexingIndexIsNotReadyYet_GrainBucket1, "Index is not still available.", e);
                throw e;
            }
            HashIndexSingleBucketEntry <V> entry;

            if (State.IndexMap.TryGetValue(key, out entry) && !entry.isTentative())
            {
                await result.OnNextBatchAsync(entry.Values);

                await result.OnCompletedAsync();
            }
            else if (State.NextBucket != null)
            {
                await GetNextBucket().Lookup(result, key);
            }
            else
            {
                await result.OnCompletedAsync();
            }
        }
        async Task IndexInterface.Lookup(IOrleansQueryResultStream <IIndexableGrain> result, object key)
        {
            if (logger.IsVerbose)
            {
                logger.Verbose("Streamed index lookup called for key = {0}", key);
            }

            //get all silos
            Dictionary <SiloAddress, SiloStatus> hosts = await SiloUtils.GetHosts(true);

            ISet <Task <IOrleansQueryResult <IIndexableGrain> > > queriesToSilos = GetResultQueries(hosts, key);

            //TODO: After fixing the problem with OrleansStream, this part is not needed anymore
            while (queriesToSilos.Count > 0)
            {
                // Identify the first task that completes.
                Task <IOrleansQueryResult <IIndexableGrain> > firstFinishedTask = await Task.WhenAny(queriesToSilos);

                // ***Remove the selected task from the list so that you don't
                // process it more than once.
                queriesToSilos.Remove(firstFinishedTask);

                // Await the completed task.
                IOrleansQueryResult <IIndexableGrain> partialResult = await firstFinishedTask;

                await result.OnNextBatchAsync(partialResult);
            }
            await result.OnCompletedAsync();
        }
        => Task.FromResult(true);       // The index is maintained by the underlying _grainStorage, when the grain's WriteStateAsync is called

        public async Task Lookup(IOrleansQueryResultStream <V> result, K key)
        {
            var res = await LookupGrainReferences(key);

            await result.OnNextBatchAsync(res);

            await result.OnCompletedAsync();
        }
        public Task Lookup(IOrleansQueryResultStream <V> result, K key)
        {
            logger.Trace($"Streamed index lookup called for key = {key}");

            BucketT targetBucket = GetGrain(IndexUtils.GetIndexGrainPrimaryKey(typeof(V), this._indexName) + "_" + GetBucketIndexFromHashCode(key));

            return(targetBucket.Lookup(result, key));
        }
        public Task Lookup(IOrleansQueryResultStream <V> result, K key)
        {
            logger.Trace($"Streamed index lookup called for key = {key}");

            var     keyHash      = GetBucketIndexFromHashCode(key);
            BucketT targetBucket = this.GetBucketGrain(keyHash);

            return(targetBucket.Lookup(result, key));
        }
        public Task LookupAsync(IOrleansQueryResultStream <V> result, K key)
        {
            logger.Trace($"Streamed index lookup called for key = {key}");

            var     keyHash      = GetBucketIndexFromHashCode(key);
            BucketT targetBucket = this.GetBucketGrain(keyHash);

            return(isTransactional ? ((ITransactionalLookupIndex <K, V>)targetBucket).LookupTransactionalAsync(result, key)
                                   : targetBucket.LookupAsync(result, key));
        }
        public Task Lookup(IOrleansQueryResultStream <V> result, K key)
        {
            if (logger.IsVerbose)
            {
                logger.Verbose("Streamed index lookup called for key = {0}", key);
            }
            BucketT targetBucket = RuntimeClient.Current.InternalGrainFactory.GetGrain <BucketT>(
                IndexUtils.GetIndexGrainID(typeof(V), _indexName) + "_" + key.GetHashCode()
                );

            return(targetBucket.Lookup(result, key));
        }
示例#9
0
        public async Task LookupAsync(IOrleansQueryResultStream <V> result, K key)
        {
            logger.Trace($"Streamed index lookup called for key = {key}");

            if (!(state.IndexStatus == IndexStatus.Available))
            {
                throw LogException($"ParentIndex {_parentIndexName}: Index is not still available.", IndexingErrorCode.IndexingIndexIsNotReadyYet_GrainServiceBucket1);
            }
            if (state.IndexMap.TryGetValue(key, out HashIndexSingleBucketEntry <V> entry) && !entry.IsTentative)
            {
                await result.OnNextAsync(entry.Values.ToBatch());

                await result.OnCompletedAsync();
            }
            else
            {
                await result.OnCompletedAsync();
            }
        }
 // Accept a queryResult instance which we shall observe
 public OrleansQueryResultStreamCaster(IOrleansQueryResultStream <FromTP> stream)
 => this._stream = stream;
 public Task LookupAsync(IOrleansQueryResultStream <V> result, K key)
 => ((IIndexInterface)this).LookupAsync(result.Cast <IIndexableGrain>(), key);
 Task IndexInterface.Lookup(IOrleansQueryResultStream <IIndexableGrain> result, object key)
 {
     return(Lookup(result.Cast <V>(), (K)key));
 }
 public Task Lookup(IOrleansQueryResultStream <V> result, K key)
 {
     return(((IndexInterface)this).Lookup(result.Cast <IIndexableGrain>(), key));
 }
 public Task LookupTransactionalAsync(IOrleansQueryResultStream <IIndexableGrain> result, object key) => ((IIndexInterface <K, V>) this).LookupAsync(result, key);
 public Task LookupTransactionalAsync(IOrleansQueryResultStream <V> result, K key) => this.LookupAsync(result, key);
 Task IIndexInterface.LookupAsync(IOrleansQueryResultStream <IIndexableGrain> result, object key) => this.LookupAsync(result.Cast <V>(), (K)key);