gnucash stable: [report-utilities] more efficient gnc:accounts-get-commodities

Christopher Lam clam at code.gnucash.org
Thu Jan 11 10:55:13 EST 2024


Updated	 via  https://github.com/Gnucash/gnucash/commit/1a5247c1 (commit)
	from  https://github.com/Gnucash/gnucash/commit/7a17b24e (commit)



commit 1a5247c10e79345b91e971c253db4e2830ea2b88
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Jan 10 23:46:31 2024 +0800

    [report-utilities] more efficient gnc:accounts-get-commodities
    
    don't create intermediate lists which are immediately used and
    discarded.
    
    don't locale-compare commodity names, which has locale-transform
    overhead, and creates lots of temporary strings.
    
    testing for duplicates via O(N) member is very adequate because
    num(unique commodities) is expected to be small.
    
    use the stack when accumulating commodities, avoiding need to prepend
    and reverse.

diff --git a/gnucash/report/commodity-utilities.scm b/gnucash/report/commodity-utilities.scm
index 8e30d2fbee..44173e6cb1 100644
--- a/gnucash/report/commodity-utilities.scm
+++ b/gnucash/report/commodity-utilities.scm
@@ -229,12 +229,7 @@
           (gnc-account-get-descendants-sorted (gnc-get-current-root-account)))
          (all-splits (get-all-splits currency-accounts end-date))
          (interesting-splits (sort (filter interesting-split? all-splits) date<?))
-         (commodity-list (sort-and-delete-duplicates
-                          commodity-list
-                          (lambda (a b)
-                            (gnc:string-locale<? (gnc-commodity-get-unique-name a)
-                                                 (gnc-commodity-get-unique-name b)))
-                          gnc-commodity-equal))
+         (commodity-list (delete-duplicates commodity-list))
          (work-to-do (length commodity-list)))
     (map
      (lambda (c work-done)
diff --git a/gnucash/report/report-utilities.scm b/gnucash/report/report-utilities.scm
index e490e00085..aadd1c7dbb 100644
--- a/gnucash/report/report-utilities.scm
+++ b/gnucash/report/report-utilities.scm
@@ -217,14 +217,11 @@
 ;; Get the list of all different commodities that are used within the
 ;; 'accounts', excluding the 'exclude-commodity'.
 (define (gnc:accounts-get-commodities accounts exclude-commodity)
-  (delete exclude-commodity
-          (sort-and-delete-duplicates
-           (map xaccAccountGetCommodity accounts)
-           (lambda (a b)
-             (gnc:string-locale<? (gnc-commodity-get-unique-name a)
-                                  (gnc-commodity-get-unique-name b)))
-           gnc-commodity-equiv)))
-
+  (if (null? accounts)
+      '()
+      (let ((comm (xaccAccountGetCommodity (car accounts)))
+            (accum (gnc:accounts-get-commodities (cdr accounts) exclude-commodity)))
+        (if (or (equal? exclude-commodity comm) (member comm accum)) accum (cons comm accum)))))
 
 ;; Returns the depth of the current account hierarchy, that is, the
 ;; maximum level of subaccounts in the tree
diff --git a/gnucash/report/reports/standard/balsheet-pnl.scm b/gnucash/report/reports/standard/balsheet-pnl.scm
index f0a8254483..765e130e54 100644
--- a/gnucash/report/reports/standard/balsheet-pnl.scm
+++ b/gnucash/report/reports/standard/balsheet-pnl.scm
@@ -739,12 +739,7 @@ also show overall period profit & loss."))
          ;; generate an exchange-fn for date, and cache its result.
          (get-date-exchange-fn
           (let ((h (make-hash-table))
-                (commodities (sort-and-delete-duplicates
-                              (map xaccAccountGetCommodity accounts)
-                              (lambda (a b)
-                                (gnc:string-locale<? (gnc-commodity-get-unique-name a)
-                                                     (gnc-commodity-get-unique-name b)))
-                              gnc-commodity-equal)))
+                (commodities (gnc:accounts-get-commodities accounts #f)))
             (lambda (date)
               (or (hashv-ref h date)
                   (let ((exchangefn (gnc:case-exchange-time-fn
diff --git a/gnucash/report/reports/standard/test/test-balsheet-pnl.scm b/gnucash/report/reports/standard/test/test-balsheet-pnl.scm
index 6213d80bef..2c3d039ef9 100644
--- a/gnucash/report/reports/standard/test/test-balsheet-pnl.scm
+++ b/gnucash/report/reports/standard/test/test-balsheet-pnl.scm
@@ -331,7 +331,7 @@
         '("#200.00" "$340.00" "30 FUNDS" "$14,424.52" "$106,709.00" "$106,709.00")
         (sxml->table-row-col sxml 1 3 6))
       (test-equal "show-rates enabled"
-        '("#1.00" "$1.7000" "1 FUNDS" "$480 + 85/104")
+        '("1 FUNDS" "$480 + 85/104" "#1.00" "$1.7000")
         (sxml->table-row-col sxml 2 #f #f)))
 
     ;;make-multilevel



Summary of changes:
 gnucash/report/commodity-utilities.scm                     |  7 +------
 gnucash/report/report-utilities.scm                        | 13 +++++--------
 gnucash/report/reports/standard/balsheet-pnl.scm           |  7 +------
 gnucash/report/reports/standard/test/test-balsheet-pnl.scm |  2 +-
 4 files changed, 8 insertions(+), 21 deletions(-)



More information about the gnucash-changes mailing list