[tracker/wip/carlosg/update-perf: 18/72] libtracker-data: Shuffle FTS text deletion
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/update-perf: 18/72] libtracker-data: Shuffle FTS text deletion
- Date: Tue, 30 Aug 2022 15:39:40 +0000 (UTC)
commit 18cd2c470bcae9509d7d1b419dc1ba133d9f0e08
Author: Carlos Garnacho <carlosg gnome org>
Date: Tue Jan 18 14:03:42 2022 +0100
libtracker-data: Shuffle FTS text deletion
Move it to buffer_flush(), so it's paired together with FTS updates.
This also makes get_old_property_values() not have side effects wrt
FTS.
src/libtracker-sparql/core/tracker-data-update.c | 97 ++++++++++------------
.../core/tracker-db-interface-sqlite.c | 15 ++--
2 files changed, 54 insertions(+), 58 deletions(-)
---
diff --git a/src/libtracker-sparql/core/tracker-data-update.c
b/src/libtracker-sparql/core/tracker-data-update.c
index 47bff7cae..b5f6c660f 100644
--- a/src/libtracker-sparql/core/tracker-data-update.c
+++ b/src/libtracker-sparql/core/tracker-data-update.c
@@ -842,6 +842,34 @@ tracker_data_resource_buffer_flush (TrackerData *data,
iface = tracker_data_manager_get_writable_db_interface (data->manager);
database = resource->graph->graph ? resource->graph->graph : "main";
+ if (resource->fts_updated && !resource->create) {
+ TrackerProperty *prop;
+ GArray *values;
+ GPtrArray *properties;
+
+ properties = NULL;
+ g_hash_table_iter_init (&iter, resource->predicates);
+
+ while (g_hash_table_iter_next (&iter, (gpointer*) &prop, (gpointer*) &values)) {
+ if (tracker_property_get_fulltext_indexed (prop)) {
+ if (!properties)
+ properties = g_ptr_array_new ();
+
+ g_ptr_array_add (properties, (gpointer) tracker_property_get_name (prop));
+ }
+ }
+
+ if (properties) {
+ g_ptr_array_add (properties, NULL);
+
+ tracker_db_interface_sqlite_fts_delete_text (iface,
+ database,
+ resource->id,
+ (const gchar **) properties->pdata);
+ g_ptr_array_free (properties, TRUE);
+ }
+ }
+
g_hash_table_iter_init (&iter, resource->tables);
while (g_hash_table_iter_next (&iter, (gpointer*) &table_name, (gpointer*) &table)) {
if (table->multiple_values) {
@@ -1608,10 +1636,6 @@ get_old_property_values (TrackerData *data,
GError **error)
{
GArray *old_values;
- const gchar *database;
-
- database = data->resource_buffer->graph->graph ?
- data->resource_buffer->graph->graph : "main";
/* read existing property values */
old_values = g_hash_table_lookup (data->resource_buffer->predicates, property);
@@ -1643,55 +1667,9 @@ get_old_property_values (TrackerData *data,
}
}
- if (tracker_property_get_fulltext_indexed (property)) {
- TrackerDBInterface *iface;
-
- iface = tracker_data_manager_get_writable_db_interface (data->manager);
-
- if (!data->resource_buffer->fts_updated && !data->resource_buffer->create) {
- TrackerOntologies *ontologies;
- guint i, n_props;
- TrackerProperty **properties, *prop;
- GPtrArray *fts_props;
-
- /* first fulltext indexed property to be modified
- * retrieve values of all fulltext indexed properties
- */
- ontologies = tracker_data_manager_get_ontologies (data->manager);
- properties = tracker_ontologies_get_properties (ontologies, &n_props);
-
- fts_props = g_ptr_array_new ();
-
- for (i = 0; i < n_props; i++) {
- prop = properties[i];
-
- if (tracker_property_get_fulltext_indexed (prop)
- && check_property_domain (data, prop)) {
- const gchar *property_name;
-
- property_name = tracker_property_get_name (prop);
- g_ptr_array_add (fts_props, (gpointer) property_name);
- }
- }
-
- g_ptr_array_add (fts_props, NULL);
-
- tracker_db_interface_sqlite_fts_delete_text (iface,
- database,
- data->resource_buffer->id,
- (const gchar **)
fts_props->pdata);
-
- g_ptr_array_unref (fts_props);
-
- old_values = get_property_values (data, property, error);
- data->resource_buffer->fts_updated = TRUE;
- } else {
- old_values = get_property_values (data, property, error);
- }
-
- } else {
- old_values = get_property_values (data, property, error);
- }
+ data->resource_buffer->fts_updated |=
+ tracker_property_get_fulltext_indexed (property);
+ old_values = get_property_values (data, property, error);
}
return old_values;
@@ -1947,6 +1925,9 @@ delete_metadata_decomposed (TrackerData *data,
table_name = tracker_property_get_table_name (property);
field_name = tracker_property_get_name (property);
+ data->resource_buffer->fts_updated |=
+ tracker_property_get_fulltext_indexed (property);
+
/* read existing property values */
old_values = get_old_property_values (data, property, &new_error);
if (new_error) {
@@ -2117,7 +2098,11 @@ cache_delete_resource_type_full (TrackerData *data,
table_name = tracker_property_get_table_name (prop);
field_name = tracker_property_get_name (prop);
+ data->resource_buffer->fts_updated |=
+ tracker_property_get_fulltext_indexed (prop);
+
old_values = get_old_property_values (data, prop, error);
+
if (!old_values)
return FALSE;
@@ -2674,6 +2659,9 @@ tracker_data_update_statement (TrackerData *data,
if (!resource_buffer_switch (data, graph, subject, error))
return;
+ data->resource_buffer->fts_updated |=
+ tracker_property_get_fulltext_indexed (predicate);
+
cache_delete_all_values (data,
tracker_property_get_table_name (predicate),
tracker_property_get_name (predicate));
@@ -2685,6 +2673,9 @@ tracker_data_update_statement (TrackerData *data,
if (!resource_buffer_switch (data, graph, subject, error))
return;
+ data->resource_buffer->fts_updated |=
+ tracker_property_get_fulltext_indexed (predicate);
+
if (!delete_single_valued (data, graph, subject, predicate,
!tracker_property_get_multiple_values (predicate),
error))
diff --git a/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
b/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
index 570e9afff..54163d615 100644
--- a/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
+++ b/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
@@ -2418,15 +2418,20 @@ tracker_db_interface_sqlite_fts_create_delete_query (TrackerDBInterface *db_int
props_str = g_string_new (NULL);
- for (i = 0; properties[i] != NULL; i++)
- g_string_append_printf (props_str, ",\"%s\"", properties[i]);
+ for (i = 0; properties[i] != NULL; i++) {
+ if (i != 0)
+ g_string_append_c (props_str, ',');
- query = g_strdup_printf ("INSERT INTO \"%s\".fts5 (fts5, ROWID %s) "
- "SELECT 'delete', ROWID %s FROM \"%s\".fts_view WHERE ROWID = ?",
+ g_string_append_printf (props_str, "\"%s\"", properties[i]);
+ }
+
+ query = g_strdup_printf ("INSERT INTO \"%s\".fts5 (fts5, ROWID, %s) "
+ "SELECT 'delete', ROWID, %s FROM \"%s\".fts_view WHERE ROWID = ? AND
COALESCE(%s, NULL) IS NOT NULL",
database,
props_str->str,
props_str->str,
- database);
+ database,
+ props_str->str);
g_string_free (props_str, TRUE);
return query;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]