[tracker/sparql-update: 12/16] libtracker-data: Performance improvement for REPLACE support
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/sparql-update: 12/16] libtracker-data: Performance improvement for REPLACE support
- Date: Mon, 14 Mar 2011 09:20:13 +0000 (UTC)
commit 0b05819a5325e2657bd01d80aaa80d083ea68e90
Author: Philip Van Hoof <philip codeminded be>
Date: Fri Mar 11 16:34:01 2011 +0100
libtracker-data: Performance improvement for REPLACE support
Don't lookup the object-id in case no class in the known types of
the subject has tracker:notify: the only reason why we look this
old object-id up is for GraphUpdated at this moment.
src/libtracker-data/tracker-data-update.c | 54 +++++++++++++++++++---------
1 files changed, 36 insertions(+), 18 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index 272ab0e..ce356a1 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -2619,33 +2619,51 @@ tracker_data_update_statement_with_uri (const gchar *graph,
GValueArray *old_values;
gboolean multiple_values;
GError *new_error = NULL;
+ gboolean domain_unchecked = TRUE;
multiple_values = tracker_property_get_multiple_values (property);
/* We can disable correct object-id for deletes array here */
if (!multiple_values) {
- /* This does a check_property_domain too */
- old_values = get_old_property_values (property, &new_error);
- if (!new_error) {
- if (old_values->n_values > 0) {
- /* evel knievel cast */
- old_object_id = (guint) g_value_get_int64 (g_value_array_get_nth (old_values, 0));
+ guint r;
+
+ for (r = 0; r < resource_buffer->types->len; r++) {
+ TrackerClass *m_class = g_ptr_array_index (resource_buffer->types, r);
+
+ /* We only do the old_values for GraphUpdated in tracker-store.
+ * The subject's known classes are in resource_buffer->types
+ * since resource_buffer_switch, so we can quickly check if any
+ * of them has tracker:notify annotated. If so, get the old
+ * values for the old_object_id */
+
+ if (tracker_class_get_notify (m_class)) {
+ /* This does a check_property_domain too */
+ old_values = get_old_property_values (property, &new_error);
+ domain_unchecked = FALSE;
+ if (!new_error) {
+ if (old_values->n_values > 0) {
+ /* evel knievel cast */
+ old_object_id = (guint) g_value_get_int64 (g_value_array_get_nth (old_values, 0));
+ }
+ } else {
+ g_propagate_error (error, new_error);
+ return;
+ }
+
+ break;
}
- } else {
- g_propagate_error (error, new_error);
- return;
- }
- } else {
- if (!check_property_domain (property)) {
- g_set_error (error, TRACKER_SPARQL_ERROR, TRACKER_SPARQL_ERROR_CONSTRAINT,
- "Subject `%s' is not in domain `%s' of property `%s'",
- resource_buffer->subject,
- tracker_class_get_name (tracker_property_get_domain (property)),
- tracker_property_get_name (property));
- return;
}
}
+ if (domain_unchecked && !check_property_domain (property)) {
+ g_set_error (error, TRACKER_SPARQL_ERROR, TRACKER_SPARQL_ERROR_CONSTRAINT,
+ "Subject `%s' is not in domain `%s' of property `%s'",
+ resource_buffer->subject,
+ tracker_class_get_name (tracker_property_get_domain (property)),
+ tracker_property_get_name (property));
+ return;
+ }
+
/* update or add value to metadata database */
change = cache_update_metadata_decomposed (property, object, 0, graph, 0, &actual_error);
if (actual_error) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]