[tracker/wip/carlosg/sparql1.1: 63/80] libtracker-data: Use substring after SelectClause



commit 763c1b8f79a89e8baa7f98b77f1da6ba25e10f58
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Jun 19 00:57:59 2019 +0200

    libtracker-data: Use substring after SelectClause
    
    And ensure SolutionModifier is part of it. We still may project variables
    from the GROUP BY into the select clause, so we must ensure we can still
    propagate the variables up.

 src/libtracker-data/tracker-sparql.c | 33 ++++++++++++++++++++++++---------
 1 file changed, 24 insertions(+), 9 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index ec00ea67d..f0911329e 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -2057,13 +2057,15 @@ translate_SelectQuery (TrackerSparql  *sparql,
                        GError        **error)
 {
        TrackerParserNode *select_clause;
-       TrackerStringBuilder *str;
+       TrackerStringBuilder *select, *str, *old;
 
        /* SelectQuery ::= SelectClause DatasetClause* WhereClause SolutionModifier
         */
 
        /* Skip select clause here */
+       select = _append_placeholder (sparql);
        str = _append_placeholder (sparql);
+       old = tracker_sparql_swap_builder (sparql, str);
        select_clause = _skip_rule (sparql, NAMED_RULE_SelectClause);
 
        while (_check_in_rule (sparql, NAMED_RULE_DatasetClause)) {
@@ -2075,14 +2077,16 @@ translate_SelectQuery (TrackerSparql  *sparql,
        if (!_check_undefined_variables (sparql, TRACKER_SELECT_CONTEXT (sparql->context), error))
                return FALSE;
 
+       _call_rule (sparql, NAMED_RULE_SolutionModifier, error);
+
+       tracker_sparql_swap_builder (sparql, old);
+
        /* Now that we have all variable/binding information available,
         * process the select clause.
         */
-       if (!_postprocess_rule (sparql, select_clause, str, error))
+       if (!_postprocess_rule (sparql, select_clause, select, error))
                return FALSE;
 
-       _call_rule (sparql, NAMED_RULE_SolutionModifier, error);
-
        return TRUE;
 }
 
@@ -2091,7 +2095,7 @@ translate_SubSelect (TrackerSparql  *sparql,
                      GError        **error)
 {
        TrackerContext *context, *prev;
-       TrackerStringBuilder *str;
+       TrackerStringBuilder *select, *str, *old;
        TrackerParserNode *select_clause;
 
        /* SubSelect ::= SelectClause WhereClause SolutionModifier ValuesClause
@@ -2102,20 +2106,25 @@ translate_SubSelect (TrackerSparql  *sparql,
        tracker_sparql_push_context (sparql, context);
 
        /* Skip select clause here */
+       select = _append_placeholder (sparql);
        str = _append_placeholder (sparql);
+       old = tracker_sparql_swap_builder (sparql, str);
+
        select_clause = _skip_rule (sparql, NAMED_RULE_SelectClause);
 
        _call_rule (sparql, NAMED_RULE_WhereClause, error);
 
+       _call_rule (sparql, NAMED_RULE_SolutionModifier, error);
+       _call_rule (sparql, NAMED_RULE_ValuesClause, error);
+
+       tracker_sparql_swap_builder (sparql, old);
+
        /* Now that we have all variable/binding information available,
         * process the select clause.
         */
-       if (!_postprocess_rule (sparql, select_clause, str, error))
+       if (!_postprocess_rule (sparql, select_clause, select, error))
                return FALSE;
 
-       _call_rule (sparql, NAMED_RULE_SolutionModifier, error);
-       _call_rule (sparql, NAMED_RULE_ValuesClause, error);
-
        sparql->current_state.expression_type = TRACKER_SELECT_CONTEXT (context)->type;
        tracker_sparql_pop_context (sparql, FALSE);
        sparql->current_state.select_context = prev;
@@ -2258,6 +2267,8 @@ static gboolean
 translate_AskQuery (TrackerSparql  *sparql,
                     GError        **error)
 {
+       TrackerStringBuilder *str, *old;
+
        /* AskQuery ::= 'ASK' DatasetClause* WhereClause SolutionModifier
         */
        _expect (sparql, RULE_TYPE_LITERAL, LITERAL_ASK);
@@ -2268,9 +2279,13 @@ translate_AskQuery (TrackerSparql  *sparql,
                _call_rule (sparql, NAMED_RULE_DatasetClause, error);
        }
 
+       str = _append_placeholder (sparql);
+       old = tracker_sparql_swap_builder (sparql, str);
        _call_rule (sparql, NAMED_RULE_WhereClause, error);
        _call_rule (sparql, NAMED_RULE_SolutionModifier, error);
 
+       tracker_sparql_swap_builder (sparql, old);
+
        _append_string (sparql, ") WHEN 1 THEN 'true' WHEN 0 THEN 'false' ELSE NULL END");
 
        return TRUE;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]