[tracker/subqueries: 1/2] SPARQL: Add experimental subquery support



commit 35aca6df6d2ff47cb772eeec880667b704bc07d9
Author: Jürg Billeter <j bitron ch>
Date:   Wed Dec 2 18:03:16 2009 +0200

    SPARQL: Add experimental subquery support

 src/libtracker-data/tracker-sparql-query.vala |   39 +++++++++++++++++++------
 1 files changed, 30 insertions(+), 9 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-query.vala b/src/libtracker-data/tracker-sparql-query.vala
index 3915577..df030bf 100644
--- a/src/libtracker-data/tracker-sparql-query.vala
+++ b/src/libtracker-data/tracker-sparql-query.vala
@@ -575,7 +575,7 @@ public class Tracker.SparqlQuery : Object {
 		}
 	}
 
-	void translate_select_expression (StringBuilder sql) throws SparqlError {
+	void translate_select_expression (StringBuilder sql, bool subquery) throws SparqlError {
 		if (accept (SparqlTokenType.COUNT)) {
 			sql.append ("COUNT(");
 			translate_expression_as_string (sql);
@@ -624,7 +624,11 @@ public class Tracker.SparqlQuery : Object {
 				expect (SparqlTokenType.PN_PREFIX);
 			}
 		} else {
-			translate_expression_as_string (sql);
+			if (subquery) {
+				translate_expression (sql);
+			} else {
+				translate_expression_as_string (sql);
+			}
 		}
 	}
 
@@ -637,11 +641,20 @@ public class Tracker.SparqlQuery : Object {
 	DBResultSet? execute_select () throws Error {
 		// SELECT query
 
-		var pattern_sql = new StringBuilder ();
 		begin_query ();
 
 		// build SQL
 		var sql = new StringBuilder ();
+		translate_select (sql);
+
+		expect (SparqlTokenType.EOF);
+
+		return exec_sql (sql.str);
+	}
+
+	void translate_select (StringBuilder sql, bool subquery = false) throws Error {
+		var pattern_sql = new StringBuilder ();
+
 		sql.append ("SELECT ");
 
 		expect (SparqlTokenType.SELECT);
@@ -676,7 +689,12 @@ public class Tracker.SparqlQuery : Object {
 				} else {
 					first = false;
 				}
-				append_expression_as_string (sql, variable.sql_expression, variable.binding.data_type);
+				if (subquery) {
+					// don't convert to string in subqueries
+					sql.append (variable.sql_expression);
+				} else {
+					append_expression_as_string (sql, variable.sql_expression, variable.binding.data_type);
+				}
 			}
 		} else {
 			while (true) {
@@ -686,7 +704,7 @@ public class Tracker.SparqlQuery : Object {
 					first = false;
 				}
 
-				translate_select_expression (sql);
+				translate_select_expression (sql, subquery);
 
 				switch (current ()) {
 				case SparqlTokenType.FROM:
@@ -784,10 +802,6 @@ public class Tracker.SparqlQuery : Object {
 			binding.data_type = PropertyType.INTEGER;
 			bindings.append (binding);
 		}
-
-		expect (SparqlTokenType.EOF);
-
-		return exec_sql (sql.str);
 	}
 
 	void translate_expression_as_order_condition (StringBuilder sql) throws SparqlError {
@@ -2202,6 +2216,13 @@ public class Tracker.SparqlQuery : Object {
 	void translate_group_graph_pattern (StringBuilder sql) throws Error {
 		expect (SparqlTokenType.OPEN_BRACE);
 
+		if (current () == SparqlTokenType.SELECT) {
+			translate_select (sql, true);
+
+			expect (SparqlTokenType.CLOSE_BRACE);
+			return;
+		}
+
 		SourceLocation[] filters = { };
 
 		bool in_triples_block = false;



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