[rygel] all: Change default sort criteria



commit 0b1f0e2baa53097607869dda51b3c0d3c1084628
Author: Jens Georg <mail jensge org>
Date:   Sun Aug 12 18:21:52 2012 +0200

    all: Change default sort criteria
    
    Move default sort criteria into MediaContainer. This way containers may
    chose to override the default sort order themselves where it makes
    sense, such as album containers.
    
    Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=668376
           https://bugzilla.gnome.org/show_bug.cgi?id=652375

 src/librygel-server/rygel-media-container.vala     |    9 ++++++++-
 src/librygel-server/rygel-media-query-action.vala  |   12 +++++++-----
 .../rygel-searchable-container.vala                |    4 ++--
 src/librygel-server/rygel-simple-container.vala    |    8 ++++----
 src/plugins/external/rygel-external-container.vala |   15 ++++++++-------
 .../external/rygel-external-dummy-container.vala   |    2 +-
 .../rygel-media-export-db-container.vala           |   11 ++++++-----
 .../rygel-media-export-leaf-query-container.vala   |    4 ++--
 .../rygel-media-export-node-query-container.vala   |    2 +-
 .../rygel-media-export-null-container.vala         |    2 +-
 ...rygel-media-export-query-container-factory.vala |    3 +++
 .../rygel-media-export-query-container.vala        |    4 ++--
 .../rygel-media-export-root-container.vala         |    5 +++--
 .../rygel-tracker-category-all-container.vala      |    4 ++--
 .../tracker/rygel-tracker-metadata-values.vala     |   17 +++++++++++------
 .../tracker/rygel-tracker-search-container.vala    |   16 +++++++---------
 tests/rygel-searchable-container-test.vala         |    5 +++--
 17 files changed, 71 insertions(+), 52 deletions(-)
---
diff --git a/src/librygel-server/rygel-media-container.vala b/src/librygel-server/rygel-media-container.vala
index 621f787..d1beb0d 100644
--- a/src/librygel-server/rygel-media-container.vala
+++ b/src/librygel-server/rygel-media-container.vala
@@ -38,6 +38,11 @@ public abstract class Rygel.MediaContainer : MediaObject {
     public const string MUSIC_ARTIST = UPNP_CLASS + ".person.musicArtist";
     public const string MUSIC_GENRE = UPNP_CLASS + ".genre.musicGenre";
 
+    private const string DEFAULT_SORT_CRITERIA = "+upnp:class,+dc:title";
+    public const string ALBUM_SORT_CRITERIA = "+upnp:class," +
+                                              "+upnp:originalTrackNumber," +
+                                              "+dc:title";
+
     /**
      * container_updated signal that is emitted if a child container under the
      * tree of this container gets updated.
@@ -50,6 +55,8 @@ public abstract class Rygel.MediaContainer : MediaObject {
     public uint32 update_id;
     public int64 storage_used;
 
+    public string sort_criteria { set; get; default = DEFAULT_SORT_CRITERIA; }
+
     internal override OCMFlags ocm_flags {
         get {
             if (!(this is WritableContainer) || this.uris.size == 0) {
@@ -113,7 +120,7 @@ public abstract class Rygel.MediaContainer : MediaObject {
      */
     public async abstract MediaObjects? get_children (uint         offset,
                                                       uint         max_count,
-                                                      string       sort_criteria,
+                                                      string?      sort_criteria,
                                                       Cancellable? cancellable)
                                                       throws Error;
 
diff --git a/src/librygel-server/rygel-media-query-action.vala b/src/librygel-server/rygel-media-query-action.vala
index e8606ce..f7b1aa1 100644
--- a/src/librygel-server/rygel-media-query-action.vala
+++ b/src/librygel-server/rygel-media-query-action.vala
@@ -27,8 +27,6 @@ using Gee;
  * Base class of Browse and Search actions.
  */
 internal abstract class Rygel.MediaQueryAction : GLib.Object, StateMachine {
-    private const string DEFAULT_SORT_CRITERIA = "+dc:title";
-
     // In arguments
     public string object_id;
     public string browse_flag;
@@ -125,11 +123,11 @@ internal abstract class Rygel.MediaQueryAction : GLib.Object, StateMachine {
         this.index = (uint) index;
         this.requested_count = (uint) requested_count;
 
-        if (this.sort_criteria == null || this.sort_criteria == "") {
-            this.sort_criteria = DEFAULT_SORT_CRITERIA;
+        if (this.sort_criteria == "") {
+            this.sort_criteria = null;
         }
 
-        if (this.hacks != null) {
+        if (this.hacks != null && this.sort_criteria != null) {
             hacks.filter_sort_criteria (ref this.sort_criteria);
         }
 
@@ -141,6 +139,10 @@ internal abstract class Rygel.MediaQueryAction : GLib.Object, StateMachine {
     }
 
     private void validate_sort_criteria () throws Error {
+        if (this.sort_criteria == null) {
+            return;
+        }
+
         var supported_props = new HashSet<string> ();
 
         var requested_sort_props = this.sort_criteria.split (",");
diff --git a/src/librygel-server/rygel-searchable-container.vala b/src/librygel-server/rygel-searchable-container.vala
index 2d09c2e..8dd5e5d 100644
--- a/src/librygel-server/rygel-searchable-container.vala
+++ b/src/librygel-server/rygel-searchable-container.vala
@@ -39,13 +39,13 @@ public interface Rygel.SearchableContainer : MediaContainer {
      * @param total_matches sets it to the actual number of objects that satisfy
      * @param cancellable optional cancellable for this operation.
      *
-     * @return yaddayadda
+     * @return A list of matching media objects or null if no object matched.
      */
     public abstract async MediaObjects? search (SearchExpression? expression,
                                                 uint              offset,
                                                 uint              max_count,
                                                 out uint          total_matches,
-                                                string            sort_criteria,
+                                                string?           sort_criteria,
                                                 Cancellable?      cancellable)
                                                 throws Error;
 
diff --git a/src/librygel-server/rygel-simple-container.vala b/src/librygel-server/rygel-simple-container.vala
index bb7d18b..dcb006b 100644
--- a/src/librygel-server/rygel-simple-container.vala
+++ b/src/librygel-server/rygel-simple-container.vala
@@ -124,7 +124,7 @@ public class Rygel.SimpleContainer : Rygel.MediaContainer,
     public override async MediaObjects? get_children (
                                                      uint         offset,
                                                      uint         max_count,
-                                                     string       sort_criteria,
+                                                     string?      sort_criteria,
                                                      Cancellable? cancellable)
                                                      throws Error {
         uint stop = offset + max_count;
@@ -132,7 +132,7 @@ public class Rygel.SimpleContainer : Rygel.MediaContainer,
 
         var sorted_children = this.children.slice (0, this.child_count)
                                         as MediaObjects;
-        sorted_children.sort_by_criteria (sort_criteria);
+        sorted_children.sort_by_criteria (sort_criteria ?? this.sort_criteria);
 
         return sorted_children.slice ((int) offset, (int) stop)
                                         as MediaObjects;
@@ -195,14 +195,14 @@ public class Rygel.SimpleContainer : Rygel.MediaContainer,
                                        uint              offset,
                                        uint              max_count,
                                        out uint          total_matches,
-                                       string            sort_criteria,
+                                       string?           sort_criteria,
                                        Cancellable?      cancellable)
                                        throws Error {
         return yield this.simple_search (expression,
                                          offset,
                                          max_count,
                                          out total_matches,
-                                         sort_criteria,
+                                         sort_criteria ?? this.sort_criteria,
                                          cancellable);
     }
 
diff --git a/src/plugins/external/rygel-external-container.vala b/src/plugins/external/rygel-external-container.vala
index e1e183d..61f6882 100644
--- a/src/plugins/external/rygel-external-container.vala
+++ b/src/plugins/external/rygel-external-container.vala
@@ -77,7 +77,7 @@ public class Rygel.External.Container : Rygel.MediaContainer,
     public override async MediaObjects? get_children (
                                                      uint         offset,
                                                      uint         max_count,
-                                                     string       sort_criteria,
+                                                     string?      sort_criteria,
                                                      Cancellable? cancellable)
                                                      throws GLib.Error {
         string[] filter = {};
@@ -107,16 +107,17 @@ public class Rygel.External.Container : Rygel.MediaContainer,
                                        uint              offset,
                                        uint              max_count,
                                        out uint          total_matches,
-                                       string            sort_criteria,
+                                       string?           sort_criteria,
                                        Cancellable?      cancellable)
                                        throws GLib.Error {
+        var real_sort_criteria = sort_criteria ?? this.sort_criteria;
         if (expression == null || !this.searchable) {
             // Either its wildcard or backend doesn't implement search :(
             return yield this.simple_search (expression,
                                              offset,
                                              max_count,
                                              out total_matches,
-                                             sort_criteria,
+                                             real_sort_criteria,
                                              cancellable);
         }
 
@@ -144,7 +145,7 @@ public class Rygel.External.Container : Rygel.MediaContainer,
         var objects = yield this.create_media_objects (result);
 
         // FIXME: Delegate sorting to remote peer
-        objects.sort_by_criteria (sort_criteria);
+        objects.sort_by_criteria (real_sort_criteria);
 
         return objects;
     }
@@ -229,9 +230,9 @@ public class Rygel.External.Container : Rygel.MediaContainer,
     }
 
     private async MediaObjects create_media_objects
-                                        (HashTable<string,Variant>[] all_props,
-                                         MediaContainer?             parent
-                                         = null) throws GLib.Error {
+                                   (HashTable<string, Variant>[] all_props,
+                                    MediaContainer?              parent = null)
+                                    throws GLib.Error {
         var media_objects = new MediaObjects ();
 
         foreach (var props in all_props) {
diff --git a/src/plugins/external/rygel-external-dummy-container.vala b/src/plugins/external/rygel-external-dummy-container.vala
index b1ba379..ae0d0fd 100644
--- a/src/plugins/external/rygel-external-dummy-container.vala
+++ b/src/plugins/external/rygel-external-dummy-container.vala
@@ -41,7 +41,7 @@ internal class Rygel.External.DummyContainer : MediaContainer {
     public override async MediaObjects? get_children (
                                                      uint         offset,
                                                      uint         max_count,
-                                                     string       sort_criteria,
+                                                     string?      sort_criteria,
                                                      Cancellable? cancellable)
                                                      throws Error {
         return new MediaObjects ();
diff --git a/src/plugins/media-export/rygel-media-export-db-container.vala b/src/plugins/media-export/rygel-media-export-db-container.vala
index 61141a2..5db2a61 100644
--- a/src/plugins/media-export/rygel-media-export-db-container.vala
+++ b/src/plugins/media-export/rygel-media-export-db-container.vala
@@ -50,11 +50,11 @@ public class Rygel.MediaExport.DBContainer : MediaContainer,
     public override async MediaObjects? get_children (
                                                      uint         offset,
                                                      uint         max_count,
-                                                     string       sort_criteria,
+                                                     string?      sort_criteria,
                                                      Cancellable? cancellable)
                                                      throws GLib.Error {
         return this.media_db.get_children (this,
-                                           sort_criteria,
+                                           sort_criteria ?? this.sort_criteria,
                                            offset,
                                            max_count);
     }
@@ -63,15 +63,16 @@ public class Rygel.MediaExport.DBContainer : MediaContainer,
                                                uint              offset,
                                                uint              max_count,
                                                out uint          total_matches,
-                                               string            sort_criteria,
+                                               string?           sort_criteria,
                                                Cancellable?      cancellable)
                                                throws GLib.Error {
         MediaObjects children = null;
+        var real_sort_criteria = sort_criteria ?? this.sort_criteria;
 
         try {
             children = this.media_db.get_objects_by_search_expression
                                         (expression,
-                                         sort_criteria,
+                                         real_sort_criteria,
                                          this.id,
                                          offset,
                                          max_count,
@@ -82,7 +83,7 @@ public class Rygel.MediaExport.DBContainer : MediaContainer,
                                                      offset,
                                                      max_count,
                                                      out total_matches,
-                                                     sort_criteria,
+                                                     real_sort_criteria,
                                                      cancellable);
             } else {
                 throw error;
diff --git a/src/plugins/media-export/rygel-media-export-leaf-query-container.vala b/src/plugins/media-export/rygel-media-export-leaf-query-container.vala
index bd82a88..cb88e7b 100644
--- a/src/plugins/media-export/rygel-media-export-leaf-query-container.vala
+++ b/src/plugins/media-export/rygel-media-export-leaf-query-container.vala
@@ -29,7 +29,7 @@ internal class Rygel.MediaExport.LeafQueryContainer : QueryContainer {
     public override async MediaObjects? get_children
                                         (uint         offset,
                                          uint         max_count,
-                                         string       sort_criteria,
+                                         string?      sort_criteria,
                                          Cancellable? cancellable)
                                          throws GLib.Error {
         uint total_matches;
@@ -37,7 +37,7 @@ internal class Rygel.MediaExport.LeafQueryContainer : QueryContainer {
                                           offset,
                                           max_count,
                                           out total_matches,
-                                          sort_criteria,
+                                          sort_criteria ?? this.sort_criteria,
                                           cancellable);
         foreach (var child in children) {
             child.parent = this;
diff --git a/src/plugins/media-export/rygel-media-export-node-query-container.vala b/src/plugins/media-export/rygel-media-export-node-query-container.vala
index 1d40084..c181fdb 100644
--- a/src/plugins/media-export/rygel-media-export-node-query-container.vala
+++ b/src/plugins/media-export/rygel-media-export-node-query-container.vala
@@ -46,7 +46,7 @@ internal class Rygel.MediaExport.NodeQueryContainer : QueryContainer {
     public override async MediaObjects? get_children
                                         (uint         offset,
                                          uint         max_count,
-                                         string       sort_criteria,
+                                         string?      sort_criteria,
                                          Cancellable? cancellable)
                                          throws GLib.Error {
         var children = new MediaObjects ();
diff --git a/src/plugins/media-export/rygel-media-export-null-container.vala b/src/plugins/media-export/rygel-media-export-null-container.vala
index 6309fbc..60149e3 100644
--- a/src/plugins/media-export/rygel-media-export-null-container.vala
+++ b/src/plugins/media-export/rygel-media-export-null-container.vala
@@ -33,7 +33,7 @@ internal class Rygel.NullContainer : MediaContainer {
     public override async MediaObjects? get_children (
                                                      uint         offset,
                                                      uint         max_count,
-                                                     string       sort_criteria,
+                                                     string?      sort_criteria,
                                                      Cancellable? cancellable)
                                                      throws Error {
         return new MediaObjects ();
diff --git a/src/plugins/media-export/rygel-media-export-query-container-factory.vala b/src/plugins/media-export/rygel-media-export-query-container-factory.vala
index cc1075c..c2120a6 100644
--- a/src/plugins/media-export/rygel-media-export-query-container-factory.vala
+++ b/src/plugins/media-export/rygel-media-export-query-container-factory.vala
@@ -144,6 +144,9 @@ internal class Rygel.MediaExport.QueryContainerFactory : Object {
 
         if (upnp_class != null) {
             container.upnp_class = upnp_class;
+            if (upnp_class == MediaContainer.MUSIC_ALBUM) {
+                container.sort_criteria = MediaContainer.ALBUM_SORT_CRITERIA;
+            }
         }
 
         return container;
diff --git a/src/plugins/media-export/rygel-media-export-query-container.vala b/src/plugins/media-export/rygel-media-export-query-container.vala
index 99f77cd..abe635e 100644
--- a/src/plugins/media-export/rygel-media-export-query-container.vala
+++ b/src/plugins/media-export/rygel-media-export-query-container.vala
@@ -49,7 +49,7 @@ internal abstract class Rygel.MediaExport.QueryContainer : DBContainer {
                                                 uint              offset,
                                                 uint              max_count,
                                                 out uint          total_matches,
-                                                string            sort_criteria,
+                                                string?           sort_criteria,
                                                 Cancellable?      cancellable)
                                                 throws GLib.Error {
         MediaObjects children = null;
@@ -70,7 +70,7 @@ internal abstract class Rygel.MediaExport.QueryContainer : DBContainer {
             children = this.media_db.get_objects_by_search_expression
                                         (combined_expression,
                                          null,
-                                         sort_criteria,
+                                         sort_criteria ?? this.sort_criteria,
                                          offset,
                                          max_count,
                                          out total_matches);
diff --git a/src/plugins/media-export/rygel-media-export-root-container.vala b/src/plugins/media-export/rygel-media-export-root-container.vala
index 753e72f..ffe359f 100644
--- a/src/plugins/media-export/rygel-media-export-root-container.vala
+++ b/src/plugins/media-export/rygel-media-export-root-container.vala
@@ -139,7 +139,7 @@ public class Rygel.MediaExport.RootContainer : Rygel.MediaExport.DBContainer {
                                                 uint              offset,
                                                 uint              max_count,
                                                 out uint          total_matches,
-                                                string            sort_criteria,
+                                                string?           sort_criteria,
                                                 Cancellable?      cancellable)
                                                 throws GLib.Error {
          if (expression == null) {
@@ -167,9 +167,10 @@ public class Rygel.MediaExport.RootContainer : Rygel.MediaExport.DBContainer {
         }
 
         if (query_container != null) {
+            var real_sort_criteria = sort_criteria ?? this.sort_criteria;
             list = yield query_container.get_children (offset,
                                                        max_count,
-                                                       sort_criteria,
+                                                       real_sort_criteria,
                                                        cancellable);
             total_matches = query_container.child_count;
 
diff --git a/src/plugins/tracker/rygel-tracker-category-all-container.vala b/src/plugins/tracker/rygel-tracker-category-all-container.vala
index a1a1185..d3d0e36 100644
--- a/src/plugins/tracker/rygel-tracker-category-all-container.vala
+++ b/src/plugins/tracker/rygel-tracker-category-all-container.vala
@@ -103,14 +103,14 @@ public class Rygel.Tracker.CategoryAllContainer : SearchContainer,
                                        uint              offset,
                                        uint              max_count,
                                        out uint          total_matches,
-                                       string            sort_criteria,
+                                       string?           sort_criteria,
                                        Cancellable?      cancellable)
                                        throws Error {
         return yield this.simple_search (expression,
                                          offset,
                                          max_count,
                                          out total_matches,
-                                         sort_criteria,
+                                         sort_criteria ?? this.sort_criteria,
                                          cancellable);
     }
 
diff --git a/src/plugins/tracker/rygel-tracker-metadata-values.vala b/src/plugins/tracker/rygel-tracker-metadata-values.vala
index 73be88b..84e3679 100644
--- a/src/plugins/tracker/rygel-tracker-metadata-values.vala
+++ b/src/plugins/tracker/rygel-tracker-metadata-values.vala
@@ -75,12 +75,17 @@ public abstract class Rygel.Tracker.MetadataValues : MetadataContainer {
         var filter = this.create_filter (property, value);
         filters.add (filter);
 
-        return new SearchContainer (id,
-                                    this,
-                                    title,
-                                    this.item_factory,
-                                    child_triplets,
-                                    filters);
+        var child = new SearchContainer (id,
+                                         this,
+                                         title,
+                                         this.item_factory,
+                                         child_triplets,
+                                         filters);
+        if (this.property == "upnp:album") {
+            child.sort_criteria = MediaContainer.ALBUM_SORT_CRITERIA;
+        }
+
+        return child;
     }
 }
 
diff --git a/src/plugins/tracker/rygel-tracker-search-container.vala b/src/plugins/tracker/rygel-tracker-search-container.vala
index 29ed77c..ea3e3c0 100644
--- a/src/plugins/tracker/rygel-tracker-search-container.vala
+++ b/src/plugins/tracker/rygel-tracker-search-container.vala
@@ -35,8 +35,6 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
     /* class-wide constants */
     private const string MODIFIED_PROPERTY = "nfo:fileLastModified";
 
-    private string sort_criteria = "";
-
     public SelectionQuery query;
     public ItemFactory item_factory;
 
@@ -109,7 +107,7 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
 
     public override async MediaObjects? get_children (uint       offset,
                                                       uint       max_count,
-                                                      string     sort_criteria,
+                                                      string?    sort_criteria,
                                                       Cancellable? cancellable)
                                                       throws GLib.Error {
         var expression = new RelationalExpression ();
@@ -119,9 +117,8 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
 
         uint total_matches;
 
-        this.sort_criteria = sort_criteria;
-
         return yield this.execute_query (expression,
+                                         sort_criteria ?? this.sort_criteria,
                                          offset,
                                          max_count,
                                          out total_matches,
@@ -129,6 +126,7 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
     }
 
     public async MediaObjects? execute_query (SearchExpression? expression,
+                                              string?           sort_criteria,
                                               uint              offset,
                                               uint              max_count,
                                               out uint          total_matches,
@@ -139,7 +137,7 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
         var query = this.create_query (expression as RelationalExpression,
                                        (int) offset,
                                        (int) max_count,
-                                       this.sort_criteria);
+                                       sort_criteria);
 
         if (query != null) {
             yield query.execute (this.resources);
@@ -177,6 +175,7 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
 
         uint total_matches;
         var results = yield this.execute_query (expression,
+                                                null,
                                                 0,
                                                 1,
                                                 out total_matches,
@@ -251,7 +250,7 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
         if (sort_criteria == null || sort_criteria == "") {
             query = new SelectionQuery.clone (this.query);
         } else {
-            query = create_sorted_query ();
+            query = create_sorted_query (sort_criteria);
         }
 
         if (expression.operand1 == "@parentID") {
@@ -269,12 +268,11 @@ public class Rygel.Tracker.SearchContainer : SimpleContainer {
 
         query.offset = offset;
         query.max_count = max_count;
-        this.sort_criteria = "";
 
         return query;
     }
 
-    private SelectionQuery? create_sorted_query () {
+    private SelectionQuery? create_sorted_query (string sort_criteria) {
          var key_chain_map = UPnPPropertyMap.get_property_map ();
          var sort_props = sort_criteria.split (",");
          string order = "";
diff --git a/tests/rygel-searchable-container-test.vala b/tests/rygel-searchable-container-test.vala
index 3490479..8268edf 100644
--- a/tests/rygel-searchable-container-test.vala
+++ b/tests/rygel-searchable-container-test.vala
@@ -41,6 +41,7 @@ public class MediaObject : Object {
 }
 
 public class MediaContainer : MediaObject {
+    public string sort_criteria = "+dc:title";
     public uint child_count = 10;
     public async MediaObjects? get_children (
                                             uint offset,
@@ -112,14 +113,14 @@ public class TestContainer : MediaContainer, Rygel.SearchableContainer {
                                        uint              offset,
                                        uint              max_count,
                                        out uint          total_matches,
-                                       string            sort_criteria,
+                                       string?           sort_criteria,
                                        Cancellable?      cancellable)
                                        throws Error {
         return yield this.simple_search (expression,
                                          offset,
                                          max_count,
                                          out total_matches,
-                                         sort_criteria,
+                                         sort_criteria ?? this.sort_criteria,
                                          cancellable);
     }
 



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