[tracker/wip/carlosg/property-path-fixes: 2/4] libtracker-data: Honor '*' property path properly



commit 8b3a1d29729d65dcaa2cf616260c67eaaa40d161
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun May 17 15:36:29 2020 +0200

    libtracker-data: Honor '*' property path properly
    
    Iterations in this recursive property path fall short at the
    end, for example queries like:
    
    SELECT ?u {
      <file:///some/deep/path> (nfo:belongsToContainer/nie:isStoredAs)* ?u
    }
    
    would miss the topmost known element. Rely on a helper to do the
    iterative parth, and ensure "self" is returned in the outer query.

 src/libtracker-data/tracker-sparql.c | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 130a7072d..78b0f4499 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -799,18 +799,32 @@ _prepend_path_element (TrackerSparql      *sparql,
                                       path_elem->data.composite.child2->name);
                break;
        case TRACKER_PATH_OPERATOR_ZEROORMORE:
+               _append_string_printf (sparql,
+                                      "\"%s_helper\" (ID, value, graph, ID_type, value_type) AS "
+                                      "(SELECT ID, value, graph, ID_type, value_type "
+                                      "FROM \"%s\" "
+                                      "UNION "
+                                      "SELECT a.ID, b.value, b.graph, a.ID_type, b.value_type "
+                                      "FROM \"%s\" AS a, \"%s_helper\" AS b "
+                                      "WHERE a.value = b.ID), ",
+                                      path_elem->name,
+                                      path_elem->data.composite.child1->name,
+                                      path_elem->data.composite.child1->name,
+                                      path_elem->name);
                _append_string_printf (sparql,
                                       "\"%s\" (ID, value, graph, ID_type, value_type) AS "
-                                      "(SELECT ID, ID, graph, ID_type, ID_type "
+                                      "(SELECT ID, value, graph, ID_type, value_type "
+                                      "FROM \"%s_helper\" "
+                                      "UNION "
+                                      "SELECT ID, ID, graph, ID_type, ID_type "
                                       "FROM \"%s\" "
                                       "UNION "
-                                      "SELECT a.ID, b.value, b.graph, a.ID_type, b.value_type "
-                                      "FROM \"%s\" AS a, \"%s\" AS b "
-                                      "WHERE b.ID = a.value) ",
+                                      "SELECT value, value, graph, value_type, value_type "
+                                      "FROM \"%s\") ",
+                                      path_elem->name,
                                       path_elem->name,
                                       path_elem->data.composite.child1->name,
-                                      path_elem->data.composite.child1->name,
-                                      path_elem->name);
+                                      path_elem->data.composite.child1->name);
                break;
        case TRACKER_PATH_OPERATOR_ONEORMORE:
                _append_string_printf (sparql,


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