diff options
author | Sam Thursfield <sam@afuera.me.uk> | 2021-01-26 11:13:53 +0000 |
---|---|---|
committer | Sam Thursfield <sam@afuera.me.uk> | 2021-01-26 11:13:53 +0000 |
commit | 12534a0d4d2e37d8aefa1f6513618698d389a236 (patch) | |
tree | c6ec4cc7c033224e38b071555925ef421716c6ce | |
parent | 83349d45285c23fc882101d721f979fd236a969f (diff) | |
parent | 737999880a214642cc7e35b2a4d96cc366245081 (diff) | |
download | tracker-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.c | 17 | ||||
-rw-r--r-- | src/libtracker-data/tracker-vtab-service.c | 7 | ||||
-rw-r--r-- | tests/libtracker-data/service/service-var-1.out | 16 | ||||
-rw-r--r-- | tests/libtracker-data/service/service-var-1.rq | 6 | ||||
-rw-r--r-- | tests/libtracker-data/service/service-var-2.out | 16 | ||||
-rw-r--r-- | tests/libtracker-data/service/service-var-2.rq | 6 | ||||
-rw-r--r-- | tests/libtracker-data/tracker-service-test.c | 2 |
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; |