[gnome-music] query: Rework artists query



commit cf4acf657b0d60b54c5eb304b5d5a77e794bd334
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Dec 30 00:33:44 2015 +0100

    query: Rework artists query
    
    Similarly to the albums query, this query turns out simpler by
    doing it as a query grouped by album. The same simplifications
    apply.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=759587

 gnomemusic/query.py |  168 +++++++++------------------------------------------
 1 files changed, 28 insertions(+), 140 deletions(-)
---
diff --git a/gnomemusic/query.py b/gnomemusic/query.py
index 0d75d96..c338da1 100644
--- a/gnomemusic/query.py
+++ b/gnomemusic/query.py
@@ -169,152 +169,40 @@ class Query():
     @staticmethod
     def artists(where_clause):
         query = '''
-    SELECT DISTINCT
+    SELECT
         rdf:type(?album)
         tracker:id(?album) AS id
-        (
-            SELECT
-                nmm:artistName(?artist)
-            WHERE {
-                ?album nmm:albumArtist ?artist
-            }
-            LIMIT 1
-        ) AS artist
-        nie:title(?album) AS title
-        nie:title(?album) AS album
-        tracker:coalesce(
-            (
-                SELECT
-                    GROUP_CONCAT(
-                        nmm:artistName(?artist),
-                        ','
-                    )
-                WHERE {
-                    ?album nmm:albumArtist ?artist
-                }
-            ),
-            (
-                SELECT
-                    GROUP_CONCAT(
-                        (
-                            SELECT
-                                nmm:artistName(nmm:performer(?_12)) AS perf
-                            WHERE {
-                                ?_12 nmm:musicAlbum ?album
-                                FILTER (
-                                    tracker:uri-is-descendant(
-                                        '%(music_dir)s', nie:url(?_12)
-                                    ) ||
-                                    tracker:uri-is-descendant(
-                                        '%(download_dir)s', nie:url(?_12)
-                                    )
-                                )
-                                FILTER (
-                                    NOT EXISTS {
-                                        ?_12 a nmm:Video
-                                    } &&
-                                    NOT EXISTS {
-                                        ?_12 a nmm:Playlist
-                                    }
-                                )
-                            }
-                            GROUP BY ?perf
-                        ),
-                        ','
-                    ) AS album_performer
-                WHERE {
-                }
-            )
-        ) AS author
-        xsd:integer(
-            tracker:coalesce(
-                nmm:albumTrackCount(?album),
-                (
-                    SELECT
-                        COUNT(?_1)
-                    WHERE {
-                        ?_1 nmm:musicAlbum ?album ;
-                        tracker:available 'true'
-                        FILTER (
-                            tracker:uri-is-descendant(
-                                '%(music_dir)s', nie:url(?_1)
-                            ) ||
-                            tracker:uri-is-descendant(
-                                '%(download_dir)s', nie:url(?_1)
-                            )
-                        )
-                        FILTER (
-                            NOT EXISTS {
-                                ?_1 a nmm:Video
-                            } &&
-                            NOT EXISTS {
-                                ?_1 a nmm:Playlist
-                            }
-                        )
-                    }
-                )
-            )
-        ) AS childcount
-        (
-            SELECT
-                fn:year-from-dateTime(?c)
-            WHERE {
-                ?_2 nmm:musicAlbum ?album ;
-                    nie:contentCreated ?c ;
-                    tracker:available 'true'
-                FILTER (
-                    tracker:uri-is-descendant(
-                        '%(music_dir)s', nie:url(?_2)
-                    ) ||
-                    tracker:uri-is-descendant(
-                        '%(download_dir)s', nie:url(?_2)
-                    )
-                )
-                FILTER (
-                    NOT EXISTS {
-                        ?_2 a nmm:Video
-                    } &&
-                    NOT EXISTS {
-                        ?_2 a nmm:Playlist
-                    }
-                )
-            }
-            LIMIT 1
-        ) AS creation-date
-        {
-            %(where_clause)s
-            FILTER (
-                EXISTS {
-                    ?_3 nmm:musicAlbum ?album ;
-                        tracker:available 'true'
-                    FILTER (
-                        tracker:uri-is-descendant(
-                            '%(music_dir)s', nie:url(?_3)
-                        ) ||
-                        tracker:uri-is-descendant(
-                            '%(download_dir)s', nie:url(?_3)
-                        )
-                    )
-                    FILTER (
-                        NOT EXISTS {
-                            ?_3 a nmm:Video
-                        } &&
-                        NOT EXISTS {
-                            ?_3 a nmm:Playlist
-                        }
-                    )
-                }
-            )
-        }
-    ORDER BY %(artist_order)s
-        ?albumyear
-        %(album_order)s
+        ?author
+        ?title
+        tracker:coalesce((SELECT GROUP_CONCAT(nmm:artistName(?albumArtist), ',') { ?album nmm:albumArtist 
?albumArtist }),
+                         (SELECT GROUP_CONCAT(nmm:artistName(?performer), ',') { ?song nmm:performer 
?performer })) AS ?performer
+        COUNT(?song) AS ?childcount
+        YEAR(MAX(nie:contentCreated(?song))) AS ?creation_date
+    {
+        %(where_clause)s
+        ?album a nmm:MusicAlbum ;
+               nmm:albumArtist ?albumArtist ;
+               nie:title ?title .
+        ?albumArtist nmm:artistName ?author .
+        ?song nmm:musicAlbum ?album ;
+              nmm:performer ?performer .
+
+        BIND(LCASE(?author) AS ?author_lower) .
+        BIND(LCASE(?title) AS ?title_lower) .
+        BIND((%(artist_order)s) AS ?artist_collation) .
+        BIND((%(album_order)s) AS ?title_collation) .
+
+        FILTER(STRSTARTS(nie:url(?song), '%(download_dir)s/') ||
+               STRSTARTS(nie:url(?song), '%(music_dir)s/'))
+    }
+    GROUP BY ?album
+    ORDER BY ?artist_collation ?creation_date ?album_collation
     '''.replace('\n', ' ').strip() % {
             'where_clause': where_clause.replace('\n', ' ').strip(),
             'music_dir': Query.MUSIC_URI,
             'download_dir': Query.DOWNLOAD_URI,
-            'artist_order': Query.order_by_statement("?author"),
-            'album_order': Query.order_by_statement("nie:title(?album)")
+            'artist_order': Query.order_by_statement("?author_lower"),
+            'album_order': Query.order_by_statement("?title_lower")
         }
 
         return query


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