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());
 		}
 
-	}*/
-
+	}
+*/
 }