[tracker] SPARQL: Fix blank node parsing



commit 59ec112e28a1e16d954285315f752b88e314e003
Author: Jürg Billeter <j bitron ch>
Date:   Tue Aug 18 11:10:03 2009 +0200

    SPARQL: Fix blank node parsing

 src/libtracker-data/tracker-sparql-query.vala   |    7 +++++++
 src/libtracker-data/tracker-sparql-scanner.vala |    7 ++++++-
 2 files changed, 13 insertions(+), 1 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-query.vala b/src/libtracker-data/tracker-sparql-query.vala
index 9da226a..5699d20 100644
--- a/src/libtracker-data/tracker-sparql-query.vala
+++ b/src/libtracker-data/tracker-sparql-query.vala
@@ -298,6 +298,9 @@ public class Tracker.SparqlQuery : Object {
 		prefix_map = new HashTable<string,string>.full (str_hash, str_equal, g_free, g_free);
 		subgraph_var_set = new HashTable<string,bool>.full (str_hash, str_equal, g_free, null);
 
+		base_uuid = new uchar[16];
+		uuid_generate (base_uuid);
+
 		this.query_string = query;
 	}
 
@@ -874,6 +877,10 @@ public class Tracker.SparqlQuery : Object {
 			// prefixed name without namespace :bar
 			next ();
 			result = prefix_map.lookup ("") + get_last_string ().substring (1);
+		} else if (accept (SparqlTokenType.BLANK_NODE)) {
+			// _:foo
+			expect (SparqlTokenType.COLON);
+			result = generate_bnodeid (get_last_string ().substring (1));
 		} else if (current () == SparqlTokenType.STRING_LITERAL1) {
 			result = parse_string_literal ();
 		} else if (current () == SparqlTokenType.STRING_LITERAL2) {
diff --git a/src/libtracker-data/tracker-sparql-scanner.vala b/src/libtracker-data/tracker-sparql-scanner.vala
index d729d11..34eab5d 100644
--- a/src/libtracker-data/tracker-sparql-scanner.vala
+++ b/src/libtracker-data/tracker-sparql-scanner.vala
@@ -413,7 +413,7 @@ public class Tracker.SparqlScanner : Object {
 
 		if (current >= end) {
 			type = SparqlTokenType.EOF;
-		} else if (current[0].isalpha () /* || current[0] == ':' */ ) {
+		} else if (current[0].isalpha ()) {
 			// keyword or prefixed name
 			int len = 0;
 			while (current < end && is_pn_char (current[0])) {
@@ -674,6 +674,10 @@ public class Tracker.SparqlScanner : Object {
 					current += 2;
 				}
 				break;
+			case '_':
+				type = SparqlTokenType.BLANK_NODE;
+				current++;
+				break;
 			default:
 				unichar u = ((string) current).get_char_validated ((long) (end - current));
 				if (u != (unichar) (-1)) {
@@ -764,6 +768,7 @@ public enum Tracker.SparqlTokenType {
 	ASK,
 	AVG,
 	BASE,
+	BLANK_NODE,
 	BOUND,
 	BY,
 	CLOSE_BRACE,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]