[tracker/parser] SPARQL: Add support for GROUP_CONCAT



commit 94839da6238e2797ec4818e093e826440e4631d8
Author: Jürg Billeter <j bitron ch>
Date:   Fri Aug 14 15:54:00 2009 +0200

    SPARQL: Add support for GROUP_CONCAT

 src/libtracker-data/tracker-sparql-query.vala   |   15 +++++++++++++++
 src/libtracker-data/tracker-sparql-scanner.vala |    4 ++++
 2 files changed, 19 insertions(+), 0 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-query.vala b/src/libtracker-data/tracker-sparql-query.vala
index 80accf9..3f288ff 100644
--- a/src/libtracker-data/tracker-sparql-query.vala
+++ b/src/libtracker-data/tracker-sparql-query.vala
@@ -384,6 +384,10 @@ public class Tracker.SparqlQuery : Object {
 		return ((string) (tokens[last_index].begin.pos + strip)).ndup ((tokens[last_index].end.pos - tokens[last_index].begin.pos - 2 * strip));
 	}
 
+	string escape_sql_string_literal (string literal) {
+		return "'%s'".printf (string.joinv ("''", literal.split ("'")));
+	}
+
 	void parse_prologue () throws SparqlError {
 		if (accept (SparqlTokenType.BASE)) {
 			expect (SparqlTokenType.IRI_REF);
@@ -549,6 +553,17 @@ public class Tracker.SparqlQuery : Object {
 			sql.append (")");
 			expect (SparqlTokenType.AS);
 			expect (SparqlTokenType.PN_PREFIX);
+		} else if (accept (SparqlTokenType.GROUP_CONCAT)) {
+			sql.append ("GROUP_CONCAT(");
+			expect (SparqlTokenType.OPEN_PARENS);
+			translate_expression_as_string (sql);
+			sql.append (", ");
+			expect (SparqlTokenType.COMMA);
+			sql.append (escape_sql_string_literal (parse_string_literal ()));
+			sql.append (")");
+			expect (SparqlTokenType.CLOSE_PARENS);
+			expect (SparqlTokenType.AS);
+			expect (SparqlTokenType.PN_PREFIX);
 		} else {
 			translate_expression_as_string (sql);
 		}
diff --git a/src/libtracker-data/tracker-sparql-scanner.vala b/src/libtracker-data/tracker-sparql-scanner.vala
index e7241cc..4882eba 100644
--- a/src/libtracker-data/tracker-sparql-scanner.vala
+++ b/src/libtracker-data/tracker-sparql-scanner.vala
@@ -305,6 +305,9 @@ public class Tracker.SparqlScanner : Object {
 		case 11:
 			if (matches (begin, "LANGMATCHES")) return SparqlTokenType.LANGMATCHES;
 			break;
+		case 12:
+			if (matches (begin, "GROUP_CONCAT")) return SparqlTokenType.GROUP_CONCAT;
+			break;
 		}
 		return SparqlTokenType.PN_PREFIX;
 	}
@@ -775,6 +778,7 @@ public enum Tracker.SparqlTokenType {
 	FROM,
 	GRAPH,
 	GROUP,
+	GROUP_CONCAT,
 	INSERT,
 	INTEGER,
 	INTO,



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