emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 48e8569c87: Allow searching of nnselect (search) groups


From: Andrew G Cohen
Subject: master 48e8569c87: Allow searching of nnselect (search) groups
Date: Fri, 11 Feb 2022 02:17:14 -0500 (EST)

branch: master
commit 48e8569c8772ed4cb2af299e353e7376606992be
Author: Andrew G Cohen <cohen@andy.bu.edu>
Commit: Andrew G Cohen <cohen@andy.bu.edu>

    Allow searching of nnselect (search) groups
    
    * lisp/gnus/gnus-group.el (gnus-group-make-search-group):
    (gnus-group-read-ephemeral-search-group):  Ensure the server is
    correctly identified even for nnselect groups.
    * lisp/gnus/gnus-search.el (gnus-search-nnselect): New function.
    (gnus-search-default-engines): Use it.
    (gnus-search-make-spec): Queries from nnselect should always be raw.
    * lisp/gnus/nnselect.el (gnus-search): Silence the byte-compiler.
---
 lisp/gnus/gnus-group.el  |  6 ++++--
 lisp/gnus/gnus-search.el | 39 ++++++++++++++++++++++++++++++++++++---
 lisp/gnus/nnselect.el    |  3 ++-
 3 files changed, 42 insertions(+), 6 deletions(-)

diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index 8937df2601..e59a972350 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -3226,7 +3226,8 @@ non-nil SPECS arg must be an alist with 
`search-query-spec' and
               (if (gnus-server-server-name)
                   (list (list (gnus-server-server-name)))
                 (seq-group-by
-                 (lambda (elt) (gnus-group-server elt))
+                  (lambda (elt) (gnus-method-to-server
+                                 (gnus-find-method-for-group  elt)))
                  (or gnus-group-marked
                      (if (gnus-group-group-name)
                          (list (gnus-group-group-name))
@@ -3277,7 +3278,8 @@ non-nil SPECS arg must be an alist with 
`search-query-spec' and
              (if (gnus-server-server-name)
                  (list (list (gnus-server-server-name)))
                (seq-group-by
-                (lambda (elt) (gnus-group-server elt))
+                  (lambda (elt) (gnus-method-to-server
+                                 (gnus-find-method-for-group  elt)))
                 (or gnus-group-marked
                     (if (gnus-group-group-name)
                         (list (gnus-group-group-name))
diff --git a/lisp/gnus/gnus-search.el b/lisp/gnus/gnus-search.el
index bf88abae76..4babe9f96f 100644
--- a/lisp/gnus/gnus-search.el
+++ b/lisp/gnus/gnus-search.el
@@ -762,6 +762,9 @@ the files in ARTLIST by that search key.")
                         (generate-new-buffer " *gnus-search-")))
   (cl-call-next-method engine slots))
 
+(defclass gnus-search-nnselect (gnus-search-engine)
+  nil)
+
 (defclass gnus-search-imap (gnus-search-engine)
   ((literal-plus
     :initarg :literal-plus
@@ -907,13 +910,15 @@ quirks.")
 (define-obsolete-variable-alias 'nnir-method-default-engines
   'gnus-search-default-engines "28.1")
 
-(defcustom gnus-search-default-engines '((nnimap . gnus-search-imap))
+(defcustom gnus-search-default-engines '((nnimap . gnus-search-imap)
+                                         (nnselect . gnus-search-nnselect))
   "Alist of default search engines keyed by server method."
   :version "26.1"
   :type `(repeat (cons (choice (const nnimap) (const nntp) (const nnspool)
                               (const nneething) (const nndir) (const nnmbox)
                               (const nnml) (const nnmh) (const nndraft)
-                              (const nnfolder) (const nnmaildir))
+                              (const nnfolder) (const nnmaildir)
+                               (const nnselect))
                       (choice
                        ,@(mapcar
                           (lambda (el) (list 'const (intern (car el))))
@@ -1010,6 +1015,33 @@ Responsible for handling and, or, and parenthetical 
expressions.")
         unseen all old new or not)
   "Known IMAP search keys.")
 
+(autoload 'nnselect-categorize "nnselect")
+(autoload 'nnselect-get-artlist "nnselect" nil nil 'macro)
+(autoload 'ids-by-group "nnselect")
+;; nnselect interface
+(cl-defmethod gnus-search-run-search ((_engine gnus-search-nnselect)
+                                     _srv query-spec groups)
+  (let ((artlist []))
+    (dolist (group groups)
+      (let* ((gnus-newsgroup-selection (nnselect-get-artlist group))
+             (group-spec
+              (nnselect-categorize
+               (mapcar 'car
+                       (ids-by-group
+                        (number-sequence 1
+                                         (length gnus-newsgroup-selection))))
+               (lambda (x)
+                 (gnus-group-server x)))))
+        (setq artlist
+              (vconcat artlist
+                       (seq-intersection
+                        gnus-newsgroup-selection
+                        (gnus-search-run-query
+                         (list (cons 'search-query-spec query-spec)
+                               (cons 'search-group-spec group-spec))))))))
+    artlist))
+
+
 ;; imap interface
 (cl-defmethod gnus-search-run-search ((engine gnus-search-imap)
                                      srv query groups)
@@ -2155,7 +2187,8 @@ article came from is also searched."
                (read-from-minibuffer
                 "Query: " nil gnus-search-minibuffer-map
                 nil 'gnus-search-history)))
-       (cons 'raw arg)))
+       (cons 'raw
+              (or (gnus-nnselect-group-p (gnus-group-group-name)) arg))))
 
 (provide 'gnus-search)
 ;;; gnus-search.el ends here
diff --git a/lisp/gnus/nnselect.el b/lisp/gnus/nnselect.el
index f8a0c33d4e..f5be477d26 100644
--- a/lisp/gnus/nnselect.el
+++ b/lisp/gnus/nnselect.el
@@ -47,7 +47,8 @@
 ;;; Setup:
 
 (require 'gnus-art)
-(require 'gnus-search)
+(autoload 'gnus-search-run-query "gnus-search")
+(autoload 'gnus-search-server-to-engine "gnus-search")
 
 (eval-when-compile (require 'cl-lib))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]