[tracker/wip/carlosg/sparql1.1: 135/145] libtracker-data: Create union views on demand



commit 31c8e0b93c2d7e6f53e916e2409f88ed0bb039f8
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun Jul 14 23:59:16 2019 +0200

    libtracker-data: Create union views on demand
    
    Keep track of the union views needed for a query, so they can be
    updated before query execution.

 src/libtracker-data/tracker-sparql.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 1e6745567..55230c670 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -132,6 +132,7 @@ struct _TrackerSparql
        gboolean cacheable;
 
        GHashTable *parameters;
+       GHashTable *union_views;
 
        GPtrArray *anon_graphs;
        GPtrArray *named_graphs;
@@ -179,6 +180,7 @@ tracker_sparql_finalize (GObject *object)
        g_hash_table_destroy (sparql->prefix_map);
        g_hash_table_destroy (sparql->parameters);
        g_hash_table_destroy (sparql->cached_bindings);
+       g_clear_pointer (&sparql->union_views, g_hash_table_unref);
 
        if (sparql->sql)
                tracker_string_builder_free (sparql->sql);
@@ -575,6 +577,10 @@ _prepend_path_element (TrackerSparql      *sparql,
                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));
+                       if (sparql->union_views) {
+                               g_hash_table_add (sparql->union_views,
+                                                 g_strdup (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),
@@ -670,6 +676,7 @@ _prepend_path_element (TrackerSparql      *sparql,
                                       path_elem->name,
                                       TRACKER_PROPERTY_TYPE_RESOURCE,
                                       tracker_property_get_id (path_elem->data.property));
+               g_clear_pointer (&sparql->union_views, g_hash_table_unref);
                break;
        case TRACKER_PATH_OPERATOR_INTERSECTION:
                _append_string_printf (sparql,
@@ -1769,6 +1776,7 @@ _end_triples_block (TrackerSparql  *sparql,
                        _append_string (sparql,
                                        "(SELECT subject AS ID, predicate, "
                                        "object, object_type, graph FROM tracker_triples) ");
+                       g_clear_pointer (&sparql->union_views, g_hash_table_unref);
                } else if (table->predicate_path) {
                        _append_string_printf (sparql, "\"%s\"", table->sql_db_tablename);
                } else {
@@ -1788,6 +1796,9 @@ _end_triples_block (TrackerSparql  *sparql,
                                        _append_string_printf (sparql, "\"unionGraph_%s\" ",
                                                               table->sql_db_tablename);
                                }
+
+                               if (sparql->union_views)
+                                       g_hash_table_add (sparql->union_views, g_strdup 
(table->sql_db_tablename));
                        }
                }
 
@@ -2400,6 +2411,8 @@ translate_DescribeQuery (TrackerSparql  *sparql,
                        "FROM tracker_triples "
                        "WHERE object IS NOT NULL AND subject IN (");
 
+       g_clear_pointer (&sparql->union_views, g_hash_table_unref);
+
        if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_GLOB)) {
                glob = TRUE;
        } else {
@@ -6272,6 +6285,10 @@ handle_property_function (TrackerSparql    *sparql,
        if (tracker_token_is_empty (&sparql->current_state.graph)) {
                _append_string_printf (sparql, "FROM \"unionGraph_%s\" ",
                                       tracker_property_get_table_name (property));
+               if (sparql->union_views) {
+                       g_hash_table_add (sparql->union_views,
+                                         g_strdup (tracker_property_get_table_name (property)));
+               }
        } else {
                _append_string_printf (sparql, "FROM \"%s\".\"%s\" ",
                                       tracker_token_get_idstring (&sparql->current_state.graph),
@@ -8017,6 +8034,8 @@ tracker_sparql_init (TrackerSparql *sparql)
                                                         g_free, g_object_unref);
        sparql->parameters = g_hash_table_new_full (g_str_hash, g_str_equal,
                                                    g_free, g_object_unref);
+       sparql->union_views = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                                    g_free, NULL);
        sparql->var_names = g_ptr_array_new_with_free_func (g_free);
        sparql->var_types = g_array_new (FALSE, FALSE, sizeof (TrackerPropertyType));
        sparql->anon_graphs = g_ptr_array_new_with_free_func (g_free);
@@ -8062,7 +8081,8 @@ prepare_query (TrackerSparql         *sparql,
        gchar *query;
        guint i;
 
-       if (!tracker_data_manager_update_union_views (sparql->data_manager, iface, NULL, error))
+       if (!tracker_data_manager_update_union_views (sparql->data_manager, iface,
+                                                     sparql->union_views, error))
                return NULL;
 
        query = tracker_string_builder_to_string (str);


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