Update clauses in boolean preambles
This commit is contained in:
parent
1b794a5083
commit
e1a464fb2c
1 changed files with 37 additions and 15 deletions
34
org-ql.el
34
org-ql.el
|
|
@ -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."
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue