[tracker] SPARQL: Use proper collation for fn:starts-with



commit de4a44f8c51cbc6026837f0ab017def565baf6d7
Author: Jürg Billeter <j bitron ch>
Date:   Wed Nov 17 14:31:55 2010 +0100

    SPARQL: Use proper collation for fn:starts-with

 src/libtracker-data/tracker-sparql-expression.vala |   18 +++++++++++++-----
 1 files changed, 13 insertions(+), 5 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-expression.vala b/src/libtracker-data/tracker-sparql-expression.vala
index 90372a4..45458d6 100644
--- a/src/libtracker-data/tracker-sparql-expression.vala
+++ b/src/libtracker-data/tracker-sparql-expression.vala
@@ -405,18 +405,26 @@ class Tracker.Sparql.Expression : Object {
 
 			return PropertyType.BOOLEAN;
 		} else if (uri == FN_NS + "starts-with") {
-			// fn:starts-with('A','B') => 'A' GLOB 'B*'
-			sql.append ("(");
+			// fn:starts-with('A','B') => 'A' BETWEEN 'B' AND 'B\u0010fffd'
+			// 0010fffd always sorts last
+
 			translate_expression_as_string (sql);
-			sql.append (" GLOB ");
+			sql.append (" BETWEEN ");
+
 			expect (SparqlTokenType.COMMA);
+			string prefix = parse_string_literal ();
 
 			sql.append ("?");
 			var binding = new LiteralBinding ();
-			binding.literal = "%s*".printf (parse_string_literal ());
+			binding.literal = prefix;
 			query.bindings.append (binding);
 
-			sql.append (")");
+			sql.append (" AND ");
+
+			sql.append ("?");
+			binding = new LiteralBinding ();
+			binding.literal = prefix + ((unichar) 0x10fffd).to_string ();
+			query.bindings.append (binding);
 
 			return PropertyType.BOOLEAN;
 		} else if (uri == FN_NS + "ends-with") {



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