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
diff --git a/src/common/collection.c b/src/common/collection.c index fe31dbb..7ac1d7d 100644 --- a/src/common/collection.c +++ b/src/common/collection.c @@ -39,7 +39,7 @@ #define SELECT_QUERY "SELECT DISTINCT * FROM %s" -#define ORDER_BY_QUERY "ORDER BY" /*changed format!*/ +#define ORDER_BY_QUERY "ORDER BY %s" #define LIMIT_QUERY "LIMIT ?1, ?2" static const char *comparators[] = { @@ -119,7 +119,6 @@ int dt_collection_update(const dt_collection_t *collection) uint32_t result; gchar *wq, *sq, *selq, *query; wq = sq = selq = query = NULL; - static dt_collection_sort_t sort_second_order = DT_COLLECTION_SORT_NONE;/*remember previous sorting criteria as second order sorting criteria*/ /* build where part */ if(!(collection->params.query_flags & COLLECTION_QUERY_USE_ONLY_WHERE_EXT)) @@ -171,33 +170,21 @@ int dt_collection_update(const dt_collection_t *collection) } /* build select part includes where */ - 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 = dt_util_dstrcat(selq, "SELECT DISTINCT id FROM (SELECT * FROM main.images WHERE %s) " - "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", - wq); - else if((collection->params.sort == DT_COLLECTION_SORT_COLOR - ||sort_second_order == DT_COLLECTION_SORT_COLOR) + if(collection->params.sort == DT_COLLECTION_SORT_COLOR && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT)) - selq = dt_util_dstrcat(selq, "SELECT DISTINCT id FROM (SELECT * FROM main.images WHERE %s) " - "AS a LEFT OUTER JOIN main.color_labels AS b ON a.id = b.imgid", + selq = dt_util_dstrcat(selq, "SELECT DISTINCT id FROM (SELECT * FROM main.images WHERE %s) AS a LEFT OUTER " + "JOIN main.color_labels AS b ON a.id = b.imgid", wq); - else if((collection->params.sort == DT_COLLECTION_SORT_PATH - ||sort_second_order == DT_COLLECTION_SORT_PATH) + else if(collection->params.sort == DT_COLLECTION_SORT_PATH && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT)) - selq = dt_util_dstrcat(selq, "SELECT DISTINCT id FROM (SELECT * FROM main.images WHERE %s) " - "JOIN (SELECT id AS film_rolls_id, folder FROM main.film_rolls) ON film_id = film_rolls_id", + selq = dt_util_dstrcat(selq, "SELECT DISTINCT id FROM (SELECT * FROM main.images WHERE %s) JOIN (SELECT id AS " + "film_rolls_id, folder FROM main.film_rolls) ON film_id = film_rolls_id", wq); else if(collection->params.query_flags & COLLECTION_QUERY_USE_ONLY_WHERE_EXT) selq = dt_util_dstrcat(selq, "SELECT DISTINCT images.id FROM main.images %s", wq); else selq = dt_util_dstrcat(selq, "SELECT DISTINCT id FROM main.images WHERE %s", wq); - sort_second_order=collection->params.sort;/*remember current sort criteria for next time*/ /* build sort order part */ @@ -338,59 +325,37 @@ 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(collection->params.descending) { switch(collection->params.sort) { case DT_COLLECTION_SORT_DATETIME: - if(second_order) sq = dt_util_dstrcat(sq, "%s datetime_taken DESC, %s, filename, version", ORDER_BY_QUERY, second_order); - else sq = dt_util_dstrcat(sq, "%s datetime_taken DESC, filename, version", ORDER_BY_QUERY); - - second_order = dt_util_dstrcat(NULL, "datetime_taken DESC"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "datetime_taken DESC, filename, version"); break; case DT_COLLECTION_SORT_RATING: - if(second_order) sq = dt_util_dstrcat(sq, "%s flags & 7, %s, filename, version", ORDER_BY_QUERY, second_order); - else sq = dt_util_dstrcat(sq, "%s flags & 7, filename, version", ORDER_BY_QUERY); - - second_order = dt_util_dstrcat(NULL, "flags & 7"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "flags & 7, filename, version"); break; case DT_COLLECTION_SORT_FILENAME: - if(second_order) sq = dt_util_dstrcat(sq, "%s filename DESC, %s, version", ORDER_BY_QUERY, second_order); - else sq = dt_util_dstrcat(sq, "%s filename DESC, version", ORDER_BY_QUERY); - - second_order = dt_util_dstrcat(NULL, "filename DESC"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "filename DESC, version"); break; case DT_COLLECTION_SORT_ID: - sq = dt_util_dstrcat(sq, "%s id DESC", ORDER_BY_QUERY); /* makes no sense to consider second order here since ID is unique ;) */ - - second_order = dt_util_dstrcat(NULL, "id DESC"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "id DESC"); break; case DT_COLLECTION_SORT_COLOR: - if(second_order) sq = dt_util_dstrcat(sq, "%s color, %s, filename, version", ORDER_BY_QUERY, second_order); - else sq = dt_util_dstrcat(sq, "%s color, filename, version", ORDER_BY_QUERY); - - second_order = dt_util_dstrcat(NULL, "color"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "color, filename, version"); break; case DT_COLLECTION_SORT_GROUP: - if(second_order) sq = dt_util_dstrcat(sq, "%s group_id DESC, %s, id-group_id != 0, id DESC", ORDER_BY_QUERY, second_order); - else sq = dt_util_dstrcat(sq, "%s group_id DESC, id-group_id != 0, id DESC", ORDER_BY_QUERY); - - second_order = dt_util_dstrcat(NULL, "group_id DESC, id-group_id != 0"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "group_id DESC, id-group_id != 0, id DESC"); break; case DT_COLLECTION_SORT_PATH: - if(second_order) sq = dt_util_dstrcat(sq, "%s folder DESC, filename DESC, %s, version", ORDER_BY_QUERY, second_order); - else sq = dt_util_dstrcat(sq, "%s folder DESC, filename DESC, version", ORDER_BY_QUERY); - - second_order = dt_util_dstrcat(NULL, "folder DESC, filename DESC"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "folder DESC, filename DESC, version"); break; case DT_COLLECTION_SORT_NONE: @@ -403,51 +368,31 @@ gchar *dt_collection_get_sort_query(const dt_collection_t *collection) switch(collection->params.sort) { case DT_COLLECTION_SORT_DATETIME: - if(second_order) sq = dt_util_dstrcat(sq, "%s datetime_taken, %s, filename, version", ORDER_BY_QUERY, second_order); - else sq = dt_util_dstrcat(sq, "%s datetime_taken, filename, version", ORDER_BY_QUERY); - - second_order = dt_util_dstrcat(NULL, "datetime_taken"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "datetime_taken, filename, version"); break; case DT_COLLECTION_SORT_RATING: - if(second_order) sq = dt_util_dstrcat(sq, "%s flags & 7 DESC, %s, filename, version", ORDER_BY_QUERY, second_order); - else sq = dt_util_dstrcat(sq, "%s flags & 7 DESC, filename, version", ORDER_BY_QUERY); - - second_order = dt_util_dstrcat(NULL, "flags & 7 DESC"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "flags & 7 DESC, filename, version"); break; case DT_COLLECTION_SORT_FILENAME: - if(second_order) sq = dt_util_dstrcat(sq, "%s filename, %s, version", ORDER_BY_QUERY, second_order); - else sq = dt_util_dstrcat(sq, "%s filename, version", ORDER_BY_QUERY); - - second_order = dt_util_dstrcat(NULL, "filename"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "filename, version"); break; case DT_COLLECTION_SORT_ID: - sq = dt_util_dstrcat(sq, "%s id", ORDER_BY_QUERY); /* makes no sense to consider second order here since ID is unique ;) */ - - second_order = dt_util_dstrcat(NULL, "id"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "id"); break; case DT_COLLECTION_SORT_COLOR: - if(second_order) sq = dt_util_dstrcat(sq, "%s color DESC, %s, filename, version", ORDER_BY_QUERY, second_order); - else sq = dt_util_dstrcat(sq, "%s color DESC, filename, version", ORDER_BY_QUERY); - - second_order = dt_util_dstrcat(NULL, "color DESC"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "color DESC, filename, version"); break; case DT_COLLECTION_SORT_GROUP: - if(second_order) sq = dt_util_dstrcat(sq, "%s group_id, %s, id-group_id != 0, id", ORDER_BY_QUERY, second_order); - else sq = dt_util_dstrcat(sq, "%s group_id, id-group_id != 0, id ", ORDER_BY_QUERY); - - second_order = dt_util_dstrcat(NULL, "group_id, id-group_id != 0"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "group_id, id-group_id != 0, id"); break; case DT_COLLECTION_SORT_PATH: - if(second_order) sq = dt_util_dstrcat(sq, "%s folder, filename, %s, version", ORDER_BY_QUERY, second_order); - else sq = dt_util_dstrcat(sq, "%s folder, filename, version", ORDER_BY_QUERY); - - second_order = dt_util_dstrcat(NULL, "folder, filename"); + sq = dt_util_dstrcat(sq, ORDER_BY_QUERY, "folder, filename, version"); break; case DT_COLLECTION_SORT_NONE: