changeset 423:b09d2eb1a2b2 api-inversion

Cheap hackery abounds. Include an accumulator into the query_loop chain. Somewhat surprisingly, very few tests fail, and those that do are due to over-specific reporting requirements in the case of ties, so rewrite those tests to be more permissive. There are probably codepaths which ignore the accumulator completely; they will still work, because the accumulator will return zero points when it is asked to ->get_points().
author mas01cr
date Wed, 24 Dec 2008 10:55:08 +0000
parents a7d61291fbda
children c6046dd80570
files audioDB.h libtests/0029/prog1.c query.cpp tests/0010/run-test.sh tests/0020/run-test.sh tests/0029/run-test.sh
diffstat 6 files changed, 64 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/audioDB.h	Wed Dec 24 10:55:03 2008 +0000
+++ b/audioDB.h	Wed Dec 24 10:55:08 2008 +0000
@@ -343,7 +343,7 @@
   void initTablesFromKey(const char* dbName, const Uns32T queryIndex);
   void unitNorm(double* X, unsigned d, unsigned n, double* qNorm);
   void unitNormAndInsertL2(double* X, unsigned dim, unsigned n);
-  unsigned getKeyPos(char* key);
+  unsigned getKeyPos(const char* key);
   void prefix_name(char** const name, const char* prefix);
 
  public:
--- a/libtests/0029/prog1.c	Wed Dec 24 10:55:03 2008 +0000
+++ b/libtests/0029/prog1.c	Wed Dec 24 10:55:08 2008 +0000
@@ -223,7 +223,10 @@
 
     /* check the test values */
     if (size != 1) {returnval = -1;};
-    if (testoneresult(&myadbqueryresult,0,"testfeature",1,0,0)) {returnval = -1;};
+    if (testoneresult(&myadbqueryresult,0,"testfeature",1,0,0) &&
+        testoneresult(&myadbqueryresult,0,"testfeature",1,0,2)) {
+      returnval = -1;
+    };
 
 
 //${AUDIODB} -d testdb -Q sequence -l 2 -f testquery -w testquerypower --absolute-threshold=-0.8 -p 1 > testoutput
@@ -258,7 +261,10 @@
 
     /* check the test values */
     if (size != 1) {returnval = -1;};
-    if (testoneresult(&myadbqueryresult,0,"testfeature",1,0,0)) {returnval = -1;};
+    if (testoneresult(&myadbqueryresult,0,"testfeature",1,0,0) &&
+        testoneresult(&myadbqueryresult,0,"testfeature",1,0,2)) {
+      returnval = -1;
+    };
 
 
 
--- a/query.cpp	Wed Dec 24 10:55:03 2008 +0000
+++ b/query.cpp	Wed Dec 24 10:55:08 2008 +0000
@@ -98,12 +98,18 @@
     query_loop(dbName, query_from_key_index);
   }
 
+  adb_query_results_t *rs = accumulator->get_points();
+  for(unsigned int k = 0; k < rs->nresults; k++) {
+    adb_result_t r = rs->results[k];
+    reporter->add_point(getKeyPos(r.key), r.qpos, r.ipos, r.dist);
+  }
+
   reporter->report(fileTable, adbQueryResponse);
 }
 
 // return ordinal position of key in keyTable
 // this should really be a STL hash map search
-unsigned audioDB::getKeyPos(char* key){  
+unsigned audioDB::getKeyPos(const char* key){  
   if(!dbH)
     error("dbH not initialized","getKeyPos");
   for(unsigned k=0; k<dbH->numFiles; k++)
@@ -758,7 +764,12 @@
 	    if ((!usingPower) || powers_acceptable(qpPtr[j], sPower[trackIndexOffset + k])) {
               // radius test
               if((!radius) || thisDist <= (radius+O2_DISTANCE_TOLERANCE)) {
-                reporter->add_point(track, usingQueryPoint ? queryPoint : j, k, thisDist);
+                adb_result_t r;
+                r.key = fileTable + track * O2_FILETABLE_ENTRY_SIZE;
+                r.dist = thisDist;
+                r.qpos = usingQueryPoint ? queryPoint : j;
+                r.ipos = k;
+                accumulator->add_point(&r);
               }
             }
           }
--- a/tests/0010/run-test.sh	Wed Dec 24 10:55:03 2008 +0000
+++ b/tests/0010/run-test.sh	Wed Dec 24 10:55:08 2008 +0000
@@ -21,29 +21,34 @@
 intstring 2 > testquery
 floatstring 0 0.5 >> testquery
 
+# because we have a tie, we treat both possible answers as correct.
+# This is the only way to preserve my sanity right now.  -- CSR,
+# 2008-12-15.
+
 ${AUDIODB} -d testdb -Q sequence -l 1 -f testquery -R 5 > testoutput
-echo testfeature01 1 > test-expected-output
-echo testfeature10 1 >> test-expected-output
-cmp testoutput test-expected-output
+echo testfeature01 1 > test-expected-output1
+echo testfeature10 1 >> test-expected-output1
+echo testfeature10 1 > test-expected-output2
+echo testfeature01 1 >> test-expected-output2
+cmp testoutput test-expected-output1 || cmp testoutput test-expected-output2
 ${AUDIODB} -d testdb -Q sequence -l 1 -f testquery -r 1 -R 5 > testoutput
-echo testfeature01 1 > test-expected-output
-cmp testoutput test-expected-output
+echo testfeature01 1 > test-expected-output1
+echo testfeature10 1 > test-expected-output2
+cmp testoutput test-expected-output1 || cmp testoutput test-expected-output2
 
 echo "query point (0.5,0.0)"
 intstring 2 > testquery
 floatstring 0.5 0 >> testquery
 
-# FIXME: because there's only one point in each track (and the query),
-# the ordering is essentially database order.  We need these test
-# cases anyway because we need to test non-segfaulting, non-empty
-# results...
-
 ${AUDIODB} -d testdb -Q sequence -l 1 -f testquery -R 5 > testoutput
-echo testfeature01 1 > test-expected-output
-echo testfeature10 1 >> test-expected-output
-cmp testoutput test-expected-output
+echo testfeature01 1 > test-expected-output1
+echo testfeature10 1 >> test-expected-output1
+echo testfeature10 1 > test-expected-output2
+echo testfeature01 1 >> test-expected-output2
+cmp testoutput test-expected-output1 || cmp testoutput test-expected-output2
 ${AUDIODB} -d testdb -Q sequence -l 1 -f testquery -r 1 -R 5 > testoutput
-echo testfeature01 1 > test-expected-output
-cmp testoutput test-expected-output
+echo testfeature01 1 > test-expected-output1
+echo testfeature10 1 > test-expected-output2
+cmp testoutput test-expected-output1 || cmp testoutput test-expected-output2
 
 exit 104
--- a/tests/0020/run-test.sh	Wed Dec 24 10:55:03 2008 +0000
+++ b/tests/0020/run-test.sh	Wed Dec 24 10:55:08 2008 +0000
@@ -24,12 +24,15 @@
 floatstring 0 0.5 >> testquery
 
 ${AUDIODB} -c localhost:10020 -d testdb -Q sequence -l 1 -f testquery -R 5 > testoutput
-echo testfeature01 1 > test-expected-output
-echo testfeature10 1 >> test-expected-output
-cmp testoutput test-expected-output
+echo testfeature01 1 > test-expected-output1
+echo testfeature10 1 >> test-expected-output1
+echo testfeature10 1 > test-expected-output2
+echo testfeature01 1 >> test-expected-output2
+cmp testoutput test-expected-output1 || cmp testoutput test-expected-output2
 ${AUDIODB} -c localhost:10020 -d testdb -Q sequence -l 1 -f testquery -r 1 -R 5 > testoutput
-echo testfeature01 1 > test-expected-output
-cmp testoutput test-expected-output
+echo testfeature01 1 > test-expected-output1
+echo testfeature10 1 > test-expected-output2
+cmp testoutput test-expected-output1 || cmp testoutput test-expected-output2
 
 check_server $!
 
@@ -37,18 +40,16 @@
 intstring 2 > testquery
 floatstring 0.5 0 >> testquery
 
-# FIXME: because there's only one point in each track (and the query),
-# the ordering is essentially database order.  We need these test
-# cases anyway because we need to test non-segfaulting, non-empty
-# results...
-
 ${AUDIODB} -c localhost:10020 -d testdb -Q sequence -l 1 -f testquery -R 5 > testoutput
-echo testfeature01 1 > test-expected-output
-echo testfeature10 1 >> test-expected-output
-cmp testoutput test-expected-output
+echo testfeature01 1 > test-expected-output1
+echo testfeature10 1 >> test-expected-output1
+echo testfeature10 1 > test-expected-output2
+echo testfeature01 1 >> test-expected-output2
+cmp testoutput test-expected-output1 || cmp testoutput test-expected-output2
 ${AUDIODB} -c localhost:10020 -d testdb -Q sequence -l 1 -f testquery -r 1 -R 5 > testoutput
-echo testfeature01 1 > test-expected-output
-cmp testoutput test-expected-output
+echo testfeature01 1 > test-expected-output1
+echo testfeature10 1 > test-expected-output2
+cmp testoutput test-expected-output1 || cmp testoutput test-expected-output2
 
 stop_server $!
 
--- a/tests/0029/run-test.sh	Wed Dec 24 10:55:03 2008 +0000
+++ b/tests/0029/run-test.sh	Wed Dec 24 10:55:08 2008 +0000
@@ -62,14 +62,16 @@
 cmp testoutput test-expected-output
 
 ${AUDIODB} -d testdb -Q sequence -l 2 -f testquery -w testquerypower --absolute-threshold=-0.8 -p 0 > testoutput
-echo testfeature 1 0 0 > test-expected-output
-cmp testoutput test-expected-output
+echo testfeature 1 0 0 > test-expected-output1
+echo testfeature 1 0 2 > test-expected-output2
+cmp testoutput test-expected-output1 || cmp testoutput test-expected-output2
 ${AUDIODB} -d testdb -Q sequence -l 2 -f testquery -w testquerypower --absolute-threshold=-0.8 -p 1 > testoutput
 cat /dev/null > test-expected-output
 cmp testoutput test-expected-output
 
 ${AUDIODB} -d testdb -Q sequence -l 2 -f testquery -w testquerypower --relative-threshold=0.1 -p 0 > testoutput
-echo testfeature 1 0 0 > test-expected-output
-cmp testoutput test-expected-output
+echo testfeature 1 0 0 > test-expected-output1
+echo testfeature 1 0 2 > test-expected-output2
+cmp testoutput test-expected-output1 || cmp testoutput test-expected-output2
 
 exit 104