[gnome-music/wip/jfelder/searchview-new-style: 14/15] grltrackerwrapper: Order queries top to bottom



commit f66c280ca8c076a7851c51ee072eef8d702d8927
Author: Marinus Schraal <mschraal gnome org>
Date:   Mon Aug 5 21:29:46 2019 +0200

    grltrackerwrapper: Order queries top to bottom
    
    Artists are shown on top, so query them first. And so on.

 gnomemusic/grilowrappers/grltrackerwrapper.py | 72 ++++++++++++++-------------
 gnomemusic/views/searchview.py                |  7 +++
 2 files changed, 44 insertions(+), 35 deletions(-)
---
diff --git a/gnomemusic/grilowrappers/grltrackerwrapper.py b/gnomemusic/grilowrappers/grltrackerwrapper.py
index 40c862a1..97953c81 100644
--- a/gnomemusic/grilowrappers/grltrackerwrapper.py
+++ b/gnomemusic/grilowrappers/grltrackerwrapper.py
@@ -627,20 +627,21 @@ class GrlTrackerWrapper(GObject.GObject):
             GLib.utf8_normalize(
                 GLib.utf8_casefold(text, -1), -1, GLib.NormalizeMode.NFKD))
 
+        # Artist search
+
         query = """
         SELECT DISTINCT
-            rdf:type(?song)
-            tracker:id(?song) AS ?id
+            rdf:type(?artist)
+            tracker:id(?artist) AS ?id
         WHERE {
-            ?song a nmm:MusicPiece .
+            ?song a nmm:MusicPiece ;
+                    nmm:musicAlbum ?album ;
+                    nmm:performer ?artist .
             BIND(tracker:normalize(
-                nie:title(nmm:musicAlbum(?song)), 'nfkd') AS ?match1) .
+                nmm:artistName(nmm:albumArtist(?album)), 'nfkd') AS ?match1) .
             BIND(tracker:normalize(
                 nmm:artistName(nmm:performer(?song)), 'nfkd') AS ?match2) .
-            BIND(tracker:normalize(
-                nie:title(?song), 'nfkd') AS ?match3) .
-            BIND(
-                tracker:normalize(nmm:composer(?song), 'nfkd') AS ?match4) .
+            BIND(tracker:normalize(nmm:composer(?song), 'nfkd') AS ?match4) .
             FILTER (
                 CONTAINS(tracker:case-fold(
                     tracker:unaccent(?match1)), "%(name)s")
@@ -648,9 +649,6 @@ class GrlTrackerWrapper(GObject.GObject):
                 || CONTAINS(tracker:case-fold(
                     tracker:unaccent(?match2)), "%(name)s")
                 || CONTAINS(tracker:case-fold(?match2), "%(name)s")
-                || CONTAINS(tracker:case-fold(
-                    tracker:unaccent(?match3)), "%(name)s")
-                || CONTAINS(tracker:case-fold(?match3), "%(name)s")
                 || CONTAINS(tracker:case-fold(
                     tracker:unaccent(?match4)), "%(name)s")
                 || CONTAINS(tracker:case-fold(?match4), "%(name)s")
@@ -663,25 +661,25 @@ class GrlTrackerWrapper(GObject.GObject):
             'name': term
         }
 
-        filter_ids = []
+        artist_filter_ids = []
 
-        def songs_filter(coresong):
-            return coresong.media.get_id() in filter_ids
+        def artist_filter(coreartist):
+            return coreartist.media.get_id() in artist_filter_ids
 
-        def songs_search_cb(source, op_id, media, data, error):
+        def artist_search_cb(source, op_id, media, data, error):
             if error:
                 print("ERROR", error)
                 return
 
             if not media:
-                self._song_search_tracker.set_filter_func(songs_filter)
+                self._artist_search_model.set_filter_func(artist_filter)
                 return
 
-            filter_ids.append(media.get_id())
+            artist_filter_ids.append(media.get_id())
 
         options = self._fast_options.copy()
-
-        self._source.query(query, self.METADATA_KEYS, options, songs_search_cb)
+        self._source.query(
+            query, self.METADATA_KEYS, options, artist_search_cb)
 
         # Album search
 
@@ -735,21 +733,22 @@ class GrlTrackerWrapper(GObject.GObject):
         self._source.query(
             query, self.METADATA_KEYS, options, albums_search_cb)
 
-        # Artist search
+        # Song search
 
         query = """
         SELECT DISTINCT
-            rdf:type(?artist)
-            tracker:id(?artist) AS ?id
+            rdf:type(?song)
+            tracker:id(?song) AS ?id
         WHERE {
-            ?song a nmm:MusicPiece ;
-                    nmm:musicAlbum ?album ;
-                    nmm:performer ?artist .
+            ?song a nmm:MusicPiece .
             BIND(tracker:normalize(
-                nmm:artistName(nmm:albumArtist(?album)), 'nfkd') AS ?match1) .
+                nie:title(nmm:musicAlbum(?song)), 'nfkd') AS ?match1) .
             BIND(tracker:normalize(
                 nmm:artistName(nmm:performer(?song)), 'nfkd') AS ?match2) .
-            BIND(tracker:normalize(nmm:composer(?song), 'nfkd') AS ?match4) .
+            BIND(tracker:normalize(
+                nie:title(?song), 'nfkd') AS ?match3) .
+            BIND(
+                tracker:normalize(nmm:composer(?song), 'nfkd') AS ?match4) .
             FILTER (
                 CONTAINS(tracker:case-fold(
                     tracker:unaccent(?match1)), "%(name)s")
@@ -757,6 +756,9 @@ class GrlTrackerWrapper(GObject.GObject):
                 || CONTAINS(tracker:case-fold(
                     tracker:unaccent(?match2)), "%(name)s")
                 || CONTAINS(tracker:case-fold(?match2), "%(name)s")
+                || CONTAINS(tracker:case-fold(
+                    tracker:unaccent(?match3)), "%(name)s")
+                || CONTAINS(tracker:case-fold(?match3), "%(name)s")
                 || CONTAINS(tracker:case-fold(
                     tracker:unaccent(?match4)), "%(name)s")
                 || CONTAINS(tracker:case-fold(?match4), "%(name)s")
@@ -769,25 +771,25 @@ class GrlTrackerWrapper(GObject.GObject):
             'name': term
         }
 
-        artist_filter_ids = []
+        filter_ids = []
 
-        def artist_filter(coreartist):
-            return coreartist.media.get_id() in artist_filter_ids
+        def songs_filter(coresong):
+            return coresong.media.get_id() in filter_ids
 
-        def artist_search_cb(source, op_id, media, data, error):
+        def songs_search_cb(source, op_id, media, data, error):
             if error:
                 print("ERROR", error)
                 return
 
             if not media:
-                self._artist_search_model.set_filter_func(artist_filter)
+                self._song_search_tracker.set_filter_func(songs_filter)
                 return
 
-            artist_filter_ids.append(media.get_id())
+            filter_ids.append(media.get_id())
 
         options = self._fast_options.copy()
-        self._source.query(
-            query, self.METADATA_KEYS, options, artist_search_cb)
+
+        self._source.query(query, self.METADATA_KEYS, options, songs_search_cb)
 
     def get_album_art_for_item(self, coresong, callback):
         """Placeholder until we got a better solution
diff --git a/gnomemusic/views/searchview.py b/gnomemusic/views/searchview.py
index defe0395..4feaa2c5 100644
--- a/gnomemusic/views/searchview.py
+++ b/gnomemusic/views/searchview.py
@@ -284,6 +284,13 @@ class SearchView(Gtk.Stack):
             return
 
         first_child = self._album_flowbox.get_child_at_index(0)
+        # FIXME: It looks like it is possible that the widget is not
+        # yet created, resulting in a crash with first_child being
+        # None.
+        # Look for a cleaner solution.
+        if first_child is None:
+            return
+
         child_height = first_child.get_allocation().height
         if allocation.height > 1.5 * child_height:
             for i in range(nb_children - 1, -1, -1):


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]