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