summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2010-11-17 14:31:55 +0100
committerJürg Billeter <j@bitron.ch>2010-11-17 16:04:43 +0100
commitde4a44f8c51cbc6026837f0ab017def565baf6d7 (patch)
tree32125f8da75da51c123fc340317961355ce640c7
parent2a3e4589761c5289b9b9ab6cef6e194325c279b8 (diff)
downloadtracker-de4a44f8c51cbc6026837f0ab017def565baf6d7.tar.gz
SPARQL: Use proper collation for fn:starts-with
-rw-r--r--src/libtracker-data/tracker-sparql-expression.vala18
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 90372a40a..45458d6aa 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") {