示例#1
0
文件: Table.cs 项目: zoukaifa/TriSQL
        /// <summary>
        /// topk 目前的names.count = 1 主要在服务器端未实现多值比较
        /// </summary>
        public List <List <long> > topK(int k, string[] names)
        {
            if (k == 0)
            {
                throw new Exception("k不能为0");
            }
            List <int> pos = new List <int>();

            foreach (var name in names)
            {
                pos.Add(nametopos(name));
            }
            TopKMessageWriter   msg = new TopKMessageWriter(k, pos, this.cellIds);
            List <List <long> > r   = Global.CloudStorage.TopKFromClientToDatabaseProxy(0, msg).celllids;

            return(r);
        }
示例#2
0
        public override void TopKFromClientHandler(TopKMessageReader request, TopKResponceWriter response)
        {
            idDict.Clear();
            values.Clear();
            List <List <List <long> > > classify = Classify(request.celllids, request.cond);

            for (int i = 0; i < Global.ServerCount; i++)
            {
                TopKMessageWriter msg = new TopKMessageWriter(request.k, request.cond, classify[i]);
                Global.CloudStorage.TopKFromProxyToDatabaseServer(i, msg);
            }
            sem.WaitOne();
            int k = request.k;

            int[] stage = new int[k];
            for (int i = 0; i < k; i++)
            {
                stage[i] = 0;
            }
            response.celllids = new List <List <long> >();
            for (int i = 0; i < k; i++)
            {
                int max       = values[0][stage[0]];
                int maxserver = 0;
                for (int j = 1; j < Global.ServerCount; j++)
                {
                    if (max < values[j][stage[j]])
                    {
                        max       = values[j][stage[j]];
                        maxserver = j;
                    }
                }
                response.celllids.Add(idDict[maxserver][stage[maxserver]]);
                stage[maxserver]++;
            }
        }