[PATCH 1/2] WIP: groundwork for new sorting API
David Bremner
david at tethera.net
Sun Dec 10 07:49:55 PST 2017
---
lib/notmuch.h | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
lib/query.cc | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 124 insertions(+)
diff --git a/lib/notmuch.h b/lib/notmuch.h
index 39759b7a..ae592e93 100644
--- a/lib/notmuch.h
+++ b/lib/notmuch.h
@@ -773,6 +773,10 @@ notmuch_query_create (notmuch_database_t *database,
* Sort values for notmuch_query_set_sort.
*/
typedef enum {
+ /**
+ * Value was not set
+ */
+ NOTMUCH_SORT_UNSET = -1,
/**
* Oldest first.
*/
@@ -791,6 +795,42 @@ typedef enum {
NOTMUCH_SORT_UNSORTED
} notmuch_sort_t;
+/**
+ * Sort key values for notmuch_query_set_sort_key
+ */
+typedef enum {
+ /**
+ * Do not sort.
+ */
+ NOTMUCH_SORT_KEY_NONE=0,
+ /**
+ * Sort by timestamp (from Date: header)
+ */
+ NOTMUCH_SORT_KEY_TIMESTAMP,
+ /**
+ * Sort by message-id.
+ */
+ NOTMUCH_SORT_KEY_MESSAGE_ID,
+} notmuch_sort_key_t;
+
+/**
+ * Sort type values for notmuch_query_set_sort_type
+ */
+typedef enum {
+ /**
+ * Do not sort.
+ */
+ NOTMUCH_SORT_TYPE_NONE=0,
+ /**
+ * Ascending order
+ */
+ NOTMUCH_SORT_TYPE_ASCENDING,
+ /**
+ * Descending order
+ */
+ NOTMUCH_SORT_TYPE_DESCENDING,
+} notmuch_sort_type_t;
+
/**
* Return the query_string of this query. See notmuch_query_create.
*/
@@ -860,6 +900,32 @@ notmuch_query_set_sort (notmuch_query_t *query, notmuch_sort_t sort);
notmuch_sort_t
notmuch_query_get_sort (const notmuch_query_t *query);
+/**
+ * Specify the sort key for this query.
+ */
+void
+notmuch_query_set_sort_key (notmuch_query_t *query, notmuch_sort_key_t key);
+
+/**
+ * Return the sort_key specified for this query. See
+ * notmuch_query_set_sort_key.
+ */
+notmuch_sort_key_t
+notmuch_query_get_sort_key (const notmuch_query_t *query);
+
+/**
+ * Specify the sort type for this query.
+ */
+void
+notmuch_query_set_sort_type (notmuch_query_t *query, notmuch_sort_type_t type);
+
+/**
+ * Return the sort_type specified for this query. See
+ * notmuch_query_set_sort_type.
+ */
+notmuch_sort_type_t
+notmuch_query_get_sort_type (const notmuch_query_t *query);
+
/**
* Add a tag that will be excluded from the query results by default.
* This exclusion will be ignored if this tag appears explicitly in
diff --git a/lib/query.cc b/lib/query.cc
index d633fa3d..c3b228fb 100644
--- a/lib/query.cc
+++ b/lib/query.cc
@@ -27,6 +27,8 @@ struct _notmuch_query {
notmuch_database_t *notmuch;
const char *query_string;
notmuch_sort_t sort;
+ notmuch_sort_key_t sort_key;
+ notmuch_sort_type_t sort_type;
notmuch_string_list_t *exclude_terms;
notmuch_exclude_t omit_excluded;
bool parsed;
@@ -107,6 +109,9 @@ notmuch_query_create (notmuch_database_t *notmuch,
query->sort = NOTMUCH_SORT_NEWEST_FIRST;
+ query->sort_key = NOTMUCH_SORT_KEY_TIMESTAMP;
+ query->sort_type = NOTMUCH_SORT_TYPE_DESCENDING;
+
query->exclude_terms = _notmuch_string_list_create (query);
query->omit_excluded = NOTMUCH_EXCLUDE_TRUE;
@@ -168,7 +173,33 @@ notmuch_query_set_omit_excluded (notmuch_query_t *query,
void
notmuch_query_set_sort (notmuch_query_t *query, notmuch_sort_t sort)
{
+ /* only for use by _get_sort */
query->sort = sort;
+
+ /* translate to new API */
+ switch (sort) {
+ case NOTMUCH_SORT_UNSET:
+ /* this probably indicates an error, but it seems relatively
+ * harmless, and this code path is deprecated */
+ break;
+ case NOTMUCH_SORT_OLDEST_FIRST:
+ query->sort_key = NOTMUCH_SORT_KEY_TIMESTAMP;
+ query->sort_type = NOTMUCH_SORT_TYPE_ASCENDING;
+ break;
+ case NOTMUCH_SORT_NEWEST_FIRST:
+ query->sort_key = NOTMUCH_SORT_KEY_TIMESTAMP;
+ query->sort_type = NOTMUCH_SORT_TYPE_DESCENDING;
+ break;
+ case NOTMUCH_SORT_MESSAGE_ID:
+ query->sort_key = NOTMUCH_SORT_KEY_MESSAGE_ID;
+ query->sort_type = NOTMUCH_SORT_TYPE_ASCENDING;
+ break;
+ case NOTMUCH_SORT_UNSORTED:
+ query->sort_key = NOTMUCH_SORT_KEY_NONE;
+ query->sort_type = NOTMUCH_SORT_TYPE_NONE;
+ break;
+ }
+
}
notmuch_sort_t
@@ -177,6 +208,32 @@ notmuch_query_get_sort (const notmuch_query_t *query)
return query->sort;
}
+void
+notmuch_query_set_sort_key (notmuch_query_t *query, notmuch_sort_key_t sort_key)
+{
+ query->sort = NOTMUCH_SORT_UNSET;
+ query->sort_key = sort_key;
+}
+
+notmuch_sort_key_t
+notmuch_query_get_sort_key (const notmuch_query_t *query)
+{
+ return query->sort_key;
+}
+
+void
+notmuch_query_set_sort_type (notmuch_query_t *query, notmuch_sort_type_t sort_type)
+{
+ query->sort = NOTMUCH_SORT_UNSET;
+ query->sort_type = sort_type;
+}
+
+notmuch_sort_type_t
+notmuch_query_get_sort_type (const notmuch_query_t *query)
+{
+ return query->sort_type;
+}
+
notmuch_status_t
notmuch_query_add_tag_exclude (notmuch_query_t *query, const char *tag)
{
@@ -331,6 +388,7 @@ _notmuch_query_search_documents (notmuch_query_t *query,
enquire.set_sort_by_value (NOTMUCH_VALUE_MESSAGE_ID, false);
break;
case NOTMUCH_SORT_UNSORTED:
+ case NOTMUCH_SORT_UNSET:
break;
}
--
2.15.0
More information about the notmuch
mailing list