Beispiel #1
0
        public override void TopKFromProxyHandler(TopKMessageReader request)
        {
            List <List <long> >    cellids   = request.celllids;
            List <List <Element> > correspon = Table.getCorrespon(request.cond, cellids);
            int k = request.k;
            List <List <long> > res = new List <List <long> >(k);
            List <int>          cmp = new List <int>(k);

            for (int i = 0; i < k; i++)
            {
                cmp.Add(-1);
                res.Add(null);
            }
            for (int a = 0; a < correspon.Count; a++)
            {
                bool flag = false;
                int  p    = 0;
                while (p < k && correspon[a][0].intField > cmp[p])
                {
                    ++p;
                    flag = true;
                }
                if (flag)
                {
                    int         tint = correspon[a][0].intField;
                    List <long> tres = cellids[a];
                    while (p - 1 >= 0)
                    {
                        int         tint2 = cmp[p - 1];
                        List <long> tres2 = res[p - 1];
                        cmp[p - 1] = tint;
                        res[p - 1] = tres;
                        tint       = tint2;
                        tres       = tres2;
                        --p;
                    }
                }
            }
            for (int i = 0; i < (k) / 2; i++)
            {
                int         tint = cmp[i];
                List <long> tres = res[i];
                cmp[i]         = cmp[k - i - 1];
                res[i]         = res[k - i - 1];
                cmp[k - i - 1] = tint;
                res[k - i - 1] = tres;
            }
            TopKServerResponceWriter msg = new TopKServerResponceWriter(res, cmp, Global.MyServerId);

            Global.CloudStorage.TopKFromServerToDatabaseProxy(0, msg);
        }
Beispiel #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]++;
            }
        }