[tracker] SPARQL: Support graph retrieval using property functions
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker] SPARQL: Support graph retrieval using property functions
- Date: Thu, 23 Dec 2010 10:40:34 +0000 (UTC)
commit 3b47fb5c127de46b3c136d987219d4726f5dc33c
Author: Jürg Billeter <j bitron ch>
Date: Mon Dec 20 17:17:24 2010 +0100
SPARQL: Support graph retrieval using property functions
Property functions accept two extra optional arguments. The first
optional argument specifies the delimiter between multiple property
values. It is ignored for single-valued properties and it defaults to
comma.
If the second optional argument is present, the graph is returned in
addition to the property value. The graph is separated from the
property value by the delimiter specified in the argument.
src/libtracker-data/tracker-sparql-expression.vala | 42 ++++++++++++++++---
1 files changed, 35 insertions(+), 7 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-expression.vala b/src/libtracker-data/tracker-sparql-expression.vala
index f082d6e..49b49e5 100644
--- a/src/libtracker-data/tracker-sparql-expression.vala
+++ b/src/libtracker-data/tracker-sparql-expression.vala
@@ -668,22 +668,50 @@ class Tracker.Sparql.Expression : Object {
var expr = new StringBuilder ();
translate_expression (expr);
+ string value_separator = ",";
+ string? graph_separator = null;
+
+ if (accept (SparqlTokenType.COMMA)) {
+ value_separator = parse_string_literal ();
+
+ if (accept (SparqlTokenType.COMMA)) {
+ graph_separator = parse_string_literal ();
+ }
+ }
+
if (prop.multiple_values) {
+ // multi-valued property
sql.append ("(SELECT GROUP_CONCAT(");
long begin = sql.len;
sql.append_printf ("\"%s\"", prop.name);
convert_expression_to_string (sql, prop.data_type, begin);
- sql.append_printf (",',') FROM \"%s\" WHERE ID = %s)", prop.table_name, expr.str);
+ if (graph_separator != null) {
+ sql.append_printf (" || %s || COALESCE((SELECT Uri FROM Resource WHERE ID = \"%s:graph\"), '')", escape_sql_string_literal (graph_separator), prop.name);
+ }
+ sql.append_printf (",%s)", escape_sql_string_literal (value_separator));
+ sql.append_printf (" FROM \"%s\" WHERE ID = %s)", prop.table_name, expr.str);
return PropertyType.STRING;
} else {
- sql.append_printf ("(SELECT \"%s\" FROM \"%s\" WHERE ID = %s)", prop.name, prop.table_name, expr.str);
+ // single-valued property
+ if (graph_separator == null) {
+ sql.append_printf ("(SELECT \"%s\" FROM \"%s\" WHERE ID = %s)", prop.name, prop.table_name, expr.str);
- if (prop.data_type == PropertyType.STRING) {
- append_collate (sql);
- }
+ if (prop.data_type == PropertyType.STRING) {
+ append_collate (sql);
+ }
- return prop.data_type;
+ return prop.data_type;
+ } else {
+ sql.append ("(SELECT ");
+ long begin = sql.len;
+ sql.append_printf ("\"%s\"", prop.name);
+ convert_expression_to_string (sql, prop.data_type, begin);
+ sql.append_printf (" || %s || COALESCE((SELECT Uri FROM Resource WHERE ID = \"%s:graph\"), '')", escape_sql_string_literal (graph_separator), prop.name);
+ sql.append_printf (" FROM \"%s\" WHERE ID = %s)", prop.table_name, expr.str);
+
+ return PropertyType.STRING;
+ }
}
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]