summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-06-30 00:20:16 +0200
committerCarlos Garnacho <carlosg@gnome.org>2022-06-30 23:57:43 +0200
commit6a756e1ea8df25fb9d2901f8a15a987ccbf19f84 (patch)
tree7b9ca54ee653c4cffc7afdd0c2a37c0eea637bb6 /src
parent04abacdb65a365db01b9ad0799772dec98410b41 (diff)
downloadtracker-6a756e1ea8df25fb9d2901f8a15a987ccbf19f84.tar.gz
libtracker-sparql: Allow implicit creation of resources when parsing RDF
Since we produce unordered RDF that has no guarantees about rdf:type being set first, handle types implicitly based on the properties received. Arguably, this is correct behavior to achieve full RDFS entailment, but only handle it with RDF parsing so far.
Diffstat (limited to 'src')
-rw-r--r--src/libtracker-sparql/core/tracker-data-update.c47
1 files changed, 30 insertions, 17 deletions
diff --git a/src/libtracker-sparql/core/tracker-data-update.c b/src/libtracker-sparql/core/tracker-data-update.c
index 4d525b35f..3626ac514 100644
--- a/src/libtracker-sparql/core/tracker-data-update.c
+++ b/src/libtracker-sparql/core/tracker-data-update.c
@@ -116,6 +116,7 @@ struct _TrackerData {
gboolean in_transaction;
gboolean in_ontology_transaction;
+ gboolean implicit_create;
TrackerDataUpdateBuffer update_buffer;
/* current resource */
@@ -1610,23 +1611,30 @@ get_old_property_values (TrackerData *data,
old_values = g_hash_table_lookup (data->resource_buffer->predicates, property);
if (old_values == NULL) {
if (!check_property_domain (data, property)) {
- TrackerDBInterface *iface;
- gchar *resource;
-
- iface = tracker_data_manager_get_writable_db_interface (data->manager);
- resource = tracker_data_query_resource_urn (data->manager,
- iface,
- data->resource_buffer->id);
-
- g_set_error (error, TRACKER_SPARQL_ERROR, TRACKER_SPARQL_ERROR_CONSTRAINT,
- "%s %s is not is not a %s, cannot have property `%s'",
- resource ? "Subject" : "Blank node",
- resource ? resource : "",
- tracker_class_get_name (tracker_property_get_domain (property)),
- tracker_property_get_name (property));
- g_free (resource);
-
- return NULL;
+ if (data->implicit_create) {
+ if (!cache_create_service_decomposed (data,
+ tracker_property_get_domain (property),
+ error))
+ return NULL;
+ } else {
+ TrackerDBInterface *iface;
+ gchar *resource;
+
+ iface = tracker_data_manager_get_writable_db_interface (data->manager);
+ resource = tracker_data_query_resource_urn (data->manager,
+ iface,
+ data->resource_buffer->id);
+
+ g_set_error (error, TRACKER_SPARQL_ERROR, TRACKER_SPARQL_ERROR_CONSTRAINT,
+ "%s %s is not is not a %s, cannot have property `%s'",
+ resource ? "Subject" : "Blank node",
+ resource ? resource : "",
+ tracker_class_get_name (tracker_property_get_domain (property)),
+ tracker_property_get_name (property));
+ g_free (resource);
+
+ return NULL;
+ }
}
if (tracker_property_get_fulltext_indexed (property)) {
@@ -2868,6 +2876,7 @@ tracker_data_load_from_deserializer (TrackerData *data,
goffset last_parsed_line_no = 0, last_parsed_column_no = 0;
ontologies = tracker_data_manager_get_ontologies (data->manager);
+ data->implicit_create = TRUE;
while (tracker_sparql_cursor_next (cursor, NULL, &inner_error)) {
TrackerProperty *predicate;
@@ -2931,9 +2940,13 @@ tracker_data_load_from_deserializer (TrackerData *data,
if (inner_error)
goto failed;
+ data->implicit_create = FALSE;
+
return TRUE;
failed:
+ data->implicit_create = FALSE;
+
tracker_deserializer_get_parser_location (deserializer,
&last_parsed_line_no,
&last_parsed_column_no);