[tracker/wip/carlosg/bindings-in-service: 4/6] libtracker-data: Proxy parameters to the "services" virtual table
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/bindings-in-service: 4/6] libtracker-data: Proxy parameters to the "services" virtual table
- Date: Mon, 4 May 2020 23:10:19 +0000 (UTC)
commit 8e168916d81dc0bdf68848390bde45df9639e429
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon May 4 19:28:38 2020 +0200
libtracker-data: Proxy parameters to the "services" virtual table
Look up the parameters used within the service graph pattern, and
ensure those are proxied to the tracker_services virtual table via
their valuename/value column pairs.
This pieces everything together in supporting ~var bindings within
SERVICE{} clauses.
Fixes: https://gitlab.gnome.org/GNOME/tracker/-/issues/200
src/libtracker-data/tracker-sparql.c | 35 ++++++++++++++++++++++++++++++++++-
1 file changed, 34 insertions(+), 1 deletion(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index c16c3a19b..08d2e6524 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -4662,9 +4662,16 @@ translate_ServiceGraphPattern (TrackerSparql *sparql,
for (l = variable_rules; l; l = l->next) {
TrackerParserNode *node = l->data;
+ const TrackerGrammarRule *rule;
TrackerBinding *binding;
TrackerVariable *var;
+ rule = tracker_parser_node_get_rule (node);
+
+ if (tracker_grammar_rule_is_a (rule, RULE_TYPE_TERMINAL,
+ TERMINAL_TYPE_PARAMETERIZED_VAR))
+ continue;
+
if (i > 0)
_append_string (sparql, ", ");
@@ -4674,7 +4681,6 @@ translate_ServiceGraphPattern (TrackerSparql *sparql,
binding = tracker_variable_binding_new (var, NULL, NULL);
_add_binding (sparql, binding);
-
_append_string_printf (sparql, "col%d AS %s ",
i, tracker_variable_get_sql_expression (var));
g_string_append_printf (service_sparql, "?%s ", var_str);
@@ -4694,6 +4700,33 @@ translate_ServiceGraphPattern (TrackerSparql *sparql,
service_sparql->str,
silent);
+ i = 0;
+
+ /* Proxy parameters to the virtual table */
+ for (l = variable_rules; l; l = l->next) {
+ TrackerParserNode *node = l->data;
+ const TrackerGrammarRule *rule;
+ TrackerBinding *binding;
+ gchar *name;
+
+ rule = tracker_parser_node_get_rule (node);
+
+ if (!tracker_grammar_rule_is_a (rule, RULE_TYPE_TERMINAL,
+ TERMINAL_TYPE_PARAMETERIZED_VAR))
+ continue;
+
+ name = _extract_node_string (node, sparql);
+ binding = tracker_parameter_binding_new (name, NULL);
+ _add_binding (sparql, binding);
+
+ _append_string_printf (sparql,
+ "AND valuename%d = \"%s\" AND value%d = ",
+ i, name, i);
+ _append_literal_sql (sparql, TRACKER_LITERAL_BINDING (binding));
+ g_free (name);
+ i++;
+ }
+
tracker_token_unset (&service);
tracker_sparql_pop_context (sparql, TRUE);
g_string_free (service_sparql, TRUE);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]