diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2018-08-03 02:32:09 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2018-08-03 12:12:26 +0200 |
commit | a25f186f8012190291766d073a89fed2eee7cefd (patch) | |
tree | 2b6ad26a3e5054f07ad00247214d741dafc1e166 | |
parent | 63e7dae51fbb033707e4f255684b6913340f4605 (diff) | |
download | tracker-wip/carlosg/resource-deletes.tar.gz |
libtracker-sparql: delete TrackerResource elements one by onewip/carlosg/resource-deletes
Creating a single query for all values to delete can only work if
all values have a match. As soon as a value is already missing,
the query would just bail out as there's no real match.
We want to delete every value individually regardless of other
properties, so decompose the single delete into multiple individual
deletes.
Fixes "Unable to insert multiple values for subject..." warnings
as the insertion queries would rely on single-valued properties being
cleared beforehand.
https://gitlab.gnome.org/GNOME/tracker/issues/28
Closes: #28
-rw-r--r-- | src/libtracker-sparql/tracker-resource.c | 45 |
1 files changed, 17 insertions, 28 deletions
diff --git a/src/libtracker-sparql/tracker-resource.c b/src/libtracker-sparql/tracker-resource.c index 2270900fc..23e4dbab3 100644 --- a/src/libtracker-sparql/tracker-resource.c +++ b/src/libtracker-sparql/tracker-resource.c @@ -1359,7 +1359,7 @@ variable_name_for_property (const char *property) { } static void -generate_sparql_delete_pattern (TrackerResource *resource, +generate_sparql_delete_queries (TrackerResource *resource, GHashTable *overwrite_flags, GenerateSparqlData *data) { @@ -1367,37 +1367,32 @@ generate_sparql_delete_pattern (TrackerResource *resource, GHashTableIter iter; const char *property; const GValue *value; - gboolean had_property; - if (data->graph_id) { - g_string_append_printf (data->string, "GRAPH <%s> {\n", data->graph_id); - } - - g_string_append (data->string, " "); - generate_turtle_uri_value (priv->identifier, data->string, data->namespaces, NULL); - g_string_append (data->string, "\n "); - - had_property = FALSE; g_hash_table_iter_init (&iter, priv->properties); while (g_hash_table_iter_next (&iter, (gpointer *)&property, (gpointer *)&value)) { /* Whether to generate the DELETE is based on whether set_value was ever * called for this property. That's tracked in the overwrite_flags hash table. */ if (g_hash_table_lookup (overwrite_flags, property)) { - if (had_property) { - g_string_append (data->string, " ;\n "); + char *variable_name = variable_name_for_property (property); + + g_string_append (data->string, "DELETE WHERE {\n"); + + if (data->graph_id) { + g_string_append_printf (data->string, "GRAPH <%s> {\n", data->graph_id); } - char *variable_name = variable_name_for_property (property); - g_string_append_printf (data->string, " %s ?%s", property, variable_name); + g_string_append (data->string, " "); + generate_turtle_uri_value (priv->identifier, data->string, data->namespaces, NULL); + g_string_append_printf (data->string, " %s ?%s }", property, variable_name); g_free (variable_name); - had_property = TRUE; - } - } + if (data->graph_id) { + g_string_append (data->string, " }"); + } - if (data->graph_id) { - g_string_append (data->string, " }"); + g_string_append (data->string, "\n"); + } } } @@ -1407,14 +1402,8 @@ generate_sparql_deletes (TrackerResource *resource, { TrackerResourcePrivate *priv = GET_PRIVATE (resource); - if (! is_blank_node (priv->identifier)) { - if (g_hash_table_size (priv->overwrite) > 0) { - g_string_append (data->string, "DELETE {\n"); - generate_sparql_delete_pattern (resource, priv->overwrite, data); - g_string_append (data->string, "\n}\nWHERE {\n"); - generate_sparql_delete_pattern (resource, priv->overwrite, data); - g_string_append (data->string, "\n}\n"); - } + if (! is_blank_node (priv->identifier) && g_hash_table_size (priv->overwrite) > 0) { + generate_sparql_delete_queries (resource, priv->overwrite, data); } /* Now emit any sub-resources. */ |