[tracker/parser] SPARQL: support for STR
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker/parser] SPARQL: support for STR
- Date: Wed, 12 Aug 2009 09:25:14 +0000 (UTC)
commit 8d8fdb22a08e0bcce7b5bcf3ca322e817cb6bacd
Author: Philip Van Hoof <philip codeminded be>
Date: Wed Aug 12 11:24:35 2009 +0200
SPARQL: support for STR
src/libtracker-data/tracker-sparql-query.vala | 46 ++++++++++++++++++++++--
1 files changed, 42 insertions(+), 4 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-query.vala b/src/libtracker-data/tracker-sparql-query.vala
index b9d73fa..5364034 100644
--- a/src/libtracker-data/tracker-sparql-query.vala
+++ b/src/libtracker-data/tracker-sparql-query.vala
@@ -433,12 +433,16 @@ public class Tracker.SparqlQuery : Object {
}
}
- string get_sql_for_variable (string variable_name) throws SparqlError {
- var binding = var_map.lookup (variable_name);
-
+ void check_binding (VariableBinding? binding, string variable_name) throws SparqlError {
if (binding == null) {
throw new SparqlError.PARSE ("`%s' is not a valid variable".printf (variable_name));
}
+ }
+
+ string get_sql_for_variable (string variable_name) throws SparqlError {
+ var binding = var_map.lookup (variable_name);
+
+ check_binding (binding, variable_name);
if (binding.is_uri) {
return "(SELECT Uri FROM \"rdfs:Resource\" WHERE ID = \"%s_u\")".printf (variable_name);
@@ -952,6 +956,38 @@ public class Tracker.SparqlQuery : Object {
expect (SparqlTokenType.CLOSE_PARENS);
}
+ void translate_str (StringBuilder sql) throws SparqlError {
+
+ expect (SparqlTokenType.STR);
+ expect (SparqlTokenType.OPEN_PARENS);
+
+ if (accept (SparqlTokenType.VAR)) {
+ string variable_name = get_last_string().substring(1);
+ var binding = var_map.lookup (variable_name);
+
+ check_binding (binding, variable_name);
+
+ if (binding.is_uri) {
+ sql.append_printf ("(SELECT \"rdfs:Resource\".\"Uri\" as \"STR\" FROM \"rdfs:Resource\" WHERE \"rdfs:Resource\".\"ID\" = \"%s_u\")",
+ variable_name);
+ } else {
+ sql.append (get_sql_for_variable (get_last_string ().substring (1)));
+ }
+ } else if (accept (SparqlTokenType.IRI_REF)) {
+ sql.append ("?");
+ var binding = new LiteralBinding ();
+ binding.literal = get_last_string (1);
+ bindings.append (binding);
+ } else {
+ sql.append ("?");
+ var binding = new LiteralBinding ();
+ binding.literal = parse_string_literal ();
+ bindings.append (binding);
+ }
+
+ expect (SparqlTokenType.CLOSE_PARENS);
+ }
+
string parse_string_literal () throws SparqlError {
next ();
switch (last ()) {
@@ -1000,7 +1036,7 @@ public class Tracker.SparqlQuery : Object {
case SparqlTokenType.STRING_LITERAL_LONG2:
return get_last_string (3);
default:
- assert_not_reached ();
+ throw new SparqlError.PARSE ("expected string literal \"%s\")", get_last_string ());
}
}
@@ -1089,6 +1125,8 @@ public class Tracker.SparqlQuery : Object {
sql.append_printf ("\"%s_u\"", variable_name);
break;
case SparqlTokenType.STR:
+ translate_str (sql);
+ break;
case SparqlTokenType.LANG:
case SparqlTokenType.LANGMATCHES:
case SparqlTokenType.DATATYPE:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]