changeset 727:4d9e4ff0a9cd

* Now produces results - a Vector of Result objects * Handles includeKeys / excludeKeys correctly
author mas01mj
date Mon, 26 Jul 2010 14:58:13 +0000
parents fe2282b9bfb0
children d3407d1e2f57
files bindings/java/ext/libAudioDB_JNI.c bindings/java/src/org/omras2/AudioDB.java bindings/java/src/org/omras2/Result.java bindings/java/test/TestInsert.java bindings/java/test/TestQuery.java
diffstat 5 files changed, 129 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- 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, "<init>", "()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, "<init>", "(Ljava/lang/String;DII)V");
+	if(resultCtor == NULL) return;
+
+	for(i=0; i<result->nresults; 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; i<spec->refine.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; i<spec->refine.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);
 }
 
--- 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<Result> 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<Result> query(String key, Query config)
 	{
-		audiodb_query_by_key(key, config);	
+		return audiodb_query_by_key(key, config);	
 	}
 
 	public Status getStatus() 
--- /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;
+	}
+}
--- 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()
--- 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<Result> 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<Result> 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());
+		}
+
+	}*/
 
 }