Update clauses in boolean preambles

This commit is contained in:
Ihor Radchenko 2021-04-05 17:33:28 +08:00
parent 1b794a5083
commit e1a464fb2c
No known key found for this signature in database
GPG key ID: 6470762A7DA11D8B

View file

@ -1219,16 +1219,26 @@ result form."
`(and ,@(mapcar #'rec clauses)))) `(and ,@(mapcar #'rec clauses))))
:preambles ((`(and . ,clauses) :preambles ((`(and . ,clauses)
(let ((preambles (mapcar #'rec clauses)) (let ((preambles (mapcar #'rec clauses))
regexps regexp-max case-fold-max) regexps regexp-max case-fold-max queries)
(dolist (preamble preambles) (cl-loop for preamble in preambles
for clause in clauses
do
(-let* (((&plist :regexp :case-fold :query) preamble)) (-let* (((&plist :regexp :case-fold :query) preamble))
(if regexp
(cond
((eq query t) (setq query `(regexp ,regexp)))
((not query) (setq query `(regexp ,regexp)))
(t nil))
(setq query clause))
(push query queries)
;; Take the longest regexp. It should be hardest to match. ;; Take the longest regexp. It should be hardest to match.
(when (length> regexp (length regexp-max)) (when (length> regexp (length regexp-max))
(setq regexp-max regexp) (setq regexp-max regexp)
(setq case-fold-max case-fold)))) (setq case-fold-max case-fold))))
(setq queries (reverse queries))
(list :regexp regexp-max (list :regexp regexp-max
:case-fold case-fold-max :case-fold case-fold-max
:query `(and ,@clauses)))))) :query `(and ,@queries))))))
(org-ql-defpred org-ql--or (&rest clauses) (org-ql-defpred org-ql--or (&rest clauses)
"Return non-nil if any of the clauses match." "Return non-nil if any of the clauses match."
@ -1238,17 +1248,29 @@ result form."
`(or ,@(mapcar #'rec clauses)))) `(or ,@(mapcar #'rec clauses))))
:preambles ((`(or . ,clauses) :preambles ((`(or . ,clauses)
(let ((preambles (mapcar #'rec clauses)) (let ((preambles (mapcar #'rec clauses))
regexps regexp-null-p) regexps regexp-null-p queries)
(dolist (preamble preambles) (cl-loop for preamble in preambles
for clause in clauses
do
(-let* (((&plist :regexp :case-fold :query) preamble)) (-let* (((&plist :regexp :case-fold :query) preamble))
(if regexp
(cond
((eq query t) (setq query `(regexp ,regexp)))
((not query) (setq query `(regexp ,regexp)))
(t nil))
(setq query clause))
(push query queries)
;; Collect regexps for combining. ;; Collect regexps for combining.
(if regexp (push regexp regexps) (if regexp (push regexp regexps)
(setq regexp-null-p t)))) (setq regexp-null-p t))))
(setq queries (reverse queries))
(list :regexp (unless regexp-null-p (list :regexp (unless regexp-null-p
(and regexps (and regexps
(rx-to-string `(or ,@(mapcar (lambda (re) `(regex ,re)) regexps))))) (rx-to-string `(or ,@(mapcar (lambda (re) `(regex ,re)) regexps)))))
:case-fold t :case-fold t
:query `(save-excursion (or ,@clauses))))))) :query (if regexp-null-p
`(save-excursion (or ,@clauses))
`(save-excursion (or ,@queries))))))))
(org-ql-defpred org-ql--when (condition &rest clauses) (org-ql-defpred org-ql--when (condition &rest clauses)
"Return values of CLAUSES when CONDITION is non-nil." "Return values of CLAUSES when CONDITION is non-nil."