[tracker/parser] SPARQL: limited support for DATATYPE



commit 1141c682138872825858f0169bfba48ca467c5ca
Author: Philip Van Hoof <philip codeminded be>
Date:   Wed Aug 12 12:25:53 2009 +0200

    SPARQL: limited support for DATATYPE

 src/libtracker-data/tracker-sparql-query.vala |   31 ++++++++++++++++++++++++-
 1 files changed, 30 insertions(+), 1 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-query.vala b/src/libtracker-data/tracker-sparql-query.vala
index ff6596c..c18dca8 100644
--- a/src/libtracker-data/tracker-sparql-query.vala
+++ b/src/libtracker-data/tracker-sparql-query.vala
@@ -988,6 +988,33 @@ public class Tracker.SparqlQuery : Object {
 		expect (SparqlTokenType.CLOSE_PARENS);
 	}
 
+	void translate_datatype (StringBuilder sql) throws SparqlError {
+		expect (SparqlTokenType.DATATYPE);
+		expect (SparqlTokenType.OPEN_PARENS);
+
+		if (accept (SparqlTokenType.VAR)) {
+			string variable_name = get_last_string().substring(1);
+			var binding = var_map.lookup (variable_name);
+
+			check_binding (binding, variable_name);
+
+			if (binding.is_uri || binding.type == null) {
+				throw new SparqlError.PARSE ("Invalid FILTER");
+			}
+
+			sql.append ("(SELECT ID FROM \"rdfs:Resource\" WHERE Uri = ?)");
+
+			var new_binding = new LiteralBinding ();
+			new_binding.literal = binding.type;
+			bindings.append (new_binding);
+
+		} else {
+			throw new SparqlError.PARSE ("Invalid FILTER");
+		}
+
+		expect (SparqlTokenType.CLOSE_PARENS);
+	}
+
 	string parse_string_literal () throws SparqlError {
 		next ();
 		switch (last ()) {
@@ -1129,9 +1156,11 @@ public class Tracker.SparqlQuery : Object {
 			break;
 		case SparqlTokenType.LANG:
 		case SparqlTokenType.LANGMATCHES:
-		case SparqlTokenType.DATATYPE:
 			next ();
 			break;
+		case SparqlTokenType.DATATYPE:
+			translate_datatype (sql);
+			break;
 		case SparqlTokenType.BOUND:
 			translate_bound_call (sql);
 			break;



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