From a1851ed0eb6587e822b62d18a884c1eabb1411c1 Mon Sep 17 00:00:00 2001 From: Adam Porter Date: Sun, 24 Nov 2019 05:43:21 -0600 Subject: [PATCH] Fix: (--value-at) Clear value cache when buffer changes Fixes #59. Thanks to Daniel Hubmann (@hubisan) for reporting. --- org-ql.el | 3 ++- tests/test-org-ql.el | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/org-ql.el b/org-ql.el index 3d64772..7e15cc0 100644 --- a/org-ql.el +++ b/org-ql.el @@ -470,7 +470,8 @@ Values compared with `equal'." buffer-unmodified-p (eq (buffer-modified-tick) modified-tick)) (unless (and buffer-cache buffer-unmodified-p) ;; Buffer-local node cache empty or invalid: make new one. - (setf position-cache (make-hash-table)) + (setf position-cache (make-hash-table) + value-cache (gethash position position-cache)) (puthash (current-buffer) (cons (buffer-modified-tick) position-cache) org-ql-node-value-cache)) diff --git a/tests/test-org-ql.el b/tests/test-org-ql.el index 9ae17a3..ea6ab8a 100644 --- a/tests/test-org-ql.el +++ b/tests/test-org-ql.el @@ -142,6 +142,25 @@ RESULTS should be a list of strings as returned by (cl-loop while (re-search-forward org-heading-regexp nil t) sum 1))))) + (describe "Caching" + (it "Clears value cache after buffer changes" + ;; See . + (with-temp-buffer + (org-mode) + (insert "* Heading 1 +* Heading 2") + ;; FIXME: `--value-at' does not actually move point, so we do it here. + (goto-char (point-min)) + (expect (org-ql--value-at (point-min) #'org-get-heading) + :to-equal "Heading 1") + (erase-buffer) + ;; FIXME: See above. + (insert "* Heading 2") + (goto-char (point-min)) + (org-ql--value-at (point-min) #'point) + (expect (org-ql--value-at (point-min) #'org-get-heading) + :to-equal "Heading 2")))) + (describe "Query functions/macros" (it "org-ql"