[PATCH 03/11] lib: define notmuch_query_create_sexpr

Subject: [PATCH 03/11] lib: define notmuch_query_create_sexpr

Date: Tue, 13 Jul 2021 21:02:31 -0300

To: notmuch@notmuchmail.org

Cc: David Bremner

From: David Bremner


Set the parsing syntax when the (notmuch) query object is
created. Initially the library always returns a trivial query that
matches all messages.
---
 lib/notmuch.h |  4 ++++
 lib/query.cc  | 49 +++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/lib/notmuch.h b/lib/notmuch.h
index 3b28bea3..a9abdd18 100644
--- a/lib/notmuch.h
+++ b/lib/notmuch.h
@@ -961,6 +961,10 @@ notmuch_query_t *
 notmuch_query_create (notmuch_database_t *database,
 		      const char *query_string);
 
+notmuch_query_t *
+notmuch_query_create_sexpr (notmuch_database_t *database,
+			    const char *query_string);
+
 /**
  * Sort values for notmuch_query_set_sort.
  */
diff --git a/lib/query.cc b/lib/query.cc
index 39b85e91..9d2b6e50 100644
--- a/lib/query.cc
+++ b/lib/query.cc
@@ -23,6 +23,13 @@
 
 #include <glib.h> /* GHashTable, GPtrArray */
 
+#include "sexp.h"
+
+typedef enum {
+    NOTMUCH_QUERY_SYNTAX_XAPIAN,
+    NOTMUCH_QUERY_SYNTAX_SEXPR,
+} notmuch_query_syntax_t;
+
 struct _notmuch_query {
     notmuch_database_t *notmuch;
     const char *query_string;
@@ -30,6 +37,7 @@ struct _notmuch_query {
     notmuch_string_list_t *exclude_terms;
     notmuch_exclude_t omit_excluded;
     bool parsed;
+    notmuch_query_syntax_t syntax;
     Xapian::Query xapian_query;
     std::set<std::string> terms;
 };
@@ -126,15 +134,29 @@ notmuch_query_create (notmuch_database_t *notmuch,
     if (! query)
 	return NULL;
 
+    query->syntax = NOTMUCH_QUERY_SYNTAX_XAPIAN;
+
     return query;
 }
 
-static notmuch_status_t
-_notmuch_query_ensure_parsed (notmuch_query_t *query)
+notmuch_query_t *
+notmuch_query_create_sexpr (notmuch_database_t *notmuch,
+			    const char *query_string)
 {
-    if (query->parsed)
-	return NOTMUCH_STATUS_SUCCESS;
 
+    notmuch_query_t *query = _notmuch_query_constructor (notmuch, query_string);
+
+    if (! query)
+	return NULL;
+
+    query->syntax = NOTMUCH_QUERY_SYNTAX_SEXPR;
+
+    return query;
+}
+
+static notmuch_status_t
+_notmuch_query_ensure_parsed_xapian (notmuch_query_t *query)
+{
     try {
 	query->xapian_query =
 	    query->notmuch->query_parser->
@@ -167,6 +189,25 @@ _notmuch_query_ensure_parsed (notmuch_query_t *query)
     return NOTMUCH_STATUS_SUCCESS;
 }
 
+static notmuch_status_t
+_notmuch_query_ensure_parsed_sexpr (notmuch_query_t *query)
+{
+    query->xapian_query = Xapian::Query::MatchAll;
+    return NOTMUCH_STATUS_SUCCESS;
+}
+
+static notmuch_status_t
+_notmuch_query_ensure_parsed (notmuch_query_t *query)
+{
+    if (query->parsed)
+	return NOTMUCH_STATUS_SUCCESS;
+
+    if (query->syntax == NOTMUCH_QUERY_SYNTAX_SEXPR)
+	return _notmuch_query_ensure_parsed_sexpr (query);
+
+    return _notmuch_query_ensure_parsed_xapian (query);
+}
+
 const char *
 notmuch_query_get_query_string (const notmuch_query_t *query)
 {
-- 
2.30.2
_______________________________________________
notmuch mailing list -- notmuch@notmuchmail.org
To unsubscribe send an email to notmuch-leave@notmuchmail.org

Thread: