summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-08-20 18:46:16 +0200
committerCarlos Garnacho <carlosg@gnome.org>2022-08-30 17:38:57 +0200
commit4f4e4a4dac60df32cf9019d354149515cae65235 (patch)
tree3352b14efe2981a30a478465364bab7e9df27b17
parent795904332eecc79129ba7fdc8a76fdc0fae03b34 (diff)
downloadtracker-4f4e4a4dac60df32cf9019d354149515cae65235.tar.gz
core: Decouple FTS updates from previous property value lookups
Right now, FTS updates do iterate the set of previously looked up properties in order to find the FTS ones and issue the FTS update. We want to optimize on fetching the old values for properties, and FTS is orthogonal to it, so decouple both machineries. As a replacement keep a list of FTS properties that were modified, so that these are updated when flushing.
-rw-r--r--src/libtracker-sparql/core/tracker-data-update.c115
1 files changed, 51 insertions, 64 deletions
diff --git a/src/libtracker-sparql/core/tracker-data-update.c b/src/libtracker-sparql/core/tracker-data-update.c
index c5a1599b3..36eb427bc 100644
--- a/src/libtracker-sparql/core/tracker-data-update.c
+++ b/src/libtracker-sparql/core/tracker-data-update.c
@@ -134,7 +134,7 @@ struct _TrackerDataUpdateBufferResource {
/* TrackerClass */
GPtrArray *types;
- gboolean fts_updated;
+ GList *fts_properties;
};
struct _TrackerStatementDelegate {
@@ -1407,6 +1407,7 @@ static void resource_buffer_free (TrackerDataUpdateBufferResource *resource)
{
g_clear_pointer (&resource->predicates, g_hash_table_unref);
+ g_list_free (resource->fts_properties);
g_ptr_array_free (resource->types, TRUE);
resource->types = NULL;
@@ -1423,6 +1424,7 @@ tracker_data_update_buffer_flush (TrackerData *data,
GHashTableIter iter;
GError *actual_error = NULL;
const gchar *database;
+ GList *l;
guint i;
if (data->update_buffer.update_log->len == 0)
@@ -1435,38 +1437,27 @@ tracker_data_update_buffer_flush (TrackerData *data,
g_hash_table_iter_init (&iter, graph->resources);
while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &resource)) {
- if (resource->fts_updated && !resource->create) {
- TrackerProperty *prop;
- GArray *values;
- GHashTableIter prop_iter;
+ if (resource->fts_properties && !resource->create) {
GPtrArray *properties;
gboolean retval;
- properties = NULL;
+ properties = g_ptr_array_sized_new (8);
database = resource->graph->graph ? resource->graph->graph : "main";
- g_hash_table_iter_init (&prop_iter, resource->predicates);
- while (g_hash_table_iter_next (&prop_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);
+ for (l = resource->fts_properties; l; l = l->next)
+ g_ptr_array_add (properties, (gpointer) tracker_property_get_name (l->data));
- retval = tracker_db_interface_sqlite_fts_delete_text (iface,
- database,
- resource->id,
- (const gchar **) properties->pdata,
- error);
- g_ptr_array_free (properties, TRUE);
+ g_ptr_array_add (properties, NULL);
- if (!retval)
- goto out;
- }
+ retval = tracker_db_interface_sqlite_fts_delete_text (iface,
+ database,
+ resource->id,
+ (const gchar **) properties->pdata,
+ error);
+ g_ptr_array_free (properties, TRUE);
+
+ if (!retval)
+ goto out;
}
}
}
@@ -1479,38 +1470,27 @@ tracker_data_update_buffer_flush (TrackerData *data,
g_hash_table_iter_init (&iter, graph->resources);
while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &resource)) {
- if (resource->fts_updated) {
- TrackerProperty *prop;
- GArray *values;
- GHashTableIter prop_iter;
+ if (resource->fts_properties) {
GPtrArray *properties;
gboolean retval;
- properties = NULL;
+ properties = g_ptr_array_sized_new (8);
database = resource->graph->graph ? resource->graph->graph : "main";
- g_hash_table_iter_init (&prop_iter, resource->predicates);
- while (g_hash_table_iter_next (&prop_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);
+ for (l = resource->fts_properties; l; l = l->next)
+ g_ptr_array_add (properties, (gpointer) tracker_property_get_name (l->data));
- retval = tracker_db_interface_sqlite_fts_update_text (iface,
- database,
- resource->id,
- (const gchar **) properties->pdata,
- error);
- g_ptr_array_free (properties, TRUE);
+ g_ptr_array_add (properties, NULL);
- if (!retval)
- goto out;
- }
+ retval = tracker_db_interface_sqlite_fts_update_text (iface,
+ database,
+ resource->id,
+ (const gchar **) properties->pdata,
+ error);
+ g_ptr_array_free (properties, TRUE);
+
+ if (!retval)
+ goto out;
}
}
@@ -1979,6 +1959,20 @@ maybe_convert_value (TrackerData *data,
return FALSE;
}
+static void
+maybe_append_fts_property (TrackerData *data,
+ TrackerProperty *property)
+{
+ if (!tracker_property_get_fulltext_indexed (property))
+ return;
+
+ if (g_list_find (data->resource_buffer->fts_properties, property))
+ return;
+
+ data->resource_buffer->fts_properties =
+ g_list_prepend (data->resource_buffer->fts_properties, property);
+}
+
static gboolean
cache_insert_metadata_decomposed (TrackerData *data,
TrackerProperty *property,
@@ -2029,8 +2023,7 @@ cache_insert_metadata_decomposed (TrackerData *data,
super_properties = tracker_property_get_super_properties (property);
multiple_values = tracker_property_get_multiple_values (property);
- data->resource_buffer->fts_updated |=
- tracker_property_get_fulltext_indexed (property);
+ maybe_append_fts_property (data, property);
while (*super_properties) {
gboolean super_is_multi;
@@ -2045,8 +2038,7 @@ cache_insert_metadata_decomposed (TrackerData *data,
return FALSE;
}
- data->resource_buffer->fts_updated |=
- tracker_property_get_fulltext_indexed (*super_properties);
+ maybe_append_fts_property (data, *super_properties);
if (maybe_convert_value (data,
tracker_property_get_data_type (property),
@@ -2170,8 +2162,7 @@ delete_metadata_decomposed (TrackerData *data,
multiple_values = tracker_property_get_multiple_values (property);
- data->resource_buffer->fts_updated |=
- tracker_property_get_fulltext_indexed (property);
+ maybe_append_fts_property (data, property);
/* read existing property values */
old_values = get_property_values (data, property, &new_error);
@@ -2336,8 +2327,7 @@ cache_delete_resource_type_full (TrackerData *data,
multiple_values = tracker_property_get_multiple_values (prop);
- data->resource_buffer->fts_updated |=
- tracker_property_get_fulltext_indexed (prop);
+ maybe_append_fts_property (data, prop);
old_values = get_property_values (data, prop, error);
if (!old_values)
@@ -2485,7 +2475,6 @@ resource_buffer_switch (TrackerData *data,
resource_buffer->id = subject;
resource_buffer->create = create;
- resource_buffer->fts_updated = FALSE;
if (resource_buffer->create) {
resource_buffer->types = g_ptr_array_new ();
} else {
@@ -2890,8 +2879,7 @@ 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);
+ maybe_append_fts_property (data, predicate);
log_entry_for_multi_value_property (data,
TRACKER_LOG_MULTIVALUED_PROPERTY_CLEAR,
@@ -2905,8 +2893,7 @@ 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);
+ maybe_append_fts_property (data, predicate);
if (!delete_single_valued (data, graph, subject, predicate,
!tracker_property_get_multiple_values (predicate),