[tracker/wip/carlosg/sparql-corners: 9/12] libtracker-data: Detect remote queries with no projected parameters




commit 9e023e3b052dcc51c974c365c763e19091c0a37b
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat Feb 27 12:48:32 2021 +0100

    libtracker-data: Detect remote queries with no projected parameters
    
    Querying a service that does not use any variable in its graph pattern
    is fairly pointless. There are no variables to project into the rest
    of the query, thus there's no way to match anything with the service
    graph pattern. In pure SPARQL, that is basically just:
    
      SELECT * { SERVICE <...> { } }
    
    But since in Tracker we are more lenient wrt giving each projected
    variable a name, we also have cases like:
    
      SELECT * { SERVICE <...> { SELECT 2 { } } }
    
    That are anyways pointless to execute. Detect all these cases and
    send an empty query string instead, the service vtable will behave
    as expected.

 src/libtracker-data/tracker-sparql.c | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index ce33a5ca2..10e04bfd1 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -5196,7 +5196,7 @@ translate_ServiceGraphPattern (TrackerSparql  *sparql,
        GList *variable_rules = NULL, *l;
        GList *join_vars = NULL;
        TrackerToken service;
-       GString *service_sparql;
+       GString *service_sparql = NULL;
        gboolean silent = FALSE, do_join;
        gint i = 0;
 
@@ -5241,7 +5241,6 @@ translate_ServiceGraphPattern (TrackerSparql  *sparql,
 
        pattern = _skip_rule (sparql, NAMED_RULE_GroupGraphPattern);
        _append_string (sparql, "SELECT ");
-       service_sparql = g_string_new ("SELECT ");
 
        variable_rules = extract_variables (sparql, pattern);
 
@@ -5269,6 +5268,9 @@ translate_ServiceGraphPattern (TrackerSparql  *sparql,
                if (i > 0)
                        _append_string (sparql, ", ");
 
+               if (!service_sparql)
+                       service_sparql = g_string_new ("SELECT ");
+
                /* Variable was used before in the graph pattern, preserve
                 * for later so we join on it properly.
                 */
@@ -5289,6 +5291,9 @@ translate_ServiceGraphPattern (TrackerSparql  *sparql,
                i++;
        }
 
+       if (variable_rules == NULL)
+               _append_string (sparql, "* ");
+
        if (tracker_token_get_variable (&service)) {
                if (variable_rules != NULL)
                        _append_string (sparql, ", ");
@@ -5298,16 +5303,18 @@ translate_ServiceGraphPattern (TrackerSparql  *sparql,
                join_vars = g_list_prepend (join_vars, tracker_token_get_variable (&service));
        }
 
-       tracker_parser_node_get_extents (pattern, &pattern_start, &pattern_end);
-       pattern_str = g_strndup (&sparql->sparql[pattern_start], pattern_end - pattern_start);
-       escaped_str = _escape_sql_string (pattern_str, '"');
-       g_string_append (service_sparql, escaped_str);
-       g_list_free (variables);
-       g_free (pattern_str);
-       g_free (escaped_str);
+       if (service_sparql) {
+               tracker_parser_node_get_extents (pattern, &pattern_start, &pattern_end);
+               pattern_str = g_strndup (&sparql->sparql[pattern_start], pattern_end - pattern_start);
+               escaped_str = _escape_sql_string (pattern_str, '"');
+               g_string_append (service_sparql, escaped_str);
+               g_list_free (variables);
+               g_free (pattern_str);
+               g_free (escaped_str);
+       }
 
        _append_string_printf (sparql, "FROM tracker_service WHERE query=\"%s\" AND silent=%d ",
-                              service_sparql->str,
+                              service_sparql ? service_sparql->str : "",
                               silent);
 
        if (!tracker_token_get_variable (&service)) {
@@ -5315,6 +5322,9 @@ translate_ServiceGraphPattern (TrackerSparql  *sparql,
                                       tracker_token_get_idstring (&service));
        }
 
+       if (service_sparql)
+               g_string_free (service_sparql, TRUE);
+
        i = 0;
 
        /* Proxy parameters to the virtual table */
@@ -5344,7 +5354,6 @@ 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) {


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