Hi all,
please find updated patch for second order sorting for image collection enclosed. It supports 'new' sorting criteria which were introduced since I provided it first time in 2017. Additionally some minor improvements/fixes went in.

I'm looking forward someone takes this patch over to darktable master. Thanks!

Best Regards,
Robert

Am 30.12.17 um 23:20 schrieb Robert Rembold:
Hi all,

I added some lines to the sorting functionality of image collection and like to share them with you.

In detail, I added second order sorting functionality to image collection. This seems to be most helpful when sorting by rating
 - Example1: sort by GROUP, RATING
 - Example2: sort by COLOR, RATING

Hopefully, this is not yet implemented somewhere in parallel ;)


Best Regards,

Robert


___________________________________________________________________________
darktable developer mailing list
to unsubscribe send a mail to darktable-dev+unsubscr...@lists.darktable.org



___________________________________________________________________________
darktable developer mailing list
to unsubscribe send a mail to darktable-dev+unsubscr...@lists.darktable.org
>From a47fda4b84a8cc778a7c79de2ac27db5bf14d0ed Mon Sep 17 00:00:00 2001
From: RobertR <kont...@rrembold.de>
Date: Sat, 9 Mar 2019 17:37:05 +0100
Subject: [PATCH] Added second order sorting functionality to image collection.
 Most helpful when sorting by rating; example: sort by GROUP, RATING

---
 src/common/collection.c | 184 ++++++++++++++++++++++++++++++++--------
 1 file changed, 147 insertions(+), 37 deletions(-)
 mode change 100644 => 100755 src/common/collection.c

diff --git a/src/common/collection.c b/src/common/collection.c
old mode 100644
new mode 100755
index a81ce38f1..dd0cc30ce
--- a/src/common/collection.c
+++ b/src/common/collection.c
@@ -40,7 +40,7 @@
 
 
 #define SELECT_QUERY "SELECT DISTINCT * FROM %s"
-#define ORDER_BY_QUERY "ORDER BY %s"
+#define ORDER_BY_QUERY "ORDER BY" /*changed format for second order sorting!*/
 #define LIMIT_QUERY "LIMIT ?1, ?2"
 
 static const char *comparators[] = {
@@ -149,6 +149,7 @@ int dt_collection_update(const dt_collection_t *collection)
   uint32_t result;
   gchar *wq, *wq_no_group, *sq, *selq_pre, *selq_post, *query, *query_no_group;
   wq = wq_no_group = sq = selq_pre = selq_post = query = query_no_group = NULL;
+  static dt_collection_sort_t sort_second_order = DT_COLLECTION_SORT_FILENAME;/*remember previous sorting criteria as second order sorting criteria*/
 
   /* build where part */
   gchar *where_ext = dt_collection_get_extended_where(collection, -1);
@@ -214,40 +215,115 @@ int dt_collection_update(const dt_collection_t *collection)
      * This is important, because otherwise it may be impossible to collapse the group again. */
     wq = dt_util_dstrcat(wq, " OR (id = %d)", darktable.gui->expanded_group_id);
   }
-
+  
   /* build select part includes where */
-  if(collection->params.sort == DT_COLLECTION_SORT_COLOR
+  /* COLOR and PATH */
+  if(((collection->params.sort == DT_COLLECTION_SORT_COLOR
+       && sort_second_order == DT_COLLECTION_SORT_PATH)
+       ||(collection->params.sort == DT_COLLECTION_SORT_PATH
+       && sort_second_order == DT_COLLECTION_SORT_COLOR))
+     && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT))
+  {
+    selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT a.id FROM (SELECT * FROM main.images WHERE ");
+    selq_post = dt_util_dstrcat(selq_post, ") AS a LEFT OUTER JOIN main.color_labels AS b ON a.id = b.imgid"
+                                                                        " JOIN (SELECT id AS film_rolls_id, folder FROM main.film_rolls) ON film_id = film_rolls_id");
+  }
+  /* COLOR and TITLE */
+  else if(((collection->params.sort == DT_COLLECTION_SORT_COLOR
+       && sort_second_order == DT_COLLECTION_SORT_TITLE)
+       ||(collection->params.sort == DT_COLLECTION_SORT_TITLE
+       && sort_second_order == DT_COLLECTION_SORT_COLOR))
+     && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT))
+  {
+    selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT a.id FROM (SELECT * FROM main.images WHERE ");
+    selq_post = dt_util_dstrcat(selq_post, ") AS a LEFT OUTER JOIN main.color_labels AS b ON a.id = b.imgid"
+                                                                        " LEFT OUTER JOIN main.meta_data AS m ON a.id = m.id AND m.key = %d",DT_METADATA_XMP_DC_TITLE);
+  }
+  /* COLOR and DESCRIPTION */
+  else if(((collection->params.sort == DT_COLLECTION_SORT_COLOR
+       && sort_second_order == DT_COLLECTION_SORT_DESCRIPTION)
+       ||(collection->params.sort == DT_COLLECTION_SORT_DESCRIPTION
+       && sort_second_order == DT_COLLECTION_SORT_COLOR))
+     && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT))
+  {
+    selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT a.id FROM (SELECT * FROM main.images WHERE ");
+    selq_post = dt_util_dstrcat(selq_post, ") AS a LEFT OUTER JOIN main.color_labels AS b ON a.id = b.imgid"
+                                                                        " LEFT OUTER JOIN main.meta_data AS m ON a.id = m.id AND m.key = %d ",DT_METADATA_XMP_DC_DESCRIPTION);
+  }
+  /* PATH and TITLE */
+  else if(((collection->params.sort == DT_COLLECTION_SORT_TITLE
+       && sort_second_order == DT_COLLECTION_SORT_PATH)
+       ||(collection->params.sort == DT_COLLECTION_SORT_PATH
+       && sort_second_order == DT_COLLECTION_SORT_TITLE))
+     && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT))
+  {
+    selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT a.id FROM (SELECT * FROM main.images WHERE ");
+    selq_post = dt_util_dstrcat(selq_post, ") AS a JOIN (SELECT id AS film_rolls_id, folder FROM main.film_rolls) ON film_id = film_rolls_id"
+                                                                        " LEFT OUTER JOIN main.meta_data AS m ON a.id = m.id AND m.key = %d",DT_METADATA_XMP_DC_TITLE);
+  }
+  /* PATH and DESCRIPTION */
+  else if(((collection->params.sort == DT_COLLECTION_SORT_DESCRIPTION
+       && sort_second_order == DT_COLLECTION_SORT_PATH)
+       ||(collection->params.sort == DT_COLLECTION_SORT_PATH
+       && sort_second_order == DT_COLLECTION_SORT_DESCRIPTION))
+     && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT))
+  {
+    selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT a.id FROM (SELECT * FROM main.images WHERE ");
+    selq_post = dt_util_dstrcat(selq_post, ") AS a JOIN (SELECT id AS film_rolls_id, folder FROM main.film_rolls) ON film_id = film_rolls_id"
+                                                                        " LEFT OUTER JOIN main.meta_data AS m ON a.id = m.id AND m.key = %d",DT_METADATA_XMP_DC_DESCRIPTION);
+  }
+  /* TITLE and DESCRIPTION */
+  else if(((collection->params.sort == DT_COLLECTION_SORT_DESCRIPTION
+       && sort_second_order == DT_COLLECTION_SORT_TITLE)
+       ||(collection->params.sort == DT_COLLECTION_SORT_TITLE
+       && sort_second_order == DT_COLLECTION_SORT_DESCRIPTION))
+     && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT))
+  {
+    selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT a.id FROM (SELECT * FROM main.images WHERE ");
+    selq_post = dt_util_dstrcat(selq_post, ") AS a LEFT OUTER JOIN main.meta_data AS m ON a.id = m.id AND (m.key = %d OR m.key = %d)",DT_METADATA_XMP_DC_TITLE,DT_METADATA_XMP_DC_DESCRIPTION);
+  }
+  /* only COLOR */
+  else if((collection->params.sort == DT_COLLECTION_SORT_COLOR
+      ||sort_second_order == DT_COLLECTION_SORT_COLOR)
      && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT))
   {
-    selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT id FROM (SELECT * FROM main.images WHERE ");
+    selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT a.id FROM (SELECT * FROM main.images WHERE ");
     selq_post = dt_util_dstrcat(selq_post, ") AS a LEFT OUTER JOIN main.color_labels AS b ON a.id = b.imgid");
   }
-  else if(collection->params.sort == DT_COLLECTION_SORT_TITLE
+  /* only PATH */
+  else if((collection->params.sort == DT_COLLECTION_SORT_PATH
+          ||sort_second_order == DT_COLLECTION_SORT_PATH)
           && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT))
   {
     selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT a.id FROM (SELECT * FROM main.images WHERE ");
-    selq_post = dt_util_dstrcat(selq_post, ") AS a LEFT OUTER JOIN main.meta_data AS m ON a.id = m.id AND m.key = %d ",
-                                DT_METADATA_XMP_DC_TITLE);
+    selq_post = dt_util_dstrcat(selq_post, ") AS a JOIN (SELECT id AS film_rolls_id, folder FROM main.film_rolls) ON film_id = film_rolls_id");
   }
-  else if(collection->params.sort == DT_COLLECTION_SORT_DESCRIPTION
+  /* only TITLE */
+  else if((collection->params.sort == DT_COLLECTION_SORT_TITLE
+        ||sort_second_order == DT_COLLECTION_SORT_TITLE)
           && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT))
   {
     selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT a.id FROM (SELECT * FROM main.images WHERE ");
     selq_post = dt_util_dstrcat(selq_post, ") AS a LEFT OUTER JOIN main.meta_data AS m ON a.id = m.id AND m.key = %d ",
-                                DT_METADATA_XMP_DC_DESCRIPTION);
+                                DT_METADATA_XMP_DC_TITLE);
   }
-  else if(collection->params.sort == DT_COLLECTION_SORT_PATH
+  /* only DESCRIPTION */
+  else if((collection->params.sort == DT_COLLECTION_SORT_DESCRIPTION
+        ||sort_second_order == DT_COLLECTION_SORT_DESCRIPTION)
           && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT))
   {
-    selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT id FROM (SELECT * FROM main.images WHERE ");
-    selq_post = dt_util_dstrcat(selq_post, ") AS a JOIN (SELECT id AS film_rolls_id, folder FROM main.film_rolls) ON film_id = film_rolls_id");
+    selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT a.id FROM (SELECT * FROM main.images WHERE ");
+    selq_post = dt_util_dstrcat(selq_post, ") AS a LEFT OUTER JOIN main.meta_data AS m ON a.id = m.id AND m.key = %d ",
+                                DT_METADATA_XMP_DC_DESCRIPTION);
   }
   else if(collection->params.query_flags & COLLECTION_QUERY_USE_ONLY_WHERE_EXT)
     selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT images.id FROM main.images AS a ");
   else
   {
-    selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT id FROM images AS a WHERE ");
+    selq_pre = dt_util_dstrcat(selq_pre, "SELECT DISTINCT a.id FROM images AS a WHERE ");
   }
+  
+  
   /* build sort order part */
   if(!(collection->params.query_flags & COLLECTION_QUERY_USE_ONLY_WHERE_EXT)
      && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT))
@@ -264,6 +340,12 @@ int dt_collection_update(const dt_collection_t *collection)
                         (collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ? " " LIMIT_QUERY : "");
   result = _dt_collection_store(collection, query, query_no_group);
 
+#ifdef _DEBUG
+  printf("SQL Collection for 1st:%d and 2nd:%d: %s\n\n",collection->params.sort,sort_second_order,query);/*only for debugging*/
+#endif
+  
+  if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) sort_second_order=collection->params.sort;/*remember current sort criteria for next time, only update once per collection update*/
+  
   /* free memory used */
   g_free(sq);
   g_free(wq);
@@ -470,57 +552,73 @@ gboolean dt_collection_get_sort_descending(const dt_collection_t *collection)
 gchar *dt_collection_get_sort_query(const dt_collection_t *collection)
 {
   gchar *sq = NULL;
+  static gchar *second_order = NULL;/*remember previous sorting criteria as second order sorting criteria*/
+
+  if(!second_order) second_order = dt_util_dstrcat(NULL, "filename DESC");/*initialize second order*/
 
   if(collection->params.descending)
   {
     switch(collection->params.sort)
     {
       case DT_COLLECTION_SORT_DATETIME:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "datetime_taken DESC, filename DESC, version DESC");
+        sq = dt_util_dstrcat(sq, "%s datetime_taken DESC, %s, filename DESC, version DESC", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "datetime_taken DESC");/*remember current sort criteria for next time, only update once per collection update*/
         break;
 
       case DT_COLLECTION_SORT_RATING:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "flags & 7, filename DESC, version DESC");
+        sq = dt_util_dstrcat(sq, "%s flags & 7, %s, filename DESC, version DESC", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "flags & 7");/*remember current sort criteria for next time, only update once per collection update*/
         break;
 
       case DT_COLLECTION_SORT_FILENAME:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "filename DESC, version DESC");
+        sq = dt_util_dstrcat(sq, "%s filename DESC, %s, version DESC", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "filename DESC");/*remember current sort criteria for next time, only update once per collection update*/
         break;
 
       case DT_COLLECTION_SORT_ID:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "id DESC");
+        sq = dt_util_dstrcat(sq, "%s a.id DESC", ORDER_BY_QUERY); /* makes no sense to consider second order here since ID is unique ;) */
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "a.id DESC");/*remember current sort criteria for next time, only update once per collection update*/
         break;
 
       case DT_COLLECTION_SORT_COLOR:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "color, filename DESC, version DESC");
+        sq = dt_util_dstrcat(sq, "%s color, %s, filename DESC, version DESC", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "color");/*see comments above ;)*/
         break;
 
       case DT_COLLECTION_SORT_GROUP:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "group_id DESC, id-group_id != 0, id DESC");
+        sq = dt_util_dstrcat(sq, "%s group_id DESC, %s, id-group_id != 0, id DESC", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "group_id DESC, id-group_id != 0");
         break;
 
       case DT_COLLECTION_SORT_PATH:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "folder DESC, filename DESC, version DESC");
+        sq = dt_util_dstrcat(sq, "%s folder DESC, filename DESC, %s, version DESC", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "folder DESC, filename DESC");
         break;
 
       case DT_COLLECTION_SORT_CUSTOM_ORDER:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "position DESC, filename DESC, version DESC");
+        sq = dt_util_dstrcat(sq, "%s position DESC, %s, filename DESC, version DESC", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "position DESC");
         break;
 
       case DT_COLLECTION_SORT_TITLE:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "m.value DESC, caption DESC, filename DESC, version DESC");
+        sq = dt_util_dstrcat(sq, "%s m.value DESC, caption DESC, %s, filename DESC, version DESC", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "m.value DESC, caption DESC");
         break;
 
       case DT_COLLECTION_SORT_DESCRIPTION:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "m.value DESC, description DESC, filename DESC, version DESC");
+        sq = dt_util_dstrcat(sq, "%s m.value DESC, description DESC, %s, filename DESC, version DESC", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "m.value DESC, description DESC");
         break;
 
       case DT_COLLECTION_SORT_ASPECT_RATIO:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "aspect_ratio DESC, filename DESC, version DESC");
+        sq = dt_util_dstrcat(sq, "%s aspect_ratio DESC, %s, filename DESC, version DESC", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "aspect_ratio DESC");
         break;
 
+
       case DT_COLLECTION_SORT_SHUFFLE:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "RANDOM()");
+        sq = dt_util_dstrcat(sq, "%s RANDOM()", ORDER_BY_QUERY); /* do not consider second order for shuffle */
+        /* do not remember shuffle for second order */
         break;
 
       case DT_COLLECTION_SORT_NONE:
@@ -533,51 +631,63 @@ gchar *dt_collection_get_sort_query(const dt_collection_t *collection)
     switch(collection->params.sort)
     {
       case DT_COLLECTION_SORT_DATETIME:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "datetime_taken, filename, version");
+        sq = dt_util_dstrcat(sq, "%s datetime_taken, %s, filename, version", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "datetime_taken");/*remember current sort criteria for next time, only update once per collection update*/
         break;
 
       case DT_COLLECTION_SORT_RATING:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "flags & 7 DESC, filename, version");
+        sq = dt_util_dstrcat(sq, "%s flags & 7 DESC, %s, filename, version", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "flags & 7 DESC");
         break;
 
       case DT_COLLECTION_SORT_FILENAME:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "filename, version");
+        sq = dt_util_dstrcat(sq, "%s filename, %s, version", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "filename");
         break;
 
       case DT_COLLECTION_SORT_ID:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "id");
+        sq = dt_util_dstrcat(sq, "%s a.id", ORDER_BY_QUERY); /* makes no sense to consider second order here since ID is unique ;) */
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "a.id");
         break;
 
       case DT_COLLECTION_SORT_COLOR:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "color DESC, filename, version");
+        sq = dt_util_dstrcat(sq, "%s color DESC, %s, filename, version", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "color DESC");
         break;
 
       case DT_COLLECTION_SORT_GROUP:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "group_id, id-group_id != 0, id");
+        sq = dt_util_dstrcat(sq, "%s group_id, %s, id-group_id != 0, id", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "group_id, id-group_id != 0");
         break;
 
       case DT_COLLECTION_SORT_PATH:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "folder, filename, version");
+        sq = dt_util_dstrcat(sq, "%s folder, filename, %s, version", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "folder, filename");
         break;
 
       case DT_COLLECTION_SORT_CUSTOM_ORDER:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "position, filename, version");
+        sq = dt_util_dstrcat(sq, "%s position, %s, filename, version", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "position");
         break;
 
       case DT_COLLECTION_SORT_TITLE:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "m.value, caption, filename, version");
+        sq = dt_util_dstrcat(sq, "%s m.value, caption, %s, filename, version", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "m.value, caption");
         break;
 
       case DT_COLLECTION_SORT_DESCRIPTION:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "m.value, description, filename, version");
+        sq = dt_util_dstrcat(sq, "%s m.value, description, %s, filename, version", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "m.value, description");
         break;
 
       case DT_COLLECTION_SORT_ASPECT_RATIO:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "aspect_ratio, filename, version");
+        sq = dt_util_dstrcat(sq, "%s aspect_ratio, %s, filename, version", ORDER_BY_QUERY, second_order);
+        if( !(collection->params.query_flags & COLLECTION_QUERY_USE_LIMIT) ) second_order = dt_util_dstrcat(NULL, "aspect_ratio");
         break;
 
       case DT_COLLECTION_SORT_SHUFFLE:
-        sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "RANDOM()");
+        sq = dt_util_dstrcat(sq, "%s RANDOM()", ORDER_BY_QUERY); /* do not consider second order for shuffle */
+        /* do not remember shuffle for second order */
         break;
 
       case DT_COLLECTION_SORT_NONE:
-- 
2.19.1

Reply via email to