[tracker/wip/carlosg/sparql1.1: 66/80] libtracker-data: Handle predicate paths properly both in and out of graph{}



commit a16e4d90ddfe15138f25efb0bc89cc0b601deaca
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Jul 2 15:01:27 2019 +0200

    libtracker-data: Handle predicate paths properly both in and out of graph{}
    
    We need to check the unionGraph* views in the graphless case, or the specific
    database in the "graph {}" one.

 src/libtracker-data/tracker-sparql-types.c |  7 +++++++
 src/libtracker-data/tracker-sparql-types.h |  3 +++
 src/libtracker-data/tracker-sparql.c       | 18 ++++++++++++++++--
 3 files changed, 26 insertions(+), 2 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql-types.c b/src/libtracker-data/tracker-sparql-types.c
index d1b92a980..254523238 100644
--- a/src/libtracker-data/tracker-sparql-types.c
+++ b/src/libtracker-data/tracker-sparql-types.c
@@ -62,6 +62,13 @@ tracker_data_table_set_predicate_variable (TrackerDataTable *table,
        table->predicate_variable = is_variable;
 }
 
+void
+tracker_data_table_set_predicate_path (TrackerDataTable *table,
+                                       gboolean          is_path)
+{
+       table->predicate_path = is_path;
+}
+
 static TrackerVariable *
 tracker_variable_new (const gchar *sql_prefix,
                      const gchar *name)
diff --git a/src/libtracker-data/tracker-sparql-types.h b/src/libtracker-data/tracker-sparql-types.h
index c68f5f722..2580f6cdd 100644
--- a/src/libtracker-data/tracker-sparql-types.h
+++ b/src/libtracker-data/tracker-sparql-types.h
@@ -77,6 +77,7 @@ struct _TrackerDataTable {
        gchar *sql_db_tablename; /* as in db schema */
        gchar *sql_query_tablename; /* temp. name, generated */
        gboolean predicate_variable;
+       gboolean predicate_path;
 };
 
 struct _TrackerBinding {
@@ -239,6 +240,8 @@ struct _TrackerTripleContextClass {
 /* Data table */
 void tracker_data_table_set_predicate_variable (TrackerDataTable *table,
                                                 gboolean          is_variable);
+void tracker_data_table_set_predicate_path     (TrackerDataTable *table,
+                                                gboolean          is_path);
 
 /* Binding */
 GType              tracker_binding_get_type (void) G_GNUC_CONST;
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index b566ae0b5..24d00f4f1 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -555,6 +555,7 @@ _prepend_path_element (TrackerSparql      *sparql,
                        TrackerPathElement *path_elem)
 {
        TrackerStringBuilder *old;
+       gchar *table_name;
 
        old = tracker_sparql_swap_builder (sparql, sparql->current_state.with_clauses);
 
@@ -566,13 +567,23 @@ _prepend_path_element (TrackerSparql      *sparql,
        switch (path_elem->op) {
        case TRACKER_PATH_OPERATOR_NONE:
                /* A simple property */
+               if (tracker_token_is_empty (&sparql->current_state.graph)) {
+                       table_name = g_strdup_printf ("\"unionGraph_%s\"",
+                                                     tracker_property_get_table_name 
(path_elem->data.property));
+               } else {
+                       table_name = g_strdup_printf ("\"%s\".\"%s\"",
+                                                     tracker_token_get_idstring 
(&sparql->current_state.graph),
+                                                     tracker_property_get_table_name 
(path_elem->data.property));
+               }
+
                _append_string_printf (sparql,
                                       "\"%s\" (ID, value, graph) AS "
-                                      "(SELECT ID, \"%s\", \"%s:graph\" FROM \"%s\") ",
+                                      "(SELECT ID, \"%s\", \"%s:graph\" FROM %s) ",
                                       path_elem->name,
                                       tracker_property_get_name (path_elem->data.property),
                                       tracker_property_get_name (path_elem->data.property),
-                                      tracker_property_get_table_name (path_elem->data.property));
+                                      table_name);
+               g_free (table_name);
                break;
        case TRACKER_PATH_OPERATOR_INVERSE:
                _append_string_printf (sparql,
@@ -1214,6 +1225,7 @@ _add_quad (TrackerSparql  *sparql,
                table = tracker_triple_context_add_table (triple_context,
                                                          graph_db,
                                                          tracker_token_get_idstring (predicate));
+               tracker_data_table_set_predicate_path (table, TRUE);
                new_table = TRUE;
        } else {
                /* The parser disallows parameter predicates */
@@ -1604,6 +1616,8 @@ _end_triples_block (TrackerSparql  *sparql,
                        _append_string (sparql,
                                        "(SELECT subject AS ID, predicate, "
                                        "object, graph FROM tracker_triples) ");
+               } else if (table->predicate_path) {
+                       _append_string_printf (sparql, "\"%s\"", table->sql_db_tablename);
                } else {
                        if (table->graph) {
                                _append_string_printf (sparql, "\"%s\".\"%s\"",


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