예제 #1
0
        public void BackgroundModule_CountLoads_CountLoads()
        {
            var background = new BackgroundModule(new QueueConfiguration(1, 100));

            background.Start();

            var search = new TestSelectTask("", new List <ServerId>(), "", new FieldDescription("", typeof(int)));

            background.Run(search,
                           () => search.BackgroundLoadInner(() => SystemSearchStateInner.AllDataAvailable, null, null));


            Thread.Sleep(TimeSpan.FromMilliseconds(100));
            Assert.AreEqual(1, search.CountLoads);
            search.GetDataInner();

            Thread.Sleep(TimeSpan.FromMilliseconds(100));
            Assert.AreEqual(2, search.CountLoads);
            Thread.Sleep(TimeSpan.FromMilliseconds(100));
            Assert.AreEqual(2, search.CountLoads);
            search.Finish = true;
            search.GetDataInner();

            Thread.Sleep(TimeSpan.FromMilliseconds(100));
            Assert.AreEqual(3, search.CountLoads);
            search.GetDataInner();

            Thread.Sleep(TimeSpan.FromMilliseconds(100));
            Assert.AreEqual(3, search.CountLoads);

            background.Dispose();
        }
예제 #2
0
        private SelectReader CreateOrderReader(string query, int limitCount, int userPage,
                                               ScriptType type, List <FieldDescription> userParameters)
        {
            var function = _mergeBase.GetMergeFunction(type);

            if (function == null)
            {
                throw new Exception(Errors.CannotParseQuery);
            }

            var description = _scriptParser.PrepareOrderScriptInner(query, _dataLoader.SystemPage + 2);

            description.Item1.PageSize   = userPage;
            description.Item1.IsFirstAsk = true;

            if (description == null)
            {
                throw new Exception(Errors.CannotParseQuery);
            }

            var servers    = _distributor.GetAvailableServers();
            var searchTask = new OrderSelectTask(servers, description.Item1, description.Item1, description.Item2,
                                                 limitCount, userPage, userParameters, _tableName);

            _scriptParser.PrepareStartPages(searchTask.SearchTasks);

            _dataLoader.LoadAllPagesParallel(searchTask.SearchTasks);
            searchTask.ClearServers();

            description.Item1.IsFirstAsk = false;

            var result = function(searchTask, searchTask.SearchTasks);

            searchTask.CalculateCanRead();

            if ((result.Count < limitCount || limitCount == -1) && searchTask.IsCanRead())
            {
                _backgroundModule.Run(searchTask,
                                      () => searchTask.BackgroundLoadInner(_distributor.GetState, _dataLoader, function));
            }
            else
            {
                searchTask.SetFinish();
            }

            var reader = new SelectReader(searchTask, result, limitCount);

            return(reader);
        }