[tracker/wip/carlosg/sparql1.1: 181/201] libtracker-data: Update union views selectively
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/sparql1.1: 181/201] libtracker-data: Update union views selectively
- Date: Mon, 9 Sep 2019 22:34:02 +0000 (UTC)
commit 6510a14025856d2477f5c5dc74866fbb00570dbe
Author: Carlos Garnacho <carlosg gnome org>
Date: Sat Sep 7 13:13:40 2019 +0200
libtracker-data: Update union views selectively
Keep track of the union views required by a query, and update those
specifically (if the database generation bumped in between).
src/libtracker-data/tracker-data-manager.c | 9 +--------
src/libtracker-data/tracker-sparql.c | 24 ++++++++++++++++++++++++
2 files changed, 25 insertions(+), 8 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index 2c62c5cb6..70c7a2845 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -4362,15 +4362,8 @@ update_interface_cb (TrackerDBManager *db_manager,
/* This is where we bump the generation for the readonly case, in response to
* tables being attached or detached due to graph changes.
*/
- if (readonly && changed) {
+ if (readonly && changed)
data_manager->generation++;
- if (!tracker_data_manager_update_union_views (data_manager, iface,
- NULL, &error)) {
- g_critical ("Could not update union views: %s\n",
- error->message);
- g_error_free (error);
- }
- }
} else {
g_critical ("Could not update attached databases: %s\n",
error->message);
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 26e852969..4e507d99c 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);
@@ -577,6 +579,11 @@ _prepend_path_element (TrackerSparql *sparql,
table_name = g_strdup_printf ("\"unionGraph_%s\"",
tracker_property_get_table_name
(path_elem->data.property));
graph_column = g_strdup ("graph");
+
+ if (sparql->union_views) {
+ g_hash_table_add (sparql->union_views,
+ g_strdup (tracker_property_get_table_name
(path_elem->data.property)));
+ }
} else {
const gchar *graph;
@@ -688,6 +695,7 @@ _prepend_path_element (TrackerSparql *sparql,
}
_append_string (sparql, ") ");
+ g_clear_pointer (&sparql->union_views, g_hash_table_unref);
break;
case TRACKER_PATH_OPERATOR_INTERSECTION:
_append_string_printf (sparql,
@@ -1830,6 +1838,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);
if (table->graph) {
_append_graph_checks (sparql, "graph",
@@ -1882,6 +1891,9 @@ _end_triples_block (TrackerSparql *sparql,
}
_append_string (sparql, ") ");
+
+ if (sparql->union_views)
+ g_hash_table_add (sparql->union_views, g_strdup
(table->sql_db_tablename));
}
}
@@ -2509,6 +2521,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 {
@@ -6580,6 +6594,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),
@@ -8325,6 +8343,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);
@@ -8370,6 +8390,10 @@ prepare_query (TrackerSparql *sparql,
gchar *query;
guint i;
+ if (!tracker_data_manager_update_union_views (sparql->data_manager, iface,
+ sparql->union_views, error))
+ return NULL;
+
query = tracker_string_builder_to_string (str);
stmt = tracker_db_interface_create_statement (iface,
cached ?
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]