summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-08-20 12:17:03 +0200
committerCarlos Garnacho <carlosg@gnome.org>2022-08-30 17:38:57 +0200
commit85a491a95f9dd36995c3a7bd90da541a6aca1f46 (patch)
tree15346687764bcabe5d9ed4d34aa32eaf7058ed7b
parent414dfa88a760d7bdb8416753a33e019920097025 (diff)
downloadtracker-85a491a95f9dd36995c3a7bd90da541a6aca1f46.tar.gz
core: Shuffle query for RDF types of a resource
This is only used in the update machinery, so move it there and keep the TrackerDBStatement around. This is a very hot path during updates of already existing resources, so it makes sense to avoid the DB interface internal caches and SQL query strings for this.
-rw-r--r--src/libtracker-sparql/core/tracker-data-query.c61
-rw-r--r--src/libtracker-sparql/core/tracker-data-query.h5
-rw-r--r--src/libtracker-sparql/core/tracker-data-update.c70
3 files changed, 68 insertions, 68 deletions
diff --git a/src/libtracker-sparql/core/tracker-data-query.c b/src/libtracker-sparql/core/tracker-data-query.c
index bc7413364..7aa563338 100644
--- a/src/libtracker-sparql/core/tracker-data-query.c
+++ b/src/libtracker-sparql/core/tracker-data-query.c
@@ -33,67 +33,6 @@
#include "tracker-ontologies.h"
#include "tracker-sparql.h"
-GPtrArray*
-tracker_data_query_rdf_type (TrackerDataManager *manager,
- const gchar *graph,
- TrackerRowid id,
- GError **error)
-{
- TrackerDBInterface *iface;
- TrackerDBStatement *stmt;
- GArray *classes = NULL;
- GPtrArray *ret = NULL;
- GError *inner_error = NULL;
- TrackerOntologies *ontologies;
- const gchar *class_uri;
- guint i;
-
- iface = tracker_data_manager_get_writable_db_interface (manager);
- ontologies = tracker_data_manager_get_ontologies (manager);
-
- stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT, &inner_error,
- "SELECT (SELECT Uri FROM Resource WHERE ID = \"rdf:type\") "
- "FROM \"%s\".\"rdfs:Resource_rdf:type\" "
- "WHERE ID = ?",
- graph ? graph : "main");
-
- if (stmt) {
- tracker_db_statement_bind_int (stmt, 0, id);
- classes = tracker_db_statement_get_values (stmt,
- TRACKER_PROPERTY_TYPE_STRING,
- &inner_error);
- g_object_unref (stmt);
- }
-
- if (classes) {
- ret = g_ptr_array_sized_new (classes->len);
-
- for (i = 0; i < classes->len; i++) {
- TrackerClass *cl;
-
- class_uri = g_value_get_string (&g_array_index (classes, GValue, i));
- cl = tracker_ontologies_get_class_by_uri (ontologies, class_uri);
- if (!cl) {
- g_critical ("Unknown class %s", class_uri);
- continue;
- }
- g_ptr_array_add (ret, cl);
- }
-
- g_array_unref (classes);
- }
-
- if (G_UNLIKELY (inner_error)) {
- g_propagate_prefixed_error (error,
- inner_error,
- "Querying RDF type:");
- g_clear_pointer (&ret, g_ptr_array_unref);
- return NULL;
- }
-
- return ret;
-}
-
gchar *
tracker_data_query_resource_urn (TrackerDataManager *manager,
TrackerDBInterface *iface,
diff --git a/src/libtracker-sparql/core/tracker-data-query.h b/src/libtracker-sparql/core/tracker-data-query.h
index 94d84400d..11f7c6762 100644
--- a/src/libtracker-sparql/core/tracker-data-query.h
+++ b/src/libtracker-sparql/core/tracker-data-query.h
@@ -41,11 +41,6 @@ TrackerDBCursor *tracker_data_query_sparql_cursor (TrackerDataManager *mana
const gchar *query,
GError **error);
-GPtrArray* tracker_data_query_rdf_type (TrackerDataManager *manager,
- const gchar *graph,
- TrackerRowid id,
- GError **error);
-
gboolean tracker_data_query_string_to_value (TrackerDataManager *manager,
const gchar *value,
const gchar *langtag,
diff --git a/src/libtracker-sparql/core/tracker-data-update.c b/src/libtracker-sparql/core/tracker-data-update.c
index ad1c37677..ad6fcbce9 100644
--- a/src/libtracker-sparql/core/tracker-data-update.c
+++ b/src/libtracker-sparql/core/tracker-data-update.c
@@ -122,6 +122,7 @@ struct _TrackerDataUpdateBufferGraph {
TrackerDBStatement *insert_ref;
TrackerDBStatement *update_ref;
TrackerDBStatement *delete_ref;
+ TrackerDBStatement *query_rdf_types;
TrackerDBStatementMru values_mru;
};
@@ -816,6 +817,70 @@ log_entry_for_class (TrackerData *data,
g_hash_table_add (data->update_buffer.class_updates, entry_ptr);
}
+static GPtrArray*
+tracker_data_query_rdf_type (TrackerData *data,
+ TrackerDataUpdateBufferGraph *graph,
+ TrackerRowid id,
+ GError **error)
+{
+ TrackerDBInterface *iface;
+ TrackerDBStatement *stmt;
+ GArray *classes = NULL;
+ GPtrArray *ret = NULL;
+ GError *inner_error = NULL;
+ TrackerOntologies *ontologies;
+ const gchar *class_uri;
+ guint i;
+
+ iface = tracker_data_manager_get_writable_db_interface (data->manager);
+ ontologies = tracker_data_manager_get_ontologies (data->manager);
+
+ stmt = graph->query_rdf_types;
+
+ if (!stmt) {
+ stmt = graph->query_rdf_types =
+ tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &inner_error,
+ "SELECT (SELECT Uri FROM Resource WHERE ID = \"rdf:type\") "
+ "FROM \"%s\".\"rdfs:Resource_rdf:type\" "
+ "WHERE ID = ?",
+ graph->graph ? graph->graph : "main");
+ }
+
+ if (stmt) {
+ tracker_db_statement_bind_int (stmt, 0, id);
+ classes = tracker_db_statement_get_values (stmt,
+ TRACKER_PROPERTY_TYPE_STRING,
+ &inner_error);
+ }
+
+ if (G_UNLIKELY (inner_error)) {
+ g_propagate_prefixed_error (error,
+ inner_error,
+ "Querying RDF type:");
+ return NULL;
+ }
+
+ if (classes) {
+ ret = g_ptr_array_sized_new (classes->len);
+
+ for (i = 0; i < classes->len; i++) {
+ TrackerClass *cl;
+
+ class_uri = g_value_get_string (&g_array_index (classes, GValue, i));
+ cl = tracker_ontologies_get_class_by_uri (ontologies, class_uri);
+ if (!cl) {
+ g_critical ("Unknown class %s", class_uri);
+ continue;
+ }
+ g_ptr_array_add (ret, cl);
+ }
+
+ g_array_unref (classes);
+ }
+
+ return ret;
+}
+
static TrackerRowid
query_resource_id (TrackerData *data,
const gchar *uri,
@@ -1398,6 +1463,7 @@ graph_buffer_free (TrackerDataUpdateBufferGraph *graph)
g_clear_object (&graph->insert_ref);
g_clear_object (&graph->update_ref);
g_clear_object (&graph->delete_ref);
+ g_clear_object (&graph->query_rdf_types);
g_hash_table_unref (graph->resources);
g_array_unref (graph->refcounts);
g_free (graph->graph);
@@ -2497,8 +2563,8 @@ resource_buffer_switch (TrackerData *data,
create = g_hash_table_contains (data->update_buffer.new_resources,
&subject);
if (!create) {
- rdf_types = tracker_data_query_rdf_type (data->manager,
- graph,
+ rdf_types = tracker_data_query_rdf_type (data,
+ graph_buffer,
subject,
&inner_error);
if (!rdf_types) {