# HG changeset patch # User mas01mj # Date 1280156293 0 # Node ID 4d9e4ff0a9cdf894de41941a4270a51c28334513 # Parent fe2282b9bfb0b4cd33def92ad8250b12be58d303 * Now produces results - a Vector of Result objects * Handles includeKeys / excludeKeys correctly diff -r fe2282b9bfb0 -r 4d9e4ff0a9cd bindings/java/ext/libAudioDB_JNI.c --- a/bindings/java/ext/libAudioDB_JNI.c Mon Jul 26 13:19:09 2010 +0000 +++ b/bindings/java/ext/libAudioDB_JNI.c Mon Jul 26 14:58:13 2010 +0000 @@ -244,7 +244,42 @@ return result; } -JNIEXPORT void JNICALL Java_org_omras2_AudioDB_audiodb_1query_1by_1key(JNIEnv *env, jobject adbobj, jstring key, jobject queryObject) +jobject build_results(JNIEnv *env, adb_query_results_t *result) +{ + int i; + // Create a vector + jclass vectorClass = (*env)->FindClass(env, "java/util/Vector"); + if(vectorClass == NULL) return; + jmethodID vectorCtor = (*env)->GetMethodID(env, vectorClass, "", "()V"); + if(vectorCtor == NULL) return; + jobject vector = (*env)->NewObject(env, vectorClass, vectorCtor); + + jmethodID addElementMethod = (*env)->GetMethodID(env, vectorClass, "addElement", "(Ljava/lang/Object;)V"); + if(addElementMethod == NULL) return; + + jclass resultClass = (*env)->FindClass(env, "org/omras2/Result"); + if(resultClass == NULL) return; + jmethodID resultCtor = (*env)->GetMethodID(env, resultClass, "", "(Ljava/lang/String;DII)V"); + if(resultCtor == NULL) return; + + for(i=0; inresults; i++) + { + jstring keyStr = (*env)->NewStringUTF(env, result->results[i].ikey); + jobject resultObj = (*env)->NewObject(env, resultClass, resultCtor, + keyStr, + (double)(result->results[i].dist), + (int)(result->results[i].qpos), + (int)(result->results[i].ipos)); + + (*env)->CallObjectMethod(env, vector, addElementMethod, resultObj); + + } + (*env)->DeleteLocalRef(env, resultClass); + (*env)->DeleteLocalRef(env, vectorClass); + return vector; +} + +JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1query_1by_1key(JNIEnv *env, jobject adbobj, jstring key, jobject queryObject) { adb_t* handle = get_handle(env, adbobj); @@ -291,7 +326,6 @@ else if(strcmp(accType, "ONE_TO_ONE") == 0) spec->params.accumulation = ADB_ACCUMULATION_ONE_TO_ONE; else { - printf("Invalid acc\n"); return; } @@ -302,10 +336,43 @@ else if(strcmp(distType, "EUCLIDEAN") == 0) spec->params.distance = ADB_DISTANCE_EUCLIDEAN; else { - printf("Invalid dist\n"); return; } + int i; + + fid = (*env)->GetFieldID(env, queryClass, "includeKeys", "[Ljava/lang/String;"); + if(fid == NULL) return; + jobjectArray includeObj = (jobjectArray)((*env)->GetObjectField(env, queryObject, fid)); + jsize len = (*env)->GetArrayLength(env, includeObj); + + if(len > 0) + { + spec->refine.flags |= ADB_REFINE_INCLUDE_KEYLIST; + spec->refine.include.nkeys = len; + spec->refine.include.keys = (const char **)calloc(sizeof(const char *), spec->refine.include.nkeys); + for(i=0; irefine.include.nkeys; i++) { + jstring key = (*env)->GetObjectArrayElement(env, includeObj, i); + spec->refine.include.keys[i] = (*env)->GetStringUTFChars(env, key, NULL); + } + } + + fid = (*env)->GetFieldID(env, queryClass, "excludeKeys", "[Ljava/lang/String;"); + if(fid == NULL) return; + jobjectArray excludeObj = (jobjectArray)((*env)->GetObjectField(env, queryObject, fid)); + len = (*env)->GetArrayLength(env, excludeObj); + + if(len > 0) + { + spec->refine.flags |= ADB_REFINE_EXCLUDE_KEYLIST; + spec->refine.exclude.nkeys = len; + spec->refine.exclude.keys = (const char **)calloc(sizeof(const char *), spec->refine.exclude.nkeys); + for(i=0; irefine.exclude.nkeys; i++) { + jstring key = (*env)->GetObjectArrayElement(env, excludeObj, i); + spec->refine.exclude.keys[i] = (*env)->GetStringUTFChars(env, key, NULL); + } + } + // Rest of refine double radius = get_double_val(env, queryClass, queryObject, "radius", 0); @@ -344,26 +411,17 @@ spec->qid.datum->power = NULL; spec->qid.datum->times = NULL; - printf("seq length: %d seq start: %d points: %d tracks: %d\n", - spec->qid.sequence_length, - spec->qid.sequence_start, - spec->params.npoints, - spec->params.ntracks); - printf("Radius: %f Abs: %f Rel: %f Dur: %f Hop: %d\n", radius, absThres, relThres, durRatio, hopSize); - printf("Key: %s Acc: %s Dist: %s\n", keyStr, accType, distType); - int ok = audiodb_retrieve_datum(handle, keyStr, spec->qid.datum); if(ok != 0) { - printf("No datum\n"); return; } result = audiodb_query_spec(handle, spec); if(result == NULL) { - printf("No result\n"); return; } - printf("OK: %d\n", ok); (*env)->DeleteLocalRef(env, queryClass); + + return build_results(env, result); } diff -r fe2282b9bfb0 -r 4d9e4ff0a9cd bindings/java/src/org/omras2/AudioDB.java --- a/bindings/java/src/org/omras2/AudioDB.java Mon Jul 26 13:19:09 2010 +0000 +++ b/bindings/java/src/org/omras2/AudioDB.java Mon Jul 26 14:58:13 2010 +0000 @@ -1,6 +1,7 @@ package org.omras2; import java.io.File; +import java.util.Vector; public class AudioDB { @@ -9,7 +10,7 @@ public native void audiodb_close(); public native Status audiodb_status(); public native boolean audiodb_insert_path(String key, String features, String power, String times); - public native void audiodb_query_by_key(String key, Query config); + public native Vector audiodb_query_by_key(String key, Query config); public enum Mode { O_RDONLY, O_RDWR } @@ -51,9 +52,9 @@ return audiodb_open(path.toString(), mode); } - public void query(String key, Query config) + public Vector query(String key, Query config) { - audiodb_query_by_key(key, config); + return audiodb_query_by_key(key, config); } public Status getStatus() diff -r fe2282b9bfb0 -r 4d9e4ff0a9cd bindings/java/src/org/omras2/Result.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bindings/java/src/org/omras2/Result.java Mon Jul 26 14:58:13 2010 +0000 @@ -0,0 +1,18 @@ +package org.omras2; +import lombok.Getter; + +public class Result +{ + @Getter String key; + @Getter int ipos; + @Getter int qpos; + @Getter double distance; + + public Result(String key, double distance, int ipos, int qpos) + { + this.key = key; + this.distance = distance; + this.ipos = ipos; + this.qpos = qpos; + } +} diff -r fe2282b9bfb0 -r 4d9e4ff0a9cd bindings/java/test/TestInsert.java --- a/bindings/java/test/TestInsert.java Mon Jul 26 13:19:09 2010 +0000 +++ b/bindings/java/test/TestInsert.java Mon Jul 26 14:58:13 2010 +0000 @@ -23,10 +23,6 @@ Status status = testDB.getStatus(); assertEquals("One feature in db", 1, status.getNumFiles()); assertEquals("1D Feature", 1, status.getDim()); - System.out.println(status.hasReferences()); - System.out.println(status.isL2Normed()); - System.out.println(status.hasPower()); - System.out.println(status.hasTimes()); } public void testInsertFileReadOnly() diff -r fe2282b9bfb0 -r 4d9e4ff0a9cd bindings/java/test/TestQuery.java --- a/bindings/java/test/TestQuery.java Mon Jul 26 13:19:09 2010 +0000 +++ b/bindings/java/test/TestQuery.java Mon Jul 26 14:58:13 2010 +0000 @@ -1,5 +1,6 @@ import junit.framework.*; import java.io.File; +import java.util.Vector; import org.omras2.*; public class TestQuery extends TestCase @@ -31,7 +32,40 @@ Query query = new Query(); query.setSeqLength(1); query.setSeqStart(0); - testDB.query("feat1", query); + query.setIncludeKeys(new String[]{"feat1"}); + query.setExcludeKeys(new String[]{"feat2"}); + Vector results = testDB.query("feat1", query); + System.out.println(results.size()); + for(Result result: results) + { + System.out.println(result.getKey()); + System.out.println(result.getDistance()); + System.out.println(result.getQpos()); + System.out.println(result.getIpos()); + } } +/* + public void testAdvanced() + { + AudioDB testDB = new AudioDB(new File("testfiles/9.adb")); + testDB.open(AudioDB.Mode.O_RDONLY); + Status status = testDB.getStatus(); + System.out.println(status.getNumFiles()); + Query query = new Query(); + query.setSeqLength(16); + query.setSeqStart(0); + query.setExcludeKeys(new String[]{"KSA_CHARM_27", "KSA_CHARM_336", "KSA_CHARM_300"}); + query.setSeqStart(0); + Vector results = testDB.query("KSA_CHARM_27", query); + System.out.println(results.size()); + for(Result result: results) + { + System.out.print(result.getKey()); + System.out.print(" "+result.getDistance()); + System.out.print(" "+result.getQpos()); + System.out.println(" "+result.getIpos()); + } + + }*/ }