[tracker/wip/carlosg/sparql1.1: 135/145] libtracker-data: Create union views on demand
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/sparql1.1: 135/145] libtracker-data: Create union views on demand
- Date: Thu, 18 Jul 2019 22:35:23 +0000 (UTC)
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]