Beispiel #1
0
        private SingleServerSearchTask GetCurrent(OrderSelectTask orderSelectTask,
                                                  List <SingleServerSearchTask> searchTasks, OrderType orderType)
        {
            SingleServerSearchTask current = searchTasks.FirstOrDefault(x => !(x.IsAllDataRead && x.Length == 0));

            if (current == null)
            {
                return(null);
            }

            foreach (var searchTask in searchTasks)
            {
                if (searchTask.IsAllDataRead && searchTask.Length == 0)
                {
                    continue;
                }

                if (orderType == OrderType.Desc &&
                    DataComparer.Compare(current.GetData(), searchTask.GetData(), orderSelectTask.ScriptDescription) < 0)
                {
                    current = searchTask;
                }
                if (orderType == OrderType.Asc &&
                    DataComparer.Compare(current.GetData(), searchTask.GetData(), orderSelectTask.ScriptDescription) > 0)
                {
                    current = searchTask;
                }
            }

            return(current);
        }
Beispiel #2
0
        protected override List <SearchData> MergeOrder(OrderSelectTask orderSelectTask,
                                                        List <SingleServerSearchTask> searchTasks, OrderType orderType)
        {
            var ret = new List <SearchData>();

            searchTasks.RemoveAll(x => !x.IsServersAvailbale);

            PreLoadPages(searchTasks);

            while (ret.Count < orderSelectTask.UserPage && !IsFinishMerge(searchTasks))
            {
                var current = GetCurrent(orderSelectTask, searchTasks, orderType);

                if (ret.Count == 0 ||
                    DataComparer.Compare(current.GetData(), ret.Last(), orderSelectTask.ScriptDescription) != 0)
                {
                    ret.Add(current.GetData());
                }

                current.IncrementPosition();

                ReadSameValue(orderSelectTask, searchTasks, ret.Last());

                LoadPages(searchTasks);
                searchTasks.RemoveAll(x => !x.IsServersAvailbale);
            }

            return(ret);
        }
Beispiel #3
0
 private void ReadSameValue(OrderSelectTask orderSelectTask, List <SingleServerSearchTask> searchTasks,
                            SearchData searchData)
 {
     foreach (var searchTask in searchTasks)
     {
         if (!searchTask.IsAllDataRead && searchTask.Length > 0 &&
             DataComparer.Compare(searchTask.GetData(), searchData, orderSelectTask.ScriptDescription) == 0)
         {
             searchTask.IncrementPosition();
         }
     }
 }
Beispiel #4
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);
        }
Beispiel #5
0
        public void OrderMerge_GetMergeFunction_CheckData()
        {
            const int pageSize = 5;

            var loader = new TestDataLoader(pageSize);

            var merge   = new OrderMerge(loader, new TestIntParser());
            var server1 = new ServerId("", 1);
            var server2 = new ServerId("", 2);
            var server3 = new ServerId("", 3);

            #region hell

            loader.Data.Add(server1, new List <SearchData>
            {
                TestHelper.CreateData(1),
                TestHelper.CreateData(2),
                TestHelper.CreateData(4),
                TestHelper.CreateData(5),
                TestHelper.CreateData(6),
                TestHelper.CreateData(7),
                TestHelper.CreateData(8),
            });

            loader.Data.Add(server2, new List <SearchData>
            {
                TestHelper.CreateData(4),
                TestHelper.CreateData(5),
                TestHelper.CreateData(6),
                TestHelper.CreateData(7),
                TestHelper.CreateData(8),
                TestHelper.CreateData(9),
                TestHelper.CreateData(10),
                TestHelper.CreateData(11),
            });

            loader.Data.Add(server3, new List <SearchData>
            {
                TestHelper.CreateData(2),
                TestHelper.CreateData(3),
                TestHelper.CreateData(5),
                TestHelper.CreateData(7),
                TestHelper.CreateData(8),
                TestHelper.CreateData(9),
                TestHelper.CreateData(10),
                TestHelper.CreateData(11),
                TestHelper.CreateData(12),
                TestHelper.CreateData(13),
            });

            #endregion

            var task = new OrderSelectTask(new List <ServerId> {
                server1, server2, server3
            },
                                           new FieldDescription("", typeof(int)), new FieldDescription("", typeof(int)), "asc", -1, 5,
                                           new List <FieldDescription>(), "");
            var function = merge.GetMergeFunction(ScriptType.OrderAsc);

            var result = function(task, task.SearchTasks);
            Assert.AreEqual(1, result[0].Key);
            Assert.AreEqual(2, result[1].Key);
            Assert.AreEqual(3, result[2].Key);
            Assert.AreEqual(4, result[3].Key);
            Assert.AreEqual(5, result[4].Key);
            result = function(task, task.SearchTasks);
            Assert.AreEqual(6, result[0].Key);
            Assert.AreEqual(7, result[1].Key);
            Assert.AreEqual(8, result[2].Key);
            Assert.AreEqual(9, result[3].Key);
            Assert.AreEqual(10, result[4].Key);
            Assert.IsTrue(task.SearchTasks[0].IsAllDataRead);
            result = function(task, task.SearchTasks);
            Assert.AreEqual(11, result[0].Key);
            Assert.AreEqual(12, result[1].Key);
            Assert.AreEqual(13, result[2].Key);
            Assert.IsTrue(task.SearchTasks[0].IsAllDataRead);
            Assert.IsTrue(task.SearchTasks[1].IsAllDataRead);
            Assert.IsTrue(task.SearchTasks[2].IsAllDataRead);
            result = function(task, task.SearchTasks);
            Assert.IsTrue(result.Count == 0);
            Assert.IsTrue(task.SearchTasks[0].IsAllDataRead);
            Assert.IsTrue(task.SearchTasks[1].IsAllDataRead);
            Assert.IsTrue(task.SearchTasks[2].IsAllDataRead);
        }
Beispiel #6
0
 protected abstract List <SearchData> MergeOrder(OrderSelectTask orderSelectTask, List <SingleServerSearchTask> searchTasks, OrderType orderType);
Beispiel #7
0
 private List <SearchData> MergeOrderDesc(OrderSelectTask orderSelectTask, List <SingleServerSearchTask> searchTasks)
 {
     return(MergeOrder(orderSelectTask, searchTasks, OrderType.Desc));
 }