[tracker] SPARQL: Support function calls as select expressions
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker] SPARQL: Support function calls as select expressions
- Date: Thu, 8 Oct 2009 13:34:50 +0000 (UTC)
commit 15eb2860c9629527edd5a5288bde7c525d6c539e
Author: Jürg Billeter <j bitron ch>
Date: Thu Oct 8 12:24:46 2009 +0200
SPARQL: Support function calls as select expressions
src/libtracker-data/tracker-sparql-query.vala | 69 +++++++++++++++----------
1 files changed, 42 insertions(+), 27 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-query.vala b/src/libtracker-data/tracker-sparql-query.vala
index 122f00b..105ce35 100644
--- a/src/libtracker-data/tracker-sparql-query.vala
+++ b/src/libtracker-data/tracker-sparql-query.vala
@@ -1047,45 +1047,60 @@ public class Tracker.SparqlQuery : Object {
expect (SparqlTokenType.CLOSE_PARENS);
}
+ void convert_expression_to_string (StringBuilder sql, PropertyType type, long begin) {
+ switch (type) {
+ case PropertyType.STRING:
+ // nothing to convert
+ break;
+ case PropertyType.RESOURCE:
+ // ID => Uri
+ sql.insert (begin, "(SELECT Uri FROM \"rdfs:Resource\" WHERE ID = ");
+ sql.append (")");
+ break;
+ case PropertyType.BOOLEAN:
+ // 0/1 => false/true
+ sql.insert (begin, "CASE ");
+ sql.append (" WHEN 1 THEN 'true' WHEN 0 THEN 'false' ELSE NULL END");
+ break;
+ case PropertyType.DATETIME:
+ // ISO 8601 format
+ sql.insert (begin, "strftime (\"%Y-%m-%dT%H:%M:%SZ\", ");
+ sql.append (", \"unixepoch\")");
+ break;
+ default:
+ // let sqlite convert the expression to string
+ sql.insert (begin, "CAST (");
+ sql.append (" AS TEXT)");
+ break;
+ }
+ }
+
void translate_expression_as_string (StringBuilder sql) throws SparqlError {
switch (current ()) {
case SparqlTokenType.IRI_REF:
case SparqlTokenType.PN_PREFIX:
case SparqlTokenType.COLON:
// handle IRI literals separately as it wouldn't work for unknown IRIs otherwise
- sql.append ("?");
var binding = new LiteralBinding ();
bool is_var;
binding.literal = parse_var_or_term (null, out is_var);
- bindings.append (binding);
+ if (accept (SparqlTokenType.OPEN_PARENS)) {
+ // function call
+ long begin = sql.len;
+ var type = translate_function (sql, binding.literal);
+ expect (SparqlTokenType.CLOSE_PARENS);
+ expect (SparqlTokenType.AS);
+ expect (SparqlTokenType.PN_PREFIX);
+ convert_expression_to_string (sql, type, begin);
+ } else {
+ sql.append ("?");
+ bindings.append (binding);
+ }
break;
default:
long begin = sql.len;
- switch (translate_expression (sql)) {
- case PropertyType.STRING:
- // nothing to convert
- break;
- case PropertyType.RESOURCE:
- // ID => Uri
- sql.insert (begin, "(SELECT Uri FROM \"rdfs:Resource\" WHERE ID = ");
- sql.append (")");
- break;
- case PropertyType.BOOLEAN:
- // 0/1 => false/true
- sql.insert (begin, "CASE ");
- sql.append (" WHEN 1 THEN 'true' WHEN 0 THEN 'false' ELSE NULL END");
- break;
- case PropertyType.DATETIME:
- // ISO 8601 format
- sql.insert (begin, "strftime (\"%Y-%m-%dT%H:%M:%SZ\", ");
- sql.append (", \"unixepoch\")");
- break;
- default:
- // let sqlite convert the expression to string
- sql.insert (begin, "CAST (");
- sql.append (" AS TEXT)");
- break;
- }
+ var type = translate_expression (sql);
+ convert_expression_to_string (sql, type, begin);
break;
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]