comparison 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
comparison
equal deleted inserted replaced
306:921ba500a024 307:d1b8b2dec37e
26 soap_destroy(&soap); 26 soap_destroy(&soap);
27 soap_end(&soap); 27 soap_end(&soap);
28 soap_done(&soap); 28 soap_done(&soap);
29 } 29 }
30 30
31 void audioDB::ws_query(const char*dbName, const char *trackKey, const char* hostport){ 31 void audioDB::ws_query(const char*dbName, const char *featureFileName, const char* hostport){
32 struct soap soap; 32 struct soap soap;
33 adb__queryResponse adbQueryResponse; 33 adb__queryResponse adbQueryResponse;
34 34
35 soap_init(&soap); 35 soap_init(&soap);
36 if(soap_call_adb__query(&soap,hostport,NULL, 36 if(soap_call_adb__query(&soap,hostport,NULL,
37 (char*)dbName,(char*)trackKey,(char*)trackFileName,(char*)timesFileName, 37 (char*)dbName,(char*)featureFileName,(char*)trackFileName,(char*)timesFileName,
38 queryType, queryPoint, pointNN, trackNN, sequenceLength, adbQueryResponse)==SOAP_OK){ 38 queryType, queryPoint, pointNN, trackNN, sequenceLength, adbQueryResponse)==SOAP_OK){
39 //std::std::cerr << "result list length:" << adbQueryResponse.result.__sizeRlist << std::std::endl; 39 //std::std::cerr << "result list length:" << adbQueryResponse.result.__sizeRlist << std::std::endl;
40 for(int i=0; i<adbQueryResponse.result.__sizeRlist; i++) 40 for(int i=0; i<adbQueryResponse.result.__sizeRlist; i++)
41 std::cout << adbQueryResponse.result.Rlist[i] << " " << adbQueryResponse.result.Dist[i] 41 std::cout << adbQueryResponse.result.Rlist[i] << " " << adbQueryResponse.result.Dist[i]
42 << " " << adbQueryResponse.result.Qpos[i] << " " << adbQueryResponse.result.Spos[i] << std::endl; 42 << " " << adbQueryResponse.result.Qpos[i] << " " << adbQueryResponse.result.Spos[i] << std::endl;
46 46
47 soap_destroy(&soap); 47 soap_destroy(&soap);
48 soap_end(&soap); 48 soap_end(&soap);
49 soap_done(&soap); 49 soap_done(&soap);
50 } 50 }
51
52 void audioDB::ws_query_by_key(const char*dbName, const char *trackKey, const char* hostport){
53 struct soap soap;
54 adb__queryResponse adbQueryResponse;
55 adb__sequenceQueryParms asqp;
56
57 asqp.keyList = (char*)trackFileName;
58 asqp.timesFileName = (char*)timesFileName;
59 asqp.queryPoint = queryPoint;
60 asqp.pointNN = pointNN;
61 asqp.trackNN = trackNN;
62 asqp.sequenceLength = sequenceLength;
63 asqp.radius = radius;
64 asqp.relative_threshold = relative_threshold;
65 asqp.absolute_threshold = absolute_threshold;
66
67 soap_init(&soap);
68 if(queryType==O2_SEQUENCE_QUERY || queryType==O2_N_SEQUENCE_QUERY){
69 if(soap_call_adb__sequenceQuery_by_key(&soap,hostport,NULL,(char*)dbName,(char*)trackKey,queryType,&asqp,adbQueryResponse)==SOAP_OK){
70 //std::std::cerr << "result list length:" << adbQueryResponse.result.__sizeRlist << std::std::endl;
71 for(int i=0; i<adbQueryResponse.result.__sizeRlist; i++)
72 std::cout << adbQueryResponse.result.Rlist[i] << " " << adbQueryResponse.result.Dist[i]
73 << " " << adbQueryResponse.result.Qpos[i] << " " << adbQueryResponse.result.Spos[i] << std::endl;
74 }
75 else
76 soap_print_fault(&soap,stderr);
77 }else
78 ;// FIX ME: WRITE NON-SEQUENCE QUERY BY KEY ?
79
80 soap_destroy(&soap);
81 soap_end(&soap);
82 soap_done(&soap);
83 }
84
51 85
52 /* Server definitions */ 86 /* Server definitions */
53 int adb__status(struct soap* soap, xsd__string dbName, adb__statusResponse &adbStatusResponse){ 87 int adb__status(struct soap* soap, xsd__string dbName, adb__statusResponse &adbStatusResponse){
54 char* const argv[]={"audioDB",COM_STATUS,"-d",dbName}; 88 char* const argv[]={"./audioDB",COM_STATUS,"-d",dbName};
55 const unsigned argc = 4; 89 const unsigned argc = 4;
56 try { 90 try {
57 audioDB(argc, argv, &adbStatusResponse); 91 audioDB(argc, argv, &adbStatusResponse);
58 return SOAP_OK; 92 return SOAP_OK;
59 } catch(char *err) { 93 } catch(char *err) {
123 soap_receiver_fault(soap, err, ""); 157 soap_receiver_fault(soap, err, "");
124 return SOAP_FAULT; 158 return SOAP_FAULT;
125 } 159 }
126 } 160 }
127 161
128 int adb__sequenceQuery(struct soap* soap, xsd__string dbName, xsd__string qKey, 162 // A sequence query using radius and a query key
129 adb__sequenceQueryParms *parms, 163 int adb__sequenceQuery_by_key(struct soap* soap, xsd__string dbName, xsd__string qKey, int qType,
130 adb__queryResponse &adbQueryResponse) { 164 adb__sequenceQueryParms* parms,
131 165 adb__queryResponse& adbQueryResponse) {
166
167 char radiusStr[256];
132 char qPosStr[256]; 168 char qPosStr[256];
133 char pointNNStr[256]; 169 char pointNNStr[256];
134 char trackNNStr[256]; 170 char trackNNStr[256];
135 char seqLenStr[256]; 171 char seqLenStr[256];
136 char relative_thresholdStr[256]; 172 char relative_thresholdStr[256];
137 char absolute_thresholdStr[256]; 173 char absolute_thresholdStr[256];
174 char qtypeStr[256];
138 175
139 /* When the branch is merged, move this to a header and use it 176 /* When the branch is merged, move this to a header and use it
140 elsewhere */ 177 elsewhere */
141 #define INTSTRINGIFY(val, str) \ 178 #define INTSTRINGIFY(val, str) \
142 snprintf(str, 256, "%d", val); 179 snprintf(str, 256, "%d", val);
143 #define DOUBLESTRINGIFY(val, str) \ 180 #define DOUBLESTRINGIFY(val, str) \
144 snprintf(str, 256, "%f", val); 181 snprintf(str, 256, "%f", val);
145 182
146 INTSTRINGIFY(parms->qPos, qPosStr); 183 INTSTRINGIFY(parms->queryPoint, qPosStr);
147 INTSTRINGIFY(parms->pointNN, pointNNStr); 184 INTSTRINGIFY(parms->pointNN, pointNNStr);
148 INTSTRINGIFY(parms->segNN, trackNNStr); 185 INTSTRINGIFY(parms->trackNN, trackNNStr);
149 /* FIXME: decide which of segLen and seqLen should live */ 186 INTSTRINGIFY(parms->sequenceLength, seqLenStr);
150 INTSTRINGIFY(parms->segLen, seqLenStr);
151 187
152 DOUBLESTRINGIFY(parms->relative_threshold, relative_thresholdStr); 188 DOUBLESTRINGIFY(parms->relative_threshold, relative_thresholdStr);
153 DOUBLESTRINGIFY(parms->absolute_threshold, absolute_thresholdStr); 189 DOUBLESTRINGIFY(parms->absolute_threshold, absolute_thresholdStr);
154 190 DOUBLESTRINGIFY(parms->radius, radiusStr);
191
192 // WS queries only support 1-nearest neighbour point reporting
193 // at the moment, until we figure out how to better serve results
194 snprintf(qtypeStr, 256, "nsequence");
195
155 const char *argv[] = { 196 const char *argv[] = {
156 "./audioDB", 197 "./audioDB",
157 COM_QUERY, 198 COM_QUERY,
158 "sequence", 199 qtypeStr,
159 COM_DATABASE, 200 COM_DATABASE,
160 dbName, 201 dbName,
161 COM_FEATURES, 202 COM_QUERYKEY,
162 qKey, 203 ENSURE_STRING(qKey),
163 COM_KEYLIST, 204 COM_KEYLIST,
164 /* FIXME: when this branch is merged, use ENSURE_STRING */ 205 ENSURE_STRING(parms->keyList),
165 parms->keyList==0?"":parms->keyList,
166 COM_TIMES,
167 parms->timesFileName==0?"":parms->timesFileName,
168 COM_QUERYPOWER,
169 parms->powerFileName==0?"":parms->powerFileName,
170 COM_QPOINT, 206 COM_QPOINT,
171 qPosStr, 207 qPosStr,
172 COM_POINTNN, 208 COM_POINTNN,
173 pointNNStr, 209 pointNNStr,
174 COM_TRACKNN, 210 COM_TRACKNN,
175 trackNNStr, 211 trackNNStr,
212 COM_RADIUS,
213 radiusStr,
176 COM_SEQLEN, 214 COM_SEQLEN,
177 seqLenStr, 215 seqLenStr,
178 COM_RELATIVE_THRESH,
179 relative_thresholdStr,
180 COM_ABSOLUTE_THRESH, 216 COM_ABSOLUTE_THRESH,
181 absolute_thresholdStr 217 absolute_thresholdStr
182 }; 218 };
183 219
184 const unsigned argc = 25; 220 const unsigned argc = 21;
185 221
186 try { 222 try {
187 audioDB(argc, (char* const*)argv, &adbQueryResponse); 223 audioDB(argc, (char* const*)argv, &adbQueryResponse);
188 return SOAP_OK; 224 return SOAP_OK;
189 } catch (char *err) { 225 } catch (char *err) {