示例#1
0
        private int _numOfRequiredDocuments;    // Only required number of documents are returned by to the client

        public IterativeOperation(IList <ISet> sets, List <IDataCombiner> combiners, IDataSelector dataSelector, IComparer comparer)
        {
            _lastReaderId    = null;
            _lastSentChunkId = -1;
            _dataSelector    = dataSelector;
            IList <ISet> setsToBeRemoved = new List <ISet>();

            foreach (var set in sets)
            {
                if (set.IsFixedSize == true && set.GetTopElement() == null)
                {
                    setsToBeRemoved.Add(set);
                    set.DisposeReader();
                }
            }

            ListUtilMethods.RemoveMultipleItemsFromList(sets, setsToBeRemoved);

            _dataSelector.Initialize(sets, combiners, comparer);
            _lastSentDataChunk = null;
            _autoChunkId       = -1;
        }
示例#2
0
        public bool MoveNext()
        {
            bool         readerUIDFound     = false;
            bool         documentFound      = false;
            IList <ISet> dataSetToBeRemoved = new List <ISet>();     // Remove the shards where no more data is available
            int          skipped            = 0;

            if (_distributedDataSetsList.Count == 0)
            {
                return(false);
            }
            foreach (ISet set in _distributedDataSetsList)
            {
                if (set.ReaderUID.Equals(_lastReaderId) || readerUIDFound || _lastReaderId == null)
                {
                    _lastReaderId  = set.ReaderUID;
                    readerUIDFound = true;
                    int setsToBeRemovedCount = dataSetToBeRemoved.Count;
                    _currentElement = GetCurrentElement(set, dataSetToBeRemoved);

                    if (_currentElement != null)
                    {
                        documentFound = true;
                        break;
                    }
                    else if (dataSetToBeRemoved.Count - setsToBeRemovedCount == 0)
                    {
                        skipped++;
                        set.Load();
                        continue;
                    }
                }
                else
                {
                    skipped++;
                }
            }
            if (!readerUIDFound)
            {
                throw new Exception("At QueryRouter: Invalid Reader UID");
            }


            int counter = 0;

            if (documentFound == false)
            {
                foreach (ISet set in _distributedDataSetsList)
                {
                    if (skipped == counter)
                    {
                        break;
                    }

                    _currentElement = GetCurrentElement(set, dataSetToBeRemoved);
                    if (_currentElement != null)
                    {
                        _lastReaderId = set.ReaderUID;
                        documentFound = true;
                        break;
                    }
                    counter++;
                }
            }

            if (dataSetToBeRemoved.Count != 0)
            {
                ListUtilMethods.RemoveMultipleItemsFromList(_distributedDataSetsList, dataSetToBeRemoved);
            }
            return(documentFound);
        }