[tracker/wip/carlosg/sparql1.1: 31/56] sm use views instead of virtual table
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/sparql1.1: 31/56] sm use views instead of virtual table
- Date: Thu, 6 Jun 2019 11:18:46 +0000 (UTC)
commit 15c90dc6ad03c861bee79339f476b09a360b2319
Author: Carlos Garnacho <carlosg gnome org>
Date: Thu May 30 12:08:03 2019 +0200
sm use views instead of virtual table
src/libtracker-data/tracker-data-manager.c | 77 ++++++++++++++++++++++--------
1 file changed, 57 insertions(+), 20 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index 4b2174e66..e3cb317f4 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -3899,9 +3899,9 @@ tracker_data_manager_get_data_location (TrackerDataManager *manager)
}
static gboolean
-tracker_data_manager_update_union_tables (TrackerDataManager *manager,
- TrackerDBInterface *iface,
- GError **error)
+tracker_data_manager_update_union_views (TrackerDataManager *manager,
+ TrackerDBInterface *iface,
+ GError **error)
{
TrackerOntologies *ontologies = manager->ontologies;
TrackerClass **classes;
@@ -3909,26 +3909,51 @@ tracker_data_manager_update_union_tables (TrackerDataManager *manager,
TrackerDBStatement *stmt;
guint i, n_classes, n_properties;
GError *inner_error = NULL;
+ GHashTableIter iter;
+ GHashTable *graphs;
+ gpointer graph_name, graph_id;
+ GString *str;
classes = tracker_ontologies_get_classes (ontologies, &n_classes);
properties = tracker_ontologies_get_properties (ontologies, &n_properties);
+ graphs = tracker_data_manager_get_graphs (manager, iface, error);
+
+ if (!graphs)
+ return FALSE;
for (i = 0; !inner_error && i < n_classes; i++) {
+ GString *str;
+
if (g_str_has_prefix (tracker_class_get_name (classes[i]), "xsd:"))
continue;
stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE,
&inner_error,
- "DROP TABLE IF EXISTS temp.\"unionGraph_%s\"",
+ "DROP VIEW IF EXISTS temp.\"unionGraph_%s\"",
tracker_class_get_name (classes[i]));
if (!stmt)
break;
tracker_db_statement_execute (stmt, NULL);
g_object_unref (stmt);
+
+ str = g_string_new (NULL);
+ g_string_append_printf (str,
+ "CREATE VIEW temp.\"unionGraph_%s\" AS "
+ "SELECT 0 AS graph, * FROM \"main\".\"%s\" ",
+ tracker_class_get_name (classes[i]),
+ tracker_class_get_name (classes[i]));
+
+ g_hash_table_iter_init (&iter, graphs);
+ while (g_hash_table_iter_next (&iter, &graph_name, &graph_id)) {
+ g_string_append_printf (str, "UNION ALL SELECT %d AS graph, * FROM \"%s\".\"%s\" ",
+ GPOINTER_TO_INT (graph_id),
+ (gchar *) graph_name,
+ tracker_class_get_name (classes[i]));
+ }
+
stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE,
&inner_error,
- "CREATE VIRTUAL TABLE temp.\"unionGraph_%s\"
USING tracker_union (\"%s\")",
- tracker_class_get_name (classes[i]),
- tracker_class_get_name (classes[i]));
+ "%s", str->str);
+ g_string_free (str, TRUE);
if (!stmt)
break;
@@ -3944,7 +3969,7 @@ tracker_data_manager_update_union_tables (TrackerDataManager *manager,
service = tracker_property_get_domain (properties[i]);
stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE,
&inner_error,
- "DROP TABLE IF EXISTS
temp.\"unionGraph_%s_%s\"",
+ "DROP VIEW IF EXISTS temp.\"unionGraph_%s_%s\"",
tracker_class_get_name (service),
tracker_property_get_name (properties[i]));
if (!stmt)
@@ -3952,12 +3977,29 @@ tracker_data_manager_update_union_tables (TrackerDataManager *manager,
tracker_db_statement_execute (stmt, NULL);
g_object_unref (stmt);
+
+ str = g_string_new (NULL);
+ g_string_append_printf (str,
+ "CREATE VIEW temp.\"unionGraph_%s_%s\" AS "
+ "SELECT 0 AS graph, * FROM \"main\".\"%s_%s\" ",
+ tracker_class_get_name (service),
+ tracker_property_get_name (properties[i]),
+ tracker_class_get_name (service),
+ tracker_property_get_name (properties[i]));
+
+ g_hash_table_iter_init (&iter, graphs);
+ while (g_hash_table_iter_next (&iter, &graph_name, &graph_id)) {
+ g_string_append_printf (str, "UNION ALL SELECT %d AS graph, * FROM \"%s\".\"%s_%s\" ",
+ GPOINTER_TO_INT (graph_id),
+ (gchar *) graph_name,
+ tracker_class_get_name (service),
+ tracker_property_get_name (properties[i]));
+ }
+
stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE,
&inner_error,
- "CREATE VIRTUAL TABLE temp.\"unionGraph_%s_%s\"
USING tracker_union (\"%s_%s\")",
- tracker_class_get_name (service),
- tracker_property_get_name (properties[i]),
- tracker_class_get_name (service),
- tracker_property_get_name (properties[i]));
+ "%s", str->str);
+ g_string_free (str, TRUE);
+
if (!stmt)
break;
@@ -4040,8 +4082,8 @@ setup_interface_cb (TrackerDBManager *db_manager,
tracker_data_manager_init_fts (iface, FALSE);
#endif
- if (!tracker_data_manager_update_union_tables (data_manager, iface, &error)) {
- g_critical ("Could not update union tables: %s\n", error->message);
+ if (!tracker_data_manager_update_union_views (data_manager, iface, &error)) {
+ g_critical ("Could not update union views: %s\n", error->message);
g_error_free (error);
}
}
@@ -4685,11 +4727,6 @@ skip_ontology_check:
tracker_ontologies_sort (manager->ontologies);
}
- if (!tracker_data_manager_update_union_tables (manager, iface, &internal_error)) {
- g_propagate_error (error, internal_error);
- return FALSE;
- }
-
manager->initialized = TRUE;
/* This is the only one which doesn't show the 'OPERATION' part */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]