[tracker/wip/carlosg/bindings-in-service: 2/6] libtracker-sparql: Refactor service graph pattern variable extraction
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/bindings-in-service: 2/6] libtracker-sparql: Refactor service graph pattern variable extraction
- Date: Mon, 4 May 2020 23:10:09 +0000 (UTC)
commit 3ffeefb4387a52e833cc1a54f974a16d2a457fff
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon May 4 01:26:27 2020 +0200
libtracker-sparql: Refactor service graph pattern variable extraction
Move it to a separate function.
src/libtracker-data/tracker-sparql.c | 54 +++++++++++++++++++++++++-----------
1 file changed, 38 insertions(+), 16 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 111306033..c16c3a19b 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -4588,15 +4588,47 @@ translate_GraphGraphPattern (TrackerSparql *sparql,
return TRUE;
}
+static GList *
+extract_variables (TrackerSparql *sparql,
+ TrackerParserNode *pattern)
+{
+ TrackerParserNode *node;
+ GList *variables = NULL;
+
+ for (node = tracker_sparql_parser_tree_find_first (pattern, TRUE);
+ node;
+ node = tracker_sparql_parser_tree_find_next (node, TRUE)) {
+ const TrackerGrammarRule *rule;
+
+ if (!g_node_is_ancestor ((GNode *) pattern, (GNode *) node))
+ break;
+
+ rule = tracker_parser_node_get_rule (node);
+
+ if (!tracker_grammar_rule_is_a (rule, RULE_TYPE_TERMINAL,
+ TERMINAL_TYPE_VAR1) &&
+ !tracker_grammar_rule_is_a (rule, RULE_TYPE_TERMINAL,
+ TERMINAL_TYPE_VAR2) &&
+ !tracker_grammar_rule_is_a (rule, RULE_TYPE_TERMINAL,
+ TERMINAL_TYPE_PARAMETERIZED_VAR))
+ continue;
+
+ variables = g_list_prepend (variables, node);
+ }
+
+ return variables;
+}
+
static gboolean
translate_ServiceGraphPattern (TrackerSparql *sparql,
GError **error)
{
gssize pattern_start, pattern_end;
- TrackerParserNode *pattern, *node;
+ TrackerParserNode *pattern;
gchar *pattern_str, *escaped_str, *var_str;
TrackerContext *context;
GList *variables = NULL;
+ GList *variable_rules = NULL, *l;
TrackerToken service;
GString *service_sparql;
gboolean silent = FALSE, do_join;
@@ -4626,24 +4658,13 @@ translate_ServiceGraphPattern (TrackerSparql *sparql,
_append_string (sparql, "SELECT ");
service_sparql = g_string_new ("SELECT ");
- for (node = tracker_sparql_parser_tree_find_first (pattern, TRUE);
- node;
- node = tracker_sparql_parser_tree_find_next (node, TRUE)) {
- const TrackerGrammarRule *rule;
+ variable_rules = extract_variables (sparql, pattern);
+
+ for (l = variable_rules; l; l = l->next) {
+ TrackerParserNode *node = l->data;
TrackerBinding *binding;
TrackerVariable *var;
- if (!g_node_is_ancestor ((GNode *) pattern, (GNode *) node))
- break;
-
- rule = tracker_parser_node_get_rule (node);
-
- if (!tracker_grammar_rule_is_a (rule, RULE_TYPE_TERMINAL,
- TERMINAL_TYPE_VAR1) &&
- !tracker_grammar_rule_is_a (rule, RULE_TYPE_TERMINAL,
- TERMINAL_TYPE_VAR2))
- continue;
-
if (i > 0)
_append_string (sparql, ", ");
@@ -4676,6 +4697,7 @@ translate_ServiceGraphPattern (TrackerSparql *sparql,
tracker_token_unset (&service);
tracker_sparql_pop_context (sparql, TRUE);
g_string_free (service_sparql, TRUE);
+ g_list_free (variable_rules);
if (do_join)
_append_string (sparql, ") ");
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]