changeset 603:1133c0d6760d

Added support for all-track retrieval * Can now request all items of type mo:Signal * Correctly handles LIMIT / OFFSET, etc. * Some tidying, though still needs refactoring nicely.
author mas01mj
date Mon, 17 Aug 2009 15:36:32 +0000
parents 783a1a5e51b2
children 41665dbab958
files sparql/librdf/src/rdf_storage_audiodb.c
diffstat 1 files changed, 59 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/sparql/librdf/src/rdf_storage_audiodb.c	Mon Aug 17 15:36:31 2009 +0000
+++ b/sparql/librdf/src/rdf_storage_audiodb.c	Mon Aug 17 15:36:32 2009 +0000
@@ -17,6 +17,11 @@
 
 #define LIBRDF_SIGN_KEY 0x04Ed1A7D
 
+#define AF_DIMENSION "http://purl.org/ontology/af/dimension"
+#define AF_VECTORS "http://purl.org/ontology/af/vectors"
+#define MO_SIGNAL "http://purl.org/ontology/mo/Signal"
+#define RDF_TYPE "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
+
 
 typedef struct {
 	librdf_model* model;
@@ -221,6 +226,8 @@
 	librdf_node* subject = librdf_statement_get_subject(statement);
 	librdf_node* object = librdf_statement_get_object(statement);
 	librdf_node* predicate = librdf_statement_get_predicate(statement);
+	librdf_log(world, 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL,
+		"Contains statement %s?", librdf_statement_to_string(statement));
 
 
 	if(subject && object && predicate)
@@ -236,19 +243,12 @@
 			{
 				// Grab the track via audioDB
 				adb_datum_t datum = {0};
-				librdf_log(world, 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL,
-					"Retrieve datum");
 				int result = audiodb_retrieve_datum(
 					context->adb, 
 					librdf_uri_as_string(librdf_node_get_uri(subject)),
 					&datum);
-				librdf_log(world, 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL,
-					"Back...");
 				if(result == 0)
 				{
-					librdf_log(world, 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL,
-						"Found datum");
-
 					// Found it! Free up the datum.
 					audiodb_free_datum(context->adb, &datum);
 					return 1;
@@ -364,7 +364,6 @@
 		librdf_storage_audiodb_find_statements_finished((void*)scontext);
 		return NULL;
 	}
-
 	scontext->results = result_data_new();
 
 	// This will need factoring out
@@ -372,23 +371,27 @@
 	librdf_node* object = librdf_statement_get_object(statement);
 	librdf_node* predicate = librdf_statement_get_predicate(statement);
 
-	librdf_uri* dimension = librdf_new_uri(world, "http://purl.org/ontology/af/dimension");
-	librdf_uri* vectors = librdf_new_uri(world, "http://purl.org/ontology/af/vectors");
+	bool subjres = (subject && librdf_node_is_resource(subject)); 
+	bool predres = (predicate && librdf_node_is_resource(predicate)); 
+	bool objres = (object && librdf_node_is_resource(object)); 
 
-	if(librdf_node_is_resource(subject) && librdf_node_is_resource(predicate))
+	librdf_uri* dimension = librdf_new_uri(world, AF_DIMENSION);
+	librdf_uri* vectors = librdf_new_uri(world, AF_VECTORS);
+	librdf_uri* signal = librdf_new_uri(world, MO_SIGNAL);
+	librdf_uri* type = librdf_new_uri(world, RDF_TYPE);
+
+	if(subjres && predres)
 	{
-		librdf_log(librdf_storage_get_world(storage), 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL,
-			"Got SPX");
+		librdf_log(librdf_storage_get_world(storage), 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL, "Got SPX");
 		librdf_uri* predicate_uri = librdf_node_get_uri(predicate);
+		librdf_uri* subject_uri = librdf_node_get_uri(subject);
 		if(librdf_uri_equals(predicate_uri, dimension) || librdf_uri_equals(predicate_uri, vectors)) 
 		{
 			// Need dimension or vectors - so get the track datum.
 			adb_datum_t datum = {0};
-			librdf_log(world, 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL,
-				"Retrieve datum");
 			int result = audiodb_retrieve_datum(
 				context->adb, 
-				librdf_uri_as_string(librdf_node_get_uri(subject)),
+				librdf_uri_as_string(subject_uri),
 				&datum);
 			if(result == 0)
 			{
@@ -396,36 +399,62 @@
 				raptor_stringbuffer* buffer = raptor_new_stringbuffer();
 				
 				if(librdf_uri_equals(predicate_uri, dimension))
-				{
 					raptor_stringbuffer_append_decimal(buffer, datum.dim);
-					value = librdf_new_node_from_typed_literal(world, raptor_stringbuffer_as_string(buffer), NULL, librdf_new_uri(world, "xsd:integer"));
-				}
 				else if(librdf_uri_equals(predicate_uri, vectors))
-				{
 					raptor_stringbuffer_append_decimal(buffer, datum.nvectors);
-					value = librdf_new_node_from_typed_literal(world, raptor_stringbuffer_as_string(buffer), NULL, librdf_new_uri(world, "xsd:integer"));
-				}
-			
-			//	raptor_free_stringbuffer(value);
+
+				value = librdf_new_node_from_typed_literal(world, raptor_stringbuffer_as_string(buffer), NULL, librdf_new_uri(world, "xsd:integer"));
 
 				result_data_add(world, scontext->results);
 				
 				result_list* list = scontext->results;
 				
-
 				list->tail->statement = librdf_new_statement(world);
 				librdf_statement_set_subject(list->tail->statement, subject); 
 				librdf_statement_set_object(list->tail->statement, value);
 				librdf_statement_set_predicate(list->tail->statement, predicate);
+				
+				librdf_log(world, 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL, "Add statement %s", librdf_statement_to_string(list->tail->statement)); 
 			}
 
-			librdf_log(world, 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL,
-				"Done!");
 		}
 	}
+	else if(predres && objres)
+	{
+		// Got XPO
+		librdf_log(world, 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL, "XPO"); 
+		librdf_uri* predicate_uri = librdf_node_get_uri(predicate);
+		librdf_uri* object_uri = librdf_node_get_uri(object);
+
+		if(librdf_uri_equals(predicate_uri, type) && librdf_uri_equals(object_uri, signal))
+		{
+			adb_liszt_results_t* liszt_results = audiodb_liszt(context->adb);
+
+			uint32_t k;
+			for(k = 0; k < liszt_results->nresults; k++) {
+				result_data_add(world, scontext->results);
+				result_list* list = scontext->results;
+				list->tail->statement = librdf_new_statement(world);
+				librdf_statement_set_subject(list->tail->statement, librdf_new_node_from_uri(world, librdf_new_uri(world, liszt_results->entries[k].key))); 
+
+				librdf_statement_set_predicate(list->tail->statement, predicate);
+				librdf_statement_set_object(list->tail->statement, object);
+				librdf_log(world, 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL, "Add statement %s", librdf_statement_to_string(list->tail->statement)); 
+			}
+			
+			audiodb_liszt_free_results(context->adb, liszt_results);
+			
+		}
+	}
+	else
+	{
+		librdf_log(world, 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL, "Halp?"); 
+	}
 	librdf_free_uri(dimension);
 	librdf_free_uri(vectors);
-
+	librdf_free_uri(signal);
+	librdf_free_uri(type);
+	
 	stream = librdf_new_stream(world,
 		(void*)scontext,
 		&librdf_storage_audiodb_find_statements_end_of_stream,
@@ -468,7 +497,7 @@
 	librdf_storage_audiodb_find_statements_stream_context* scontext=(librdf_storage_audiodb_find_statements_stream_context*)context;
 	librdf_world* world = librdf_storage_get_world(scontext->storage);
 	librdf_log(librdf_storage_get_world(scontext->storage), 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL,
-		"Finished?");
+		"Finished? %d", (scontext->results->head == NULL));
 
 	return (scontext->results->head == NULL);
 }
@@ -496,7 +525,7 @@
 	librdf_world* world = librdf_storage_get_world(scontext->storage);
 	librdf_log(librdf_storage_get_world(scontext->storage), 0, LIBRDF_LOG_INFO, LIBRDF_FROM_STORAGE, NULL,
 		"Get next");
-
+	
 	switch(flags) {
 		case LIBRDF_ITERATOR_GET_METHOD_GET_OBJECT:
 			return scontext->results->head->statement;
@@ -508,7 +537,6 @@
  				"Unknown iterator method flag %d", flags);
 			return NULL;
 	}
-
 }