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); }
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]++; } }