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 [email protected]
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: