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:

Reply via email to