From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matt Lundin Subject: [PATCH 2/2] Make timestamp search in org-entry-properties more efficient. Date: Sun, 12 Dec 2010 22:05:46 -0500 Message-ID: <87y67uqsfb.fsf@fastmail.fm> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from [140.186.70.92] (port=49506 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PRynt-0001GC-FM for emacs-orgmode@gnu.org; Sun, 12 Dec 2010 22:10:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PRynq-0003CD-W9 for emacs-orgmode@gnu.org; Sun, 12 Dec 2010 22:10:21 -0500 Received: from out3.smtp.messagingengine.com ([66.111.4.27]:59377) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PRynq-0003C3-ON for emacs-orgmode@gnu.org; Sun, 12 Dec 2010 22:10:18 -0500 Received: from compute3.internal (compute3.nyi.mail.srv.osa [10.202.2.43]) by gateway1.messagingengine.com (Postfix) with ESMTP id 60FA24AD for ; Sun, 12 Dec 2010 22:10:18 -0500 (EST) Received: from archdesk (67-197-63-212.rh2.dyn.cm.comporium.net [67.197.63.212]) by mail.messagingengine.com (Postfix) with ESMTPSA id D2FC6400936 for ; Sun, 12 Dec 2010 22:10:17 -0500 (EST) List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Org Mode * lisp/org.el: (org-entry-properties) Stop scanning for timestamps if a specific timestamp property (e.g., DEADLINE, SCHEDULED, etc.) is requested and a match is found. Also, if a specific timestamp property is requested, do not push non-relevant timestamps onto property list. This change only effects org-entry-properties when a specific timestamp is requested with the special flag, as in: (org-entry-properties nil 'special "SCHEDULED") Previously, even if only the SCHEDULED timestamp was requested, org-entry-properties would parse all the timestamps in an entry. This extra parsing could slow down the construction of agenda views, especially with entries that contained a large number of log items (CLOCK, state changes, etc.). The function org-entry-get, however, is only interested in the first occurrence of the item. When looking for a specific type of timestamp, org-entry-properties now stops searching for timestamps after the match is found, unless the property is "CLOCK". Here are the relevant ELP results: Before: org-entry-get 296 0.4724579999 0.0015961418 org-entry-properties 31 0.3438769999 0.0110928064 After: org-entry-get 296 0.1447729999 0.0004890979 org-entry-properties 31 0.015765 0.0005085483 --- lisp/org.el | 60 ++++++++++++++++++++++++++++++++-------------------------- 1 files changed, 33 insertions(+), 27 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index 82c0b46..c4fe6a0 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -1,4 +1,4 @@ -;;; org.el --- Outline-based notes management and organizer +';;; org.el --- Outline-based notes management and organizer ;; Carstens outline-mode for keeping track of everything. ;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 ;; Free Software Foundation, Inc. @@ -13424,32 +13424,38 @@ things up because then unnecessary parsing is avoided." (member specific '("SCHEDULED" "DEADLINE" "CLOCK" "CLOSED" "TIMESTAMP" "TIMESTAMP_IA"))) - (while (re-search-forward org-maybe-keyword-time-regexp end t) - (setq key (if (match-end 1) - (substring (org-match-string-no-properties 1) - 0 -1)) - string (if (equal key clockstr) - (org-no-properties - (org-trim - (buffer-substring - (match-beginning 3) (goto-char - (point-at-eol))))) - (substring (org-match-string-no-properties 3) - 1 -1))) - ;; Get the correct property name from the key. This is - ;; necessary if the user has configured time keywords. - (setq key1 (concat key ":")) - (cond - ((not key) - (setq key - (if (= (char-after (match-beginning 3)) ?\[) - "TIMESTAMP_IA" "TIMESTAMP"))) - ((equal key1 org-scheduled-string) (setq key "SCHEDULED")) - ((equal key1 org-deadline-string) (setq key "DEADLINE")) - ((equal key1 org-closed-string) (setq key "CLOSED")) - ((equal key1 org-clock-string) (setq key "CLOCK"))) - (when (or (equal key "CLOCK") (not (assoc key props))) - (push (cons key string) props)))) + (catch 'match + (while (re-search-forward org-maybe-keyword-time-regexp end t) + (setq key (if (match-end 1) + (substring (org-match-string-no-properties 1) + 0 -1)) + string (if (equal key clockstr) + (org-no-properties + (org-trim + (buffer-substring + (match-beginning 3) (goto-char + (point-at-eol))))) + (substring (org-match-string-no-properties 3) + 1 -1))) + ;; Get the correct property name from the key. This is + ;; necessary if the user has configured time keywords. + (setq key1 (concat key ":")) + (cond + ((not key) + (setq key + (if (= (char-after (match-beginning 3)) ?\[) + "TIMESTAMP_IA" "TIMESTAMP"))) + ((equal key1 org-scheduled-string) (setq key "SCHEDULED")) + ((equal key1 org-deadline-string) (setq key "DEADLINE")) + ((equal key1 org-closed-string) (setq key "CLOSED")) + ((equal key1 org-clock-string) (setq key "CLOCK"))) + (if (and specific (equal key specific) (not (equal key "CLOCK"))) + (progn + (push (cons key string) props) + ;; no need to search further if match is found + (throw 'match t)) + (when (or (equal key "CLOCK") (not (assoc key props))) + (push (cons key string) props)))))) ) (when (memq which '(all standard)) -- 1.7.3.3