diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2022-06-30 00:20:16 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2022-06-30 23:57:43 +0200 |
commit | 6a756e1ea8df25fb9d2901f8a15a987ccbf19f84 (patch) | |
tree | 7b9ca54ee653c4cffc7afdd0c2a37c0eea637bb6 /src | |
parent | 04abacdb65a365db01b9ad0799772dec98410b41 (diff) | |
download | tracker-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.c | 47 |
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); |