summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Thursfield <sam@afuera.me.uk>2021-01-26 11:13:53 +0000
committerSam Thursfield <sam@afuera.me.uk>2021-01-26 11:13:53 +0000
commit12534a0d4d2e37d8aefa1f6513618698d389a236 (patch)
treec6ec4cc7c033224e38b071555925ef421716c6ce
parent83349d45285c23fc882101d721f979fd236a969f (diff)
parent737999880a214642cc7e35b2a4d96cc366245081 (diff)
downloadtracker-12534a0d4d2e37d8aefa1f6513618698d389a236.tar.gz
Merge branch 'wip/carlosg/vars-in-service' into 'master'
libtracker-data: Handle variables for SERVICE clauses correctly See merge request GNOME/tracker!369
-rw-r--r--src/libtracker-data/tracker-sparql.c17
-rw-r--r--src/libtracker-data/tracker-vtab-service.c7
-rw-r--r--tests/libtracker-data/service/service-var-1.out16
-rw-r--r--tests/libtracker-data/service/service-var-1.rq6
-rw-r--r--tests/libtracker-data/service/service-var-2.out16
-rw-r--r--tests/libtracker-data/service/service-var-2.rq6
-rw-r--r--tests/libtracker-data/tracker-service-test.c2
7 files changed, 68 insertions, 2 deletions
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 2a3e8c17b..9b0f5701f 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -5214,6 +5214,15 @@ translate_ServiceGraphPattern (TrackerSparql *sparql,
i++;
}
+ if (tracker_token_get_variable (&service)) {
+ if (variable_rules != NULL)
+ _append_string (sparql, ", ");
+
+ _append_string_printf (sparql, "service AS %s ",
+ tracker_token_get_idstring (&service));
+ join_vars = g_list_prepend (join_vars, tracker_token_get_variable (&service));
+ }
+
tracker_parser_node_get_extents (pattern, &pattern_start, &pattern_end);
pattern_str = g_strndup (&sparql->sparql[pattern_start], pattern_end - pattern_start);
escaped_str = _escape_sql_string (pattern_str, '"');
@@ -5222,11 +5231,15 @@ translate_ServiceGraphPattern (TrackerSparql *sparql,
g_free (pattern_str);
g_free (escaped_str);
- _append_string_printf (sparql, "FROM tracker_service WHERE service=\"%s\" AND query=\"%s\" AND silent=%d ",
- tracker_token_get_idstring (&service),
+ _append_string_printf (sparql, "FROM tracker_service WHERE query=\"%s\" AND silent=%d ",
service_sparql->str,
silent);
+ if (!tracker_token_get_variable (&service)) {
+ _append_string_printf (sparql, "AND service=\"%s\" ",
+ tracker_token_get_idstring (&service));
+ }
+
i = 0;
/* Proxy parameters to the virtual table */
diff --git a/src/libtracker-data/tracker-vtab-service.c b/src/libtracker-data/tracker-vtab-service.c
index a14d50509..628ecada1 100644
--- a/src/libtracker-data/tracker-vtab-service.c
+++ b/src/libtracker-data/tracker-vtab-service.c
@@ -158,6 +158,7 @@ service_best_index (sqlite3_vtab *vtab,
{
int i, argv_idx = 1;
ConstraintData *data;
+ gboolean has_service = FALSE;
data = sqlite3_malloc (sizeof (ConstraintData) * info->nConstraint);
bzero (data, sizeof (ConstraintData) * info->nConstraint);
@@ -174,6 +175,9 @@ service_best_index (sqlite3_vtab *vtab,
if (info->aConstraint[i].op != SQLITE_INDEX_CONSTRAINT_EQ)
goto error;
+ if (info->aConstraint[i].iColumn == COL_SERVICE)
+ has_service = TRUE;
+
data[i].column = info->aConstraint[i].iColumn;
data[i].op = info->aConstraint[i].op;
@@ -186,6 +190,9 @@ service_best_index (sqlite3_vtab *vtab,
info->idxStr = (char *) data;
info->needToFreeIdxStr = TRUE;
+ if (!has_service)
+ return SQLITE_CONSTRAINT;
+
return SQLITE_OK;
error:
diff --git a/tests/libtracker-data/service/service-var-1.out b/tests/libtracker-data/service/service-var-1.out
new file mode 100644
index 000000000..5b6a80407
--- /dev/null
+++ b/tests/libtracker-data/service/service-var-1.out
@@ -0,0 +1,16 @@
+"http://tracker.api.gnome.org/ontology/v3/nie#url"
+"http://tracker.api.gnome.org/ontology/v3/nie#mimeType"
+"http://tracker.api.gnome.org/ontology/v3/nie#interpretedAs"
+"http://tracker.api.gnome.org/ontology/v3/nie#isStoredAs"
+"http://tracker.api.gnome.org/ontology/v3/nao#hasTag"
+"http://tracker.api.gnome.org/ontology/v3/nco#nameFamily"
+"http://tracker.api.gnome.org/ontology/v3/nco#phoneNumber"
+"http://tracker.api.gnome.org/ontology/v3/nco#hasEmailAddress"
+"http://tracker.api.gnome.org/ontology/v3/nco#hasPostalAddress"
+"http://tracker.api.gnome.org/ontology/v3/nfo#fileName"
+"http://tracker.api.gnome.org/ontology/v3/nfo#fileLastModified"
+"http://tracker.api.gnome.org/ontology/v3/nmm#artistName"
+"http://tracker.api.gnome.org/ontology/v3/nmm#musicAlbum"
+"http://tracker.api.gnome.org/ontology/v3/nmm#performer"
+"http://tracker.api.gnome.org/ontology/v3/slo#postalAddress"
+"http://tracker.api.gnome.org/ontology/v3/slo#location"
diff --git a/tests/libtracker-data/service/service-var-1.rq b/tests/libtracker-data/service/service-var-1.rq
new file mode 100644
index 000000000..8a5ea245a
--- /dev/null
+++ b/tests/libtracker-data/service/service-var-1.rq
@@ -0,0 +1,6 @@
+SELECT ?u {
+ VALUES ?s { 'dbus:%s' } .
+ SERVICE ?s {
+ ?u nrl:indexed true
+ }
+}
diff --git a/tests/libtracker-data/service/service-var-2.out b/tests/libtracker-data/service/service-var-2.out
new file mode 100644
index 000000000..5b6a80407
--- /dev/null
+++ b/tests/libtracker-data/service/service-var-2.out
@@ -0,0 +1,16 @@
+"http://tracker.api.gnome.org/ontology/v3/nie#url"
+"http://tracker.api.gnome.org/ontology/v3/nie#mimeType"
+"http://tracker.api.gnome.org/ontology/v3/nie#interpretedAs"
+"http://tracker.api.gnome.org/ontology/v3/nie#isStoredAs"
+"http://tracker.api.gnome.org/ontology/v3/nao#hasTag"
+"http://tracker.api.gnome.org/ontology/v3/nco#nameFamily"
+"http://tracker.api.gnome.org/ontology/v3/nco#phoneNumber"
+"http://tracker.api.gnome.org/ontology/v3/nco#hasEmailAddress"
+"http://tracker.api.gnome.org/ontology/v3/nco#hasPostalAddress"
+"http://tracker.api.gnome.org/ontology/v3/nfo#fileName"
+"http://tracker.api.gnome.org/ontology/v3/nfo#fileLastModified"
+"http://tracker.api.gnome.org/ontology/v3/nmm#artistName"
+"http://tracker.api.gnome.org/ontology/v3/nmm#musicAlbum"
+"http://tracker.api.gnome.org/ontology/v3/nmm#performer"
+"http://tracker.api.gnome.org/ontology/v3/slo#postalAddress"
+"http://tracker.api.gnome.org/ontology/v3/slo#location"
diff --git a/tests/libtracker-data/service/service-var-2.rq b/tests/libtracker-data/service/service-var-2.rq
new file mode 100644
index 000000000..38cfcb753
--- /dev/null
+++ b/tests/libtracker-data/service/service-var-2.rq
@@ -0,0 +1,6 @@
+SELECT ?u {
+ SERVICE ?s {
+ ?u nrl:indexed true
+ }
+}
+VALUES ?s { 'dbus:%s' }
diff --git a/tests/libtracker-data/tracker-service-test.c b/tests/libtracker-data/tracker-service-test.c
index 5dfeb63f5..f2e67e468 100644
--- a/tests/libtracker-data/tracker-service-test.c
+++ b/tests/libtracker-data/tracker-service-test.c
@@ -41,6 +41,8 @@ const TestInfo tests[] = {
{ "service/service-local-filter-1", FALSE },
{ "service/service-union-with-local-1", FALSE },
{ "service/service-union-with-local-2", FALSE },
+ { "service/service-var-1", FALSE },
+ { "service/service-var-2", FALSE },
};
static GDBusConnection *dbus_conn = NULL;