[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] scratch/gnus-search 31514a0 04/30: Add function gnus-searc
From: |
Eric Abrahamsen |
Subject: |
[Emacs-diffs] scratch/gnus-search 31514a0 04/30: Add function gnus-search-prepare-query |
Date: |
Thu, 1 Jun 2017 03:50:19 -0400 (EDT) |
branch: scratch/gnus-search
commit 31514a043a700d03b5059e7120fc4e8d37185761
Author: Eric Abrahamsen <address@hidden>
Commit: Eric Abrahamsen <address@hidden>
Add function gnus-search-prepare-query
* lisp/gnus/gnus-search.el (gnus-search-prepare-query): Check for
"top-level" meta search keys and parse them into the query
structure, alongside the query itself.
---
lisp/gnus/gnus-search.el | 65 ++++++++++++++++++++++++++++++++++++++----------
1 file changed, 52 insertions(+), 13 deletions(-)
diff --git a/lisp/gnus/gnus-search.el b/lisp/gnus/gnus-search.el
index f4923ef..e2353a6 100644
--- a/lisp/gnus/gnus-search.el
+++ b/lisp/gnus/gnus-search.el
@@ -1852,32 +1852,71 @@ Returns a vector of [group name, file name, score]
vectors."
;; search can be run in its own thread, allowing concurrent searches
;; of multiple backends. At present this causes problems when
;; multiple IMAP servers are searched at the same time, apparently
- ;; because the threads are somehow fighting for control, or the
- ;; `nntp-server-buffer' variable is getting clobbered, or something
- ;; else.
+ ;; because the `nntp-server-buffer' variable is getting clobbered,
+ ;; or something. Anyway, that's the reason for the `mapc'.
(let* ((results [])
(q-spec (alist-get 'search-query-spec specs))
- (unparsed-query (alist-get 'query q-spec))
- (prepped-query (if (and gnus-search-use-parsed-queries
- (null (alist-get 'no-parse q-spec)))
- (gnus-search-parse-query unparsed-query)
- unparsed-query)))
+ (query (alist-get 'query q-spec))
+ ;; If the query is already a sexp, just leave it alone.
+ (prepared-query (when (stringp query)
+ (gnus-search-prepare-query q-spec))))
(mapc
(lambda (x)
(let* ((server (car x))
(search-engine (gnus-search-server-to-engine server))
- (groups (cadr x))
- (use-query (if (slot-value search-engine 'raw-queries-p)
- unparsed-query
- prepped-query)))
+ (groups (cadr x)))
+ ;; Give the search engine a chance to say it wants raw search
+ ;; queries. If SPECS was passed in with an already-parsed
+ ;; query, that's tough luck for the engine.
+ (setf (alist-get 'query prepared-query)
+ (if (slot-value search-engine 'raw-queries-p)
+ query
+ (alist-get 'query prepared-query)))
(setq results
(vconcat
(gnus-search-run-search
- search-engine server use-query groups)
+ search-engine server prepared-query groups)
results))))
(alist-get 'search-group-spec specs))
results))
+(defun gnus-search-prepare-query (query-spec)
+ "Accept a search query in raw format, and return a (possibly)
+ parsed version.
+
+QUERY-SPEC is an alist produced by functions such as
+`gnus-group-make-search-group', and contains at least a 'query
+key, and possibly some meta keys. This function extracts any
+additional meta keys from the query, and optionally parses the
+string query into sexp form."
+ (let ((q-string (alist-get 'query query-spec))
+ key val)
+ ;; Look for these meta keys:
+ (while (string-match "\\(thread\\|limit\\|raw\\|no-parse\\|count\\):\\([^
]+\\)" q-string)
+ ;; If they're found, push them into the query spec, and remove
+ ;; them from the query string.
+ (setq key (if (string= (match-string 1 q-string)
+ "raw")
+ ;; "raw" is a synonym for "no-parse".
+ 'no-parse
+ (intern (match-string 1 q-string)))
+ val (string-to-number (match-string 2 q-string)))
+ (push (cons key
+ ;; A bit stupid, but right now the only possible
+ ;; values are "t", or a number.
+ (if (zerop val) t val))
+ query-spec)
+ (setq q-string
+ (string-trim (replace-match "" t t q-string 0))))
+ (setf (alist-get 'query query-spec) q-string)
+ ;; Decide whether to parse the query or not.
+ (setf (alist-get 'query query-spec)
+ (if (and gnus-search-use-parsed-queries
+ (null (alist-get 'no-parse query-spec)))
+ (gnus-search-parse-query q-string)
+ q-string))
+ query-spec))
+
;; This should be done once at Gnus startup time, when the servers are
;; first opened, and the resulting engine instance attached to the
;; server.
- [Emacs-diffs] branch scratch/gnus-search created (now 039df5e), Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search ad83eab 03/30: Make related change to nnselect.el, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search c7cf212 05/30: Move search group creation functions to gnus-group.el, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search c89e129 11/30: Change "no-parse" query meta-key to "raw", Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search 5e80a4d 06/30: Create general gnus-search-indexed-massage-output method, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search ede46af 12/30: Avoid circular import, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search 9e61dd3 16/30: Find-grep can only search on plain strings, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search cc541ba 14/30: Missing a base implementation of transform-expression for strings, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search 31514a0 04/30: Add function gnus-search-prepare-query,
Eric Abrahamsen <=
- [Emacs-diffs] scratch/gnus-search 32a328f 17/30: Fix for parsing delimited strings, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search b086d9a 07/30: Handle regexp and wildcard search terms, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search a4fe929 18/30: Notmuch query transformation improvements, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search 2ae2549 24/30: Fix bum namazu search command, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search 37e044f 19/30: Don't do any sorting at all in gnus-search, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search 9c57f16 15/30: Some refactoring of gnus-search-run-query, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search 09aff52 26/30: Do result limiting in the indexed engine process, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search 371748d 22/30: Switch base massage-output method for indexed search engines, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search 6a4dc13 09/30: WIP on documentation, Eric Abrahamsen, 2017/06/01
- [Emacs-diffs] scratch/gnus-search 79b5546 25/30: Add gnus-search-grep abstract engine, Eric Abrahamsen, 2017/06/01