Mercurial > hg > audiodb
changeset 729:a9978a6d0bb3
* Initial code to handle querying by datum
* Created Datum class (without key var)
* Added toString to Result for quick debug
* Needs plenty of testing!
author | mas01mj |
---|---|
date | Tue, 03 Aug 2010 17:08:54 +0000 |
parents | d3407d1e2f57 |
children | 65134dd772fc |
files | bindings/java/ext/libAudioDB_JNI.c bindings/java/src/org/omras2/AudioDB.java bindings/java/src/org/omras2/Datum.java bindings/java/src/org/omras2/Query.java bindings/java/src/org/omras2/Result.java bindings/java/test/TestQuery.java |
diffstat | 6 files changed, 126 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/bindings/java/ext/libAudioDB_JNI.c Mon Jul 26 16:19:56 2010 +0000 +++ b/bindings/java/ext/libAudioDB_JNI.c Tue Aug 03 17:08:54 2010 +0000 @@ -13,7 +13,15 @@ #define ADB_HEADER_FLAG_TIMES 0x20 #define ADB_HEADER_FLAG_REFERENCES 0x40 -double get_int_val(JNIEnv *env, jclass classValue, jobject objectValue, char* field, int defaultValue) +jdoubleArray get_double_array(JNIEnv *env, jclass classValue, jobject objectValue, char* field) +{ + jfieldID fid = (*env)->GetFieldID(env, classValue, field, "[D"); + if(fid == NULL) return NULL; + jdoubleArray arr = (*env)->GetObjectField(env, objectValue, fid); + return arr; +} + +int get_int_val(JNIEnv *env, jclass classValue, jobject objectValue, char* field, int defaultValue) { jfieldID fid = (*env)->GetFieldID(env, classValue, field, "I"); if(fid == NULL) return defaultValue; @@ -309,17 +317,22 @@ return vector; } -JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1query_1by_1key(JNIEnv *env, jobject adbobj, jstring key, jobject queryObject) +JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1query(JNIEnv *env, jobject adbobj, jstring key, jobject queryObject) { adb_t* handle = get_handle(env, adbobj); if(!handle) return; - const char* keyStr = (*env)->GetStringUTFChars(env, key, NULL); - if (keyStr == NULL) - return; + jclass queryClass = (*env)->GetObjectClass(env, queryObject); + jclass datumClass = (*env)->FindClass(env, "org/omras2/Datum"); + jfieldID datumFid = (*env)->GetFieldID(env, queryClass, "datum", "Lorg/omras2/Datum;"); + if(datumFid == NULL) return; + + jobject datumObject = (*env)->GetObjectField(env, queryObject, datumFid); + if(datumObject == NULL) return; + adb_query_spec_t* spec = (adb_query_spec_t *)malloc(sizeof(adb_query_spec_t)); spec->qid.datum = (adb_datum_t *)malloc(sizeof(adb_datum_t)); adb_query_results_t* result = (adb_query_results_t *)malloc(sizeof(adb_query_results_t)); @@ -327,8 +340,6 @@ // As in python bindings spec->refine.flags = 0; - jclass queryClass = (*env)->GetObjectClass(env, queryObject); - spec->qid.sequence_length = get_int_val(env, queryClass, queryObject, "seqLength", 16); spec->qid.sequence_start = get_int_val(env, queryClass, queryObject, "seqStart", 0); spec->params.npoints = get_int_val(env, queryClass, queryObject, "npoints", 1); @@ -441,16 +452,46 @@ spec->qid.datum->power = NULL; spec->qid.datum->times = NULL; - int ok = audiodb_retrieve_datum(handle, keyStr, spec->qid.datum); - if(ok != 0) { - return; + if (key != NULL) + { + const char* keyStr = (*env)->GetStringUTFChars(env, key, NULL); + if(keyStr != NULL) + { + int ok = audiodb_retrieve_datum(handle, keyStr, spec->qid.datum); + if(ok != 0) + return; + } } + else + { + jdoubleArray data = get_double_array(env, datumClass, datumObject, "data"); + jdouble *dataBody = (*env)->GetDoubleArrayElements(env, data, 0); + spec->qid.datum->data = dataBody; + + jdoubleArray power = get_double_array(env, datumClass, datumObject, "power"); + jdouble *powerBody = (*env)->GetDoubleArrayElements(env, power, 0); + spec->qid.datum->power = powerBody; + + jdoubleArray times = get_double_array(env, datumClass, datumObject, "times"); + jdouble *timesBody = (*env)->GetDoubleArrayElements(env, times, 0); + spec->qid.datum->times = timesBody; + + spec->qid.datum->nvectors = get_int_val(env, datumClass, datumObject, "nvectors", 0); + spec->qid.datum->dim = get_int_val(env, datumClass, datumObject, "dim", 0); + + (*env)->ReleaseDoubleArrayElements(env, data, dataBody, 0); + (*env)->ReleaseDoubleArrayElements(env, power, powerBody, 0); + (*env)->ReleaseDoubleArrayElements(env, times, timesBody, 0); + } + result = audiodb_query_spec(handle, spec); if(result == NULL) { return; } (*env)->DeleteLocalRef(env, queryClass); + (*env)->DeleteLocalRef(env, datumClass); + return build_results(env, result); }
--- a/bindings/java/src/org/omras2/AudioDB.java Mon Jul 26 16:19:56 2010 +0000 +++ b/bindings/java/src/org/omras2/AudioDB.java Tue Aug 03 17:08:54 2010 +0000 @@ -11,7 +11,7 @@ public native Status audiodb_status(); public native boolean audiodb_insert_path(String key, String features, String power, String times); public native boolean audiodb_insert_data(String key, int nvectors, int dim, double[] features, double[] power, double[] times); - public native Vector<Result> audiodb_query_by_key(String key, Query config); + public native Vector<Result> audiodb_query(String key, Query config); public enum Mode { O_RDONLY, O_RDWR } @@ -72,10 +72,15 @@ { return audiodb_open(path.toString(), mode); } + + public Vector<Result> query(Query config) + { + return audiodb_query(null, config); + } public Vector<Result> query(String key, Query config) { - return audiodb_query_by_key(key, config); + return audiodb_query(key, config); } public Status getStatus()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bindings/java/src/org/omras2/Datum.java Tue Aug 03 17:08:54 2010 +0000 @@ -0,0 +1,14 @@ +package org.omras2; +import lombok.Getter; +import lombok.Setter; + +public class Datum +{ + @Getter @Setter private int nvectors; + @Getter @Setter private int dim; + + @Getter @Setter private double[] data = {}; + @Getter @Setter private double[] power = {}; + @Getter @Setter private double[] times = {}; +} +
--- a/bindings/java/src/org/omras2/Query.java Mon Jul 26 16:19:56 2010 +0000 +++ b/bindings/java/src/org/omras2/Query.java Tue Aug 03 17:08:54 2010 +0000 @@ -25,11 +25,14 @@ @Getter @Setter private double absThres; @Getter @Setter private double relThres; @Getter @Setter private double durRatio; - + + @Getter @Setter private Datum datum; + public Query() { accumulation = Accumulation.PER_TRACK; distance = Distance.EUCLIDEAN_NORMED; + datum = new Datum(); } }
--- a/bindings/java/src/org/omras2/Result.java Mon Jul 26 16:19:56 2010 +0000 +++ b/bindings/java/src/org/omras2/Result.java Tue Aug 03 17:08:54 2010 +0000 @@ -15,4 +15,9 @@ this.ipos = ipos; this.qpos = qpos; } + + public String toString() + { + return "{key="+key+" distance="+distance+" ipos="+ipos+" qpos="+qpos+"}"; + } }
--- a/bindings/java/test/TestQuery.java Mon Jul 26 16:19:56 2010 +0000 +++ b/bindings/java/test/TestQuery.java Tue Aug 03 17:08:54 2010 +0000 @@ -35,15 +35,41 @@ query.setIncludeKeys(new String[]{"feat1"}); query.setExcludeKeys(new String[]{"feat2"}); Vector<Result> results = testDB.query("feat1", query); -/* System.out.println(results.size()); - for(Result result: results) + } + + public void testDataQuery() + { + // Insert the same feature twice + AudioDB testDB = new AudioDB(testDBFile); + assertTrue("DB created", testDB.create(1, 2, 1)); + testDB.open(AudioDB.Mode.O_RDWR); + assertTrue("Insert feature file", testDB.insert("feat1", testFeatureFile)); + assertTrue("Insert feature file again", testDB.insert("feat2", testFeatureFile)); + testDB.close(); + + testDB.open(AudioDB.Mode.O_RDONLY); + Status status = testDB.getStatus(); + assertEquals("Two features", 2, status.getNumFiles()); + + Query query = new Query(); + query.setSeqLength(1); + query.setSeqStart(0); + query.setIncludeKeys(new String[]{"feat1"}); + query.setExcludeKeys(new String[]{"feat2"}); + + Datum datum = new Datum(); + datum.setData(new double[]{0.0, 2.2, 1.1}); + datum.setNvectors(3); + datum.setDim(1); + query.setDatum(datum); + + Vector<Result> results = testDB.query(query); + if(results != null) { - System.out.println(result.getKey()); - System.out.println(result.getDistance()); - System.out.println(result.getQpos()); - System.out.println(result.getIpos()); - }*/ + System.out.println("Here with "+results); + } } + /* public void testAdvanced() { @@ -52,10 +78,18 @@ Status status = testDB.getStatus(); System.out.println(status.getNumFiles()); Query query = new Query(); - query.setSeqLength(16); + query.setSeqLength(1); query.setSeqStart(0); query.setExcludeKeys(new String[]{"KSA_CHARM_27", "KSA_CHARM_300"}); - Vector<Result> results = testDB.query("KSA_CHARM_336", query); + + Datum datum = new Datum(); + datum.setData(new double[]{0.0, 2.2, 1.1, 4, 2, 6, 3, 8, 2, 4, 5, 8}); + datum.setDim(12); + datum.setNvectors(1); + query.setDatum(datum); + + Vector<Result> results = testDB.query(query); + System.out.println(results.size()); for(Result result: results) { @@ -65,6 +99,6 @@ System.out.println(" "+result.getIpos()); } - }*/ - + } +*/ }