diff soap.cpp @ 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 2cc06e5b05a5
children 896679d8cc39
line wrap: on
line diff
--- a/soap.cpp	Tue Aug 05 22:40:38 2008 +0000
+++ b/soap.cpp	Wed Aug 06 21:23:14 2008 +0000
@@ -28,13 +28,13 @@
   soap_done(&soap);
 }
 
-void audioDB::ws_query(const char*dbName, const char *trackKey, const char* hostport){
+void audioDB::ws_query(const char*dbName, const char *featureFileName, const char* hostport){
   struct soap soap;
   adb__queryResponse adbQueryResponse;  
 
   soap_init(&soap);  
   if(soap_call_adb__query(&soap,hostport,NULL,
-			  (char*)dbName,(char*)trackKey,(char*)trackFileName,(char*)timesFileName,
+			  (char*)dbName,(char*)featureFileName,(char*)trackFileName,(char*)timesFileName,
 			  queryType, queryPoint, pointNN, trackNN, sequenceLength, adbQueryResponse)==SOAP_OK){
     //std::std::cerr << "result list length:" << adbQueryResponse.result.__sizeRlist << std::std::endl;
     for(int i=0; i<adbQueryResponse.result.__sizeRlist; i++)
@@ -48,10 +48,44 @@
   soap_end(&soap);
   soap_done(&soap);
 }
+
+void audioDB::ws_query_by_key(const char*dbName, const char *trackKey, const char* hostport){
+  struct soap soap;
+  adb__queryResponse adbQueryResponse;  
+  adb__sequenceQueryParms asqp;
+  
+  asqp.keyList = (char*)trackFileName;
+  asqp.timesFileName = (char*)timesFileName;
+  asqp.queryPoint = queryPoint;
+  asqp.pointNN = pointNN;
+  asqp.trackNN = trackNN;
+  asqp.sequenceLength = sequenceLength;
+  asqp.radius = radius;
+  asqp.relative_threshold = relative_threshold;
+  asqp.absolute_threshold = absolute_threshold;
+
+  soap_init(&soap);  
+  if(queryType==O2_SEQUENCE_QUERY || queryType==O2_N_SEQUENCE_QUERY){
+    if(soap_call_adb__sequenceQuery_by_key(&soap,hostport,NULL,(char*)dbName,(char*)trackKey,queryType,&asqp,adbQueryResponse)==SOAP_OK){
+      //std::std::cerr << "result list length:" << adbQueryResponse.result.__sizeRlist << std::std::endl;
+      for(int i=0; i<adbQueryResponse.result.__sizeRlist; i++)
+	std::cout << adbQueryResponse.result.Rlist[i] << " " << adbQueryResponse.result.Dist[i] 
+		  << " " << adbQueryResponse.result.Qpos[i] << " " << adbQueryResponse.result.Spos[i] << std::endl;
+    }
+    else
+      soap_print_fault(&soap,stderr);
+  }else
+    ;// FIX ME: WRITE NON-SEQUENCE QUERY BY KEY ?
+  
+  soap_destroy(&soap);
+  soap_end(&soap);
+  soap_done(&soap);
+}
+
 
 /* Server definitions */
 int adb__status(struct soap* soap, xsd__string dbName, adb__statusResponse &adbStatusResponse){
-  char* const argv[]={"audioDB",COM_STATUS,"-d",dbName};
+  char* const argv[]={"./audioDB",COM_STATUS,"-d",dbName};
   const unsigned argc = 4;
   try {
     audioDB(argc, argv, &adbStatusResponse);
@@ -125,16 +159,19 @@
   }
 }
 
-int adb__sequenceQuery(struct soap* soap, xsd__string dbName, xsd__string qKey,
-		       adb__sequenceQueryParms *parms,
-		       adb__queryResponse &adbQueryResponse) {
+// A sequence query using radius and a query key
+int adb__sequenceQuery_by_key(struct soap* soap, xsd__string dbName, xsd__string qKey, int qType,
+		       adb__sequenceQueryParms* parms,
+		       adb__queryResponse& adbQueryResponse) {
 
+  char radiusStr[256];
   char qPosStr[256];
   char pointNNStr[256];
   char trackNNStr[256];
   char seqLenStr[256];
   char relative_thresholdStr[256];
   char absolute_thresholdStr[256];
+  char qtypeStr[256];
 
   /* When the branch is merged, move this to a header and use it
      elsewhere */
@@ -143,45 +180,44 @@
 #define DOUBLESTRINGIFY(val, str) \
   snprintf(str, 256, "%f", val);
 
-  INTSTRINGIFY(parms->qPos, qPosStr);
+  INTSTRINGIFY(parms->queryPoint, qPosStr);
   INTSTRINGIFY(parms->pointNN, pointNNStr);
-  INTSTRINGIFY(parms->segNN, trackNNStr);
-  /* FIXME: decide which of segLen and seqLen should live */
-  INTSTRINGIFY(parms->segLen, seqLenStr);
+  INTSTRINGIFY(parms->trackNN, trackNNStr);
+  INTSTRINGIFY(parms->sequenceLength, seqLenStr);
 
   DOUBLESTRINGIFY(parms->relative_threshold, relative_thresholdStr);
   DOUBLESTRINGIFY(parms->absolute_threshold, absolute_thresholdStr);
-  
+  DOUBLESTRINGIFY(parms->radius, radiusStr);  
+
+  // WS queries only support 1-nearest neighbour point reporting
+  // at the moment, until we figure out how to better serve results
+  snprintf(qtypeStr, 256, "nsequence");
+
   const char *argv[] = {
     "./audioDB",
     COM_QUERY,
-    "sequence",
+    qtypeStr,
     COM_DATABASE,
     dbName, 
-    COM_FEATURES,
-    qKey,
+    COM_QUERYKEY,
+    ENSURE_STRING(qKey),
     COM_KEYLIST,
-    /* FIXME: when this branch is merged, use ENSURE_STRING */
-    parms->keyList==0?"":parms->keyList,
-    COM_TIMES,
-    parms->timesFileName==0?"":parms->timesFileName,
-    COM_QUERYPOWER,
-    parms->powerFileName==0?"":parms->powerFileName,
+    ENSURE_STRING(parms->keyList),
     COM_QPOINT, 
     qPosStr,
     COM_POINTNN,
     pointNNStr,
     COM_TRACKNN,
     trackNNStr,
+    COM_RADIUS,
+    radiusStr,
     COM_SEQLEN,
     seqLenStr,
-    COM_RELATIVE_THRESH,
-    relative_thresholdStr,
     COM_ABSOLUTE_THRESH,
     absolute_thresholdStr
   };
 
-  const unsigned argc = 25;
+  const unsigned argc = 21;
 
   try {
     audioDB(argc, (char* const*)argv, &adbQueryResponse);