diff reporter.h @ 307:d1b8b2dec37e

Added reporters radius search via Web Services. The ordering for radius search is degenerate if usingQueryPoint, because the query point can only be counted once. This behaviour is changed by specifying -n 1 to emulate the trackAveragingReporter ordering behaviour
author mas01mc
date Wed, 06 Aug 2008 21:23:14 +0000
parents d9a88cfd4ab6
children 25572f1bd37f
line wrap: on
line diff
--- a/reporter.h	Tue Aug 05 22:40:38 2008 +0000
+++ b/reporter.h	Wed Aug 06 21:23:14 2008 +0000
@@ -379,7 +379,6 @@
   return *t;
 }
 
-
 // track Sequence Query Radius Reporter
 // only return tracks and retrieved point counts
 class trackSequenceQueryRadReporter : public Reporter { 
@@ -469,8 +468,28 @@
 	std::cout << r.trackID << " ";
       std::cout << r.count << std::endl;
     }
-  } else {
-    // FIXME
+  } 
+ else {
+    ((adb__queryResponse*)adbQueryResponse)->result.__sizeRlist=size;
+    ((adb__queryResponse*)adbQueryResponse)->result.__sizeDist=size;
+    ((adb__queryResponse*)adbQueryResponse)->result.__sizeQpos=size;
+    ((adb__queryResponse*)adbQueryResponse)->result.__sizeSpos=size;
+    ((adb__queryResponse*)adbQueryResponse)->result.Rlist= new char*[size];
+    ((adb__queryResponse*)adbQueryResponse)->result.Dist = new double[size];
+    ((adb__queryResponse*)adbQueryResponse)->result.Qpos = new unsigned int[size];
+    ((adb__queryResponse*)adbQueryResponse)->result.Spos = new unsigned int[size];
+    unsigned int k = 0;
+    for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
+      r = *rit;
+      ((adb__queryResponse*)adbQueryResponse)->result.Rlist[k] = new char[O2_MAXFILESTR];
+      ((adb__queryResponse*)adbQueryResponse)->result.Dist[k] = 0;
+      ((adb__queryResponse*)adbQueryResponse)->result.Qpos[k] = 0;
+      ((adb__queryResponse*)adbQueryResponse)->result.Spos[k] = 0;
+      if(fileTable)
+	snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE);
+      else
+	snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%d", r.trackID);
+    }
   }
 }
 
@@ -533,15 +552,15 @@
     if (it == set->end()) {
       set->insert(pair);
       count[trackID]++;
-      if (!isnan(dist)) {
-	r.trackID = trackID;
-	r.qpos = qpos;
-	r.dist = dist;
-	r.spos = spos;
-	point_queues[trackID].push(r);
-	if(point_queues[trackID].size() > pointNN)
-	  point_queues[trackID].pop();
-      }
+    }
+    if (!isnan(dist)) {
+      r.trackID = trackID;
+      r.qpos = qpos;
+      r.dist = dist;
+      r.spos = spos;
+      point_queues[trackID].push(r);
+      if(point_queues[trackID].size() > pointNN)
+	point_queues[trackID].pop();
     }
   }
 }
@@ -552,25 +571,46 @@
   // tiebreak behaviour as before.
   Radresult r;
   NNresult rk;
+  std::vector<Radresult> v;
+  unsigned int size;
 
-  for (int i = numFiles-1; i >= 0; i--) {
-    r.trackID = i;
-    r.count = count[i];
-    if(r.count > 0) {
-      cout.flush();
-      result.push(r);
-      if (result.size() > trackNN) {
-        result.pop();
+  if(pointNN>1){
+    for (int i = numFiles-1; i >= 0; i--) {
+      r.trackID = i;
+      r.count = count[i];
+      if(r.count > 0) {
+	cout.flush();
+	result.push(r);
+	if (result.size() > trackNN) {
+	  result.pop();
+	}
       }
     }
+    
+    size = result.size();
+    for(unsigned int k = 0; k < size; k++) {
+      r = result.top();
+      v.push_back(r);
+      result.pop();
+    }
   }
-
-  std::vector<Radresult> v;
-  unsigned int size = result.size();
-  for(unsigned int k = 0; k < size; k++) {
-    r = result.top();
-    v.push_back(r);
-    result.pop();
+  else{
+    // Instantiate a 1-NN trackAveragingNN reporter
+    trackSequenceQueryNNReporter<std::less <NNresult> >* rep = new trackSequenceQueryNNReporter<std::less <NNresult> >(1, trackNN, numFiles);
+    // Add all the points we've got to the reporter
+    for(unsigned int i=0; i<numFiles; i++){
+      int qsize = point_queues[i].size();
+      while(qsize--){
+	rk = point_queues[i].top();
+	rep->add_point(i, rk.qpos, rk.spos, rk.dist);
+	point_queues[i].pop();
+      }	
+    }
+    // Report
+    rep->report(fileTable, adbQueryResponse);
+    // Exit
+    delete[] point_queues;
+    return;
   }
 
 
@@ -599,9 +639,40 @@
 	point_queue.pop();
       }
     }
-  } else {
-    // FIXME
   }
+ else {
+   ((adb__queryResponse*)adbQueryResponse)->result.__sizeRlist=size;
+    ((adb__queryResponse*)adbQueryResponse)->result.__sizeDist=size;
+    ((adb__queryResponse*)adbQueryResponse)->result.__sizeQpos=size;
+    ((adb__queryResponse*)adbQueryResponse)->result.__sizeSpos=size;
+    ((adb__queryResponse*)adbQueryResponse)->result.Rlist= new char*[size];
+    ((adb__queryResponse*)adbQueryResponse)->result.Dist = new double[size];
+    ((adb__queryResponse*)adbQueryResponse)->result.Qpos = new unsigned int[size];
+    ((adb__queryResponse*)adbQueryResponse)->result.Spos = new unsigned int[size];
+    unsigned int k = 0;
+    // Loop over returned tracks
+    for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
+      r = *rit;
+      // Reverse the order of the points stored in point_queues
+      unsigned int qsize=point_queues[r.trackID].size();
+      while(qsize--){
+	point_queue.push(point_queues[r.trackID].top());
+	point_queues[r.trackID].pop();
+      }
+      qsize=point_queue.size();
+      rk = point_queue.top(); // Take one point from the top of the queue
+      ((adb__queryResponse*)adbQueryResponse)->result.Rlist[k] = new char[O2_MAXFILESTR];
+      ((adb__queryResponse*)adbQueryResponse)->result.Dist[k] = rk.dist;
+      ((adb__queryResponse*)adbQueryResponse)->result.Qpos[k] = rk.qpos;
+      ((adb__queryResponse*)adbQueryResponse)->result.Spos[k] = rk.spos;
+      if(fileTable)
+	snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE);
+      else
+	snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%d", r.trackID);
+      while(qsize--) // pop the rest of the points
+	point_queue.pop();
+    }
+ }
   delete[] point_queues;
 }