[tracker/wip/carlosg/joining-services: 2/6] libtracker-data: Check binding type before printing variable in triples block
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/joining-services: 2/6] libtracker-data: Check binding type before printing variable in triples block
- Date: Wed, 13 May 2020 11:45:00 +0000 (UTC)
commit 3cbd723603420cc71b2ef6b3ddf3ccf46683402f
Author: Carlos Garnacho <carlosg gnome org>
Date: Wed May 13 01:27:18 2020 +0200
libtracker-data: Check binding type before printing variable in triples block
A "resource" binding might have been used previously in a services table query
in which case it would hold a string. Play along in later triple blocks and
use the same type.
This makes this query work:
SELECT ?u {
SERVICE <dbus:org.freedesktop.Tracker3.Miner.Files> {
?u a rdfs:Resource
}
?u tracker:indexed true
}
Fixes: https://gitlab.gnome.org/GNOME/tracker/-/issues/206
src/libtracker-data/tracker-sparql.c | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 111306033..be99b68c3 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -2054,7 +2054,7 @@ _end_triples_block (TrackerSparql *sparql,
/* Add select variables */
while (g_hash_table_iter_next (&iter, (gpointer *) &var, NULL)) {
- TrackerBinding *binding;
+ TrackerBinding *binding, *sample;
GPtrArray *binding_list;
binding_list = tracker_triple_context_get_variable_binding_list (triple_context,
@@ -2067,9 +2067,28 @@ _end_triples_block (TrackerSparql *sparql,
first = FALSE;
binding = g_ptr_array_index (binding_list, 0);
- _append_string_printf (sparql, "%s AS %s ",
- tracker_binding_get_sql_expression (binding),
- tracker_variable_get_sql_expression (var));
+ sample = TRACKER_BINDING (tracker_variable_get_sample_binding (var));
+
+ if (sample &&
+ sample->data_type == TRACKER_PROPERTY_TYPE_STRING &&
+ binding->data_type == TRACKER_PROPERTY_TYPE_RESOURCE) {
+ TrackerStringBuilder *str, *old;
+
+ str = _append_placeholder (sparql);
+ old = tracker_sparql_swap_builder (sparql, str);
+
+ _append_string_printf (sparql, "%s ",
+ tracker_binding_get_sql_expression (binding));
+
+ convert_expression_to_string (sparql, binding->data_type);
+ _append_string_printf (sparql, "AS %s ", tracker_variable_get_sql_expression (var));
+
+ tracker_sparql_swap_builder (sparql, old);
+ } else {
+ _append_string_printf (sparql, "%s AS %s ",
+ tracker_binding_get_sql_expression (binding),
+ tracker_variable_get_sql_expression (var));
+ }
}
if (first)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]