[tracker] SPARQL: Support fn:contains and fn:ends-with function in queries



commit b3c34e35b8adae6834ee477a37eb8dd382375b97
Author: Jürg Billeter <j bitron ch>
Date:   Wed Sep 30 18:27:44 2009 +0200

    SPARQL: Support fn:contains and fn:ends-with function in queries

 src/libtracker-data/tracker-sparql-query.vala |   32 ++++++++++++++++++++++++-
 1 files changed, 31 insertions(+), 1 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-query.vala b/src/libtracker-data/tracker-sparql-query.vala
index 5ffc2ad..febeeb0 100644
--- a/src/libtracker-data/tracker-sparql-query.vala
+++ b/src/libtracker-data/tracker-sparql-query.vala
@@ -1167,7 +1167,22 @@ public class Tracker.SparqlQuery : Object {
 	}
 
 	DataType translate_function (StringBuilder sql, string uri) throws SparqlError {
-		if (uri == FN_NS + "starts-with") {
+		if (uri == FN_NS + "contains") {
+			// fn:contains('A','B') => 'A' GLOB '*B*'
+			sql.append ("(");
+			translate_expression_as_string (sql);
+			sql.append (" GLOB ");
+			expect (SparqlTokenType.COMMA);
+
+			sql.append ("?");
+			var binding = new LiteralBinding ();
+			binding.literal = "*%s*".printf (parse_string_literal ());
+			bindings.append (binding);
+
+			sql.append (")");
+
+			return DataType.BOOLEAN;
+		} else if (uri == FN_NS + "starts-with") {
 			// fn:starts-with('A','B') => 'A' GLOB 'B*'
 			sql.append ("(");
 			translate_expression_as_string (sql);
@@ -1182,6 +1197,21 @@ public class Tracker.SparqlQuery : Object {
 			sql.append (")");
 
 			return DataType.BOOLEAN;
+		} else if (uri == FN_NS + "ends-with") {
+			// fn:ends-with('A','B') => 'A' GLOB '*B'
+			sql.append ("(");
+			translate_expression_as_string (sql);
+			sql.append (" GLOB ");
+			expect (SparqlTokenType.COMMA);
+
+			sql.append ("?");
+			var binding = new LiteralBinding ();
+			binding.literal = "*%s".printf (parse_string_literal ());
+			bindings.append (binding);
+
+			sql.append (")");
+
+			return DataType.BOOLEAN;
 		} else {
 			throw get_error ("Unknown function");
 		}



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