summaryrefslogtreecommitdiff
blob: 7a98f336cc1493c381cd2b20ddc6d407913bf468 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
From ca0d487aac3b9cf21e520a00b94cb3eaf833b9a3 Mon Sep 17 00:00:00 2001
From: Carlos Garnacho <carlosg@gnome.org>
Date: Thu, 24 Dec 2020 12:19:49 +0100
Subject: [PATCH 1/5] Obtain TrackerSparqlConnection in a single point

The is_available vmethod tries to create a connection if it's not
there. But the BraseroSearchTracker initialization already tries to
obtain the SPARQL connection. Let this method return wether
initialiation was successful.
---
 src/brasero-search-tracker.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/src/brasero-search-tracker.c b/src/brasero-search-tracker.c
index fe7be2bd..f8c29c0d 100644
--- a/src/brasero-search-tracker.c
+++ b/src/brasero-search-tracker.c
@@ -56,12 +56,6 @@ brasero_search_tracker_is_available (BraseroSearchEngine *engine)
 	BraseroSearchTrackerPrivate *priv;
 
 	priv = BRASERO_SEARCH_TRACKER_PRIVATE (engine);
-	GError *error = NULL;
-	if (priv->connection)
-		return TRUE;
-	
-	priv->cancellable = g_cancellable_new ();
- 	priv->connection = tracker_sparql_connection_get (priv->cancellable, &error);
 	return (priv->connection != NULL);
 }
 
-- 
GitLab


From c0dace005ec34b345845aacd1f929fd618b199af Mon Sep 17 00:00:00 2001
From: Carlos Garnacho <carlosg@gnome.org>
Date: Thu, 24 Dec 2020 12:37:13 +0100
Subject: [PATCH 2/5] Fix ORDER BY clauses in Tracker search

The ?urn variable is not defined anywhere else in the query, so
ordering is left undefined. Access the url/filename properly here.
---
 src/brasero-search-tracker.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/brasero-search-tracker.c b/src/brasero-search-tracker.c
index f8c29c0d..94085070 100644
--- a/src/brasero-search-tracker.c
+++ b/src/brasero-search-tracker.c
@@ -307,7 +307,7 @@ brasero_search_tracker_query_start_real (BraseroSearchEngine *search,
 	g_string_append (query, ")");
 
 	g_string_append (query,
-			 "} ORDER BY DESC(nie:url(?urn)) DESC(nfo:fileName(?urn))");
+			 "} ORDER BY DESC(?url) DESC(nfo:fileName(?file))");
 
 	tracker_sparql_connection_query_async (priv->connection,
 					       query->str,
-- 
GitLab


From f7181445bf9c88b7fab1bb5237d602b491694a9e Mon Sep 17 00:00:00 2001
From: Carlos Garnacho <carlosg@gnome.org>
Date: Thu, 24 Dec 2020 13:04:03 +0100
Subject: [PATCH 3/5] Only use fts:rank with FTS searches

This fixes two things:
- The use of fts:match depends on priv->keywords being set, but
  fts:rank() has undefined behavior if fts:match is not present.
  Its value is returned in the cursor, but fortunately unused,
  so it can go away.

- Fixes "garbage" being added at the end of the query, concretely
  ") } ORDER BY ... " is appended at the supposed end of the query
  string. Older SPARQL parser implementations would allow garbage
  at the end of its parsing state, I suspect "LIMIT 0 OFFSET 10000"
  was just a mean to push it to that state that it'd allow the
  remaining string, so that is gone too.
---
 src/brasero-search-tracker.c | 21 +++++++++------------
 1 file changed, 9 insertions(+), 12 deletions(-)

diff --git a/src/brasero-search-tracker.c b/src/brasero-search-tracker.c
index 94085070..ae1d388a 100644
--- a/src/brasero-search-tracker.c
+++ b/src/brasero-search-tracker.c
@@ -234,7 +234,7 @@ brasero_search_tracker_query_start_real (BraseroSearchEngine *search,
 
 	priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
 
-	query = g_string_new ("SELECT ?file ?url ?mime fts:rank(?file) "	/* Which variables should be returned */
+	query = g_string_new ("SELECT ?file ?url ?mime "			/* Which variables should be returned */
 			      "WHERE {"						/* Start defining the search and its scope */
 			      "  ?file a nfo:FileDataObject . "			/* File must be a file (not a stream, ...) */
 	                      "  ?file nie:url ?url . "				/* Get the url of the file */
@@ -293,21 +293,18 @@ brasero_search_tracker_query_start_real (BraseroSearchEngine *search,
 				 " ) ");
 	}
 
-	if (priv->keywords)
+	if (priv->keywords) {
 		g_string_append_printf (query,
 					"  ?file fts:match \"%s\" ",		/* File must match possible keywords */
 					priv->keywords);
 
-	g_string_append (query,
-			 " } "
-			 "ORDER BY ASC(fts:rank(?file)) "
-			 "OFFSET 0 "
-			 "LIMIT 10000");
-
-	g_string_append (query, ")");
-
-	g_string_append (query,
-			 "} ORDER BY DESC(?url) DESC(nfo:fileName(?file))");
+		g_string_append (query,
+				 " } "
+				 "ORDER BY ASC(fts:rank(?file))");
+	} else {
+		g_string_append (query,
+				 "} ORDER BY DESC(?url) DESC(nfo:fileName(?file))");
+	}
 
 	tracker_sparql_connection_query_async (priv->connection,
 					       query->str,
-- 
GitLab


From ede7758e2fae487d57be641a120c4c02bfd249f1 Mon Sep 17 00:00:00 2001
From: Carlos Garnacho <carlosg@gnome.org>
Date: Thu, 24 Dec 2020 13:15:21 +0100
Subject: [PATCH 4/5] Observe nfo:FileDataObject/nie:InformationElement split

These resources are interpreted differently in Tracker 3.0 compared
to older versions, the newer version makes those 2 different resources
(one representing the "file", other the "content) that relate to each
other. In older tracker versions, these 2 aspects were conflated in
a single resource.

The query is implicitly crossing that barrier, so make it explicit.
With this change, the query may run with either version.
---
 src/brasero-search-tracker.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/brasero-search-tracker.c b/src/brasero-search-tracker.c
index ae1d388a..9aa06289 100644
--- a/src/brasero-search-tracker.c
+++ b/src/brasero-search-tracker.c
@@ -238,7 +238,8 @@ brasero_search_tracker_query_start_real (BraseroSearchEngine *search,
 			      "WHERE {"						/* Start defining the search and its scope */
 			      "  ?file a nfo:FileDataObject . "			/* File must be a file (not a stream, ...) */
 	                      "  ?file nie:url ?url . "				/* Get the url of the file */
-	                      "  ?file nie:mimeType ?mime . ");			/* Get its mime */
+	                      "  ?file nie:mimeType ?mime . "			/* Get its mime */
+			      "  ?content nie:isStoredAs ?file . ");		/* Get the resource representing the content */
 
 	if (priv->mimes) {
 		int i;
@@ -259,7 +260,7 @@ brasero_search_tracker_query_start_real (BraseroSearchEngine *search,
 		gboolean param_added = FALSE;
 
 		g_string_append (query,
-				 "  ?file a ?type . "
+				 "  ?content a ?type . "
 				 "  FILTER ( ");
 
 		if (priv->scope & BRASERO_SEARCH_SCOPE_MUSIC) {
-- 
GitLab


From 05589be7da3a0dfb00617df049d129abba703c36 Mon Sep 17 00:00:00 2001
From: Carlos Garnacho <carlosg@gnome.org>
Date: Thu, 24 Dec 2020 13:22:43 +0100
Subject: [PATCH 5/5] Support Tracker 3.0

Add the compile-time checks, and add the minimal code catering for
the API changes. In 3.0 connections are no longer singletons.
---
 configure.ac                 | 6 +++++-
 src/brasero-search-tracker.c | 8 ++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index d0c7a870..96afc551 100644
--- a/configure.ac
+++ b/configure.ac
@@ -388,7 +388,7 @@ AC_ARG_ENABLE(search,
 if test x"$enable_search" != "xno"; then
         # Try to figure out the tracker API version to use
         tracker_api="0.10"
-        m4_foreach([VERSION], [[0.10], [0.12], [0.14], [0.16], [0.18], [1.0], [2.0]],
+        m4_foreach([VERSION], [[0.10], [0.12], [0.14], [0.16], [0.18], [1.0], [2.0], [3.0]],
                               [PKG_CHECK_EXISTS([tracker-sparql-VERSION >= $TRACKER_REQUIRED],
                                                 [tracker_api="VERSION"])
                               ])
@@ -408,6 +408,10 @@ if test x"$enable_search" = "xyes"; then
 	AC_SUBST(BRASERO_SEARCH_LIBS)
 	build_tracker="yes"
 	build_search="yes"
+
+	if test x"$tracker_api" = x"3.0"; then
+		AC_DEFINE(HAVE_TRACKER3, 1, [define if tracker3 is available])
+	fi
 else
 	build_search="no"
 fi
diff --git a/src/brasero-search-tracker.c b/src/brasero-search-tracker.c
index 9aa06289..40c5f1ac 100644
--- a/src/brasero-search-tracker.c
+++ b/src/brasero-search-tracker.c
@@ -17,6 +17,8 @@
  * with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include "config.h"
+
 #include <stdlib.h>
 
 #include <libtracker-sparql/tracker-sparql.h>
@@ -444,7 +446,13 @@ brasero_search_tracker_init (BraseroSearchTracker *object)
 
 	priv = BRASERO_SEARCH_TRACKER_PRIVATE (object);
 	priv->cancellable = g_cancellable_new ();
+
+#ifdef HAVE_TRACKER3
+	priv->connection = tracker_sparql_connection_bus_new ("org.freedesktop.Tracker3.Miner.Files",
+							      NULL, NULL, &error);
+#else
 	priv->connection = tracker_sparql_connection_get (priv->cancellable, &error);
+#endif
 
 	if (error) {
 		g_warning ("Could not establish a connection to Tracker: %s", error->message);
-- 
GitLab