lib: Elide boring parents in tree mode even when using --empty.

This commit is contained in:
Stephen Morgan 2020-08-05 11:23:52 +10:00 committed by Simon Michael
parent 05e33965d6
commit 32e184f9a8
5 changed files with 115 additions and 97 deletions

View File

@ -426,7 +426,7 @@ displayedAccounts ropts q valuedaccts
| otherwise = HM.mapWithKey (\a _ -> displayedName a) displayedAccts
where
-- Accounts which are to be displayed
displayedAccts = HM.filterWithKey keep valuedaccts
displayedAccts = (if depth == 0 then id else HM.filterWithKey keep) valuedaccts
where
keep name amts = isInteresting name amts || name `HM.member` interestingParents
@ -445,24 +445,25 @@ displayedAccounts ropts q valuedaccts
-- Accounts interesting for their own sake
isInteresting name amts =
d <= depth -- Throw out anything too deep
&& (empty_ ropts || depth == 0 || not (isZeroRow balance amts)) -- Boring because has only zero entries
d <= depth -- Throw out anything too deep
&& ((empty_ ropts && all (null . asubs) amts) -- Keep all leaves when using empty_
|| not (isZeroRow balance amts)) -- Throw out anything with zero balance
where
d = accountNameLevel name
balance | ALTree <- accountlistmode_ ropts, d == depth = aibalance
| otherwise = aebalance
-- Accounts interesting because they are a fork for interesting subaccounts
interestingParents = dbg'' "interestingParents" $ HM.filterWithKey keepParent tallies
interestingParents = dbg'' "interestingParents" $ case accountlistmode_ ropts of
ALTree -> HM.filterWithKey hasEnoughSubs numSubs
ALFlat -> mempty
where
keepParent name subaccts
| ALFlat <- accountlistmode_ ropts = False
| no_elide_ ropts = subaccts > 0 && accountNameLevel name > drop_ ropts
| otherwise = subaccts > 1 && accountNameLevel name > drop_ ropts
tallies = subaccountTallies . HM.keys $ HM.filterWithKey isInteresting valuedaccts
hasEnoughSubs name nsubs = nsubs >= minSubs && accountNameLevel name > drop_ ropts
minSubs = if no_elide_ ropts then 1 else 2
isZeroRow balance = all (mixedAmountLooksZero . balance)
depth = fromMaybe maxBound $ queryDepth q
numSubs = subaccountTallies . HM.keys $ HM.filterWithKey isInteresting valuedaccts
-- | Sort the rows by amount or by account declaration order.
sortRows :: ReportOpts -> Journal -> [MultiBalanceReportRow] -> [MultiBalanceReportRow]
@ -560,9 +561,8 @@ sortRowsLike sortedas rows = mapMaybe (`HM.lookup` rowMap) sortedas
-- | Given a list of account names, find all forking parent accounts, i.e.
-- those which fork between different branches
subaccountTallies :: [AccountName] -> HashMap AccountName Int
subaccountTallies as = foldr incrementParent mempty allaccts
subaccountTallies = foldr incrementParent mempty . expandAccountNames
where
allaccts = expandAccountNames as
incrementParent a = HM.insertWith (+) (parentAccountName a) 1
-- | A helper: what percentage is the second mixed amount of the first ?

View File

@ -40,7 +40,6 @@ Budget performance in 2016-12-01..2016-12-03:
|| 2016-12-01 2016-12-02 2016-12-03 Total
==================++========================================================================================
assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75]
assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75]
expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25] $75 [ 100% of $75]
expenses:food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10] $30 [ 100% of $30]
@ -89,7 +88,6 @@ Budget performance in 2016-12-01..2016-12-03:
expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25] $75 [ 100% of $75]
expenses:leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] $5 [ 11% of $45]
expenses:food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10] $30 [ 100% of $30]
assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75]
assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75]
# # 2. -E
@ -163,7 +161,6 @@ Budget performance in 2016-12-01..2016-12-03:
expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25] $75 [ 100% of $75]
expenses:food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10] $30 [ 100% of $30]
expenses:leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] $5 [ 11% of $45]
assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75]
assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75]
#** Sort by actual amount, tree mode.
@ -171,13 +168,12 @@ Budget performance in 2016-12-01..2016-12-03:
$ hledger -f- bal --budget -DTNS --tree
Budget performance in 2016-12-01..2016-12-03:
|| 2016-12-01 2016-12-02 2016-12-03 Total
===========++========================================================================================
expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25] $75 [ 100% of $75]
food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10] $30 [ 100% of $30]
leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] $5 [ 11% of $45]
assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75]
cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75]
|| 2016-12-01 2016-12-02 2016-12-03 Total
=============++========================================================================================
expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25] $75 [ 100% of $75]
food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10] $30 [ 100% of $30]
leisure || 0 [ 0% of $15] $5 [ 33% of $15] 0 [ 0% of $15] $5 [ 11% of $45]
assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25] $-75 [ 100% of $-75]
#** other ?
# with -E

View File

@ -36,7 +36,6 @@ Budget performance in 2016-12-01..2016-12-03:
|| 2016-12-01 2016-12-02 2016-12-03
==================++==================================================================
assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25]
assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25]
expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25]
expenses:food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10]
@ -50,7 +49,6 @@ Budget performance in 2016-12-01..2016-12-03:
|| 2016-12-01 2016-12-02 2016-12-03
==================++==================================================================
assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25]
assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25]
expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25]
expenses:cab || 0 0 $15
@ -100,7 +98,6 @@ Budget performance in 2016-12-01..2016-12-03:
|| 2016-12-01 2016-12-02 2016-12-03
==================++======================================================================================
assets || $-15 [ 60% of $-25] $-26 [ 104% of $-25] $-51 [ 204% of $-25]
assets:cash || $-15 [ 60% of $-25] $-26 [ 104% of $-25] $-51 [ 204% of $-25]
expenses || £10 [ $25] $5, 20 CAD [ $25] $51 [ 204% of $25]
expenses:food || £10 [ $10] 20 CAD [ $10] $11 [ 110% of $10]
@ -300,7 +297,6 @@ Budget performance in 2018-01-01:
|| 2018-01-01
=======++==================
a || 2 [ 2% of 101]
a:b || 1 [ 100% of 1]
a:b:c || 1 [ 100% of 1]
-------++------------------
|| 2 [ 2% of 101]
@ -312,8 +308,7 @@ Budget performance in 2018-01-01:
|| 2018-01-01
=======++==================
a || 2 [ 2% of 101]
b || 1 [ 100% of 1]
c || 1 [ 100% of 1]
b:c || 1 [ 100% of 1]
-------++------------------
|| 2 [ 2% of 101]
@ -372,7 +367,6 @@ Budget performance in 2019-01-01..2019-01-03:
|| 2019-01-01..2019-01-03
===================++==============================
expenses || $50.00 [ 5% of $1,000.00]
expenses:personal || $50.00 [ 5% of $1,000.00]
liabilities || $-50.00 [ 5% of $-1000.00]
-------------------++------------------------------
@ -384,7 +378,6 @@ Budget performance in 2019-01-01..2019-01-03:
|| 2019-01-01..2019-01-03
========================================++==============================
expenses || $50.00 [ 5% of $1,000.00]
expenses:personal || $50.00 [ 5% of $1,000.00]
expenses:personal:electronics || $20.00
expenses:personal:electronics:upgrades || $10.00
@ -396,27 +389,25 @@ Budget performance in 2019-01-01..2019-01-03:
$ hledger -f- bal --budget --tree
Budget performance in 2019-01-01..2019-01-03:
|| 2019-01-01..2019-01-03
=============++==============================
expenses || $50.00 [ 5% of $1,000.00]
personal || $50.00 [ 5% of $1,000.00]
liabilities || $-50.00 [ 5% of $-1000.00]
-------------++------------------------------
|| 0 [ 0]
|| 2019-01-01..2019-01-03
===================++==============================
expenses:personal || $50.00 [ 5% of $1,000.00]
liabilities || $-50.00 [ 5% of $-1000.00]
-------------------++------------------------------
|| 0 [ 0]
# 19.
$ hledger -f- bal --budget --tree -E
Budget performance in 2019-01-01..2019-01-03:
|| 2019-01-01..2019-01-03
=================++==============================
expenses || $50.00 [ 5% of $1,000.00]
personal || $50.00 [ 5% of $1,000.00]
electronics || $20.00
upgrades || $10.00
liabilities || $-50.00 [ 5% of $-1000.00]
-----------------++------------------------------
|| 0 [ 0]
|| 2019-01-01..2019-01-03
===================++==============================
expenses:personal || $50.00 [ 5% of $1,000.00]
electronics || $20.00
upgrades || $10.00
liabilities || $-50.00 [ 5% of $-1000.00]
-------------------++------------------------------
|| 0 [ 0]
# 20. Subaccounts + nested budgets
<
@ -442,7 +433,6 @@ Budget performance in 2019-01-01..2019-01-03:
|| 2019-01-01..2019-01-03
===============================++==============================
expenses || $50.00 [ 5% of $1100.00]
expenses:personal || $50.00 [ 5% of $1100.00]
expenses:personal:electronics || $20.00 [ 20% of $100.00]
liabilities || $-50.00 [ 5% of $-1100.00]
@ -455,7 +445,6 @@ Budget performance in 2019-01-01..2019-01-03:
|| 2019-01-01..2019-01-03
========================================++==============================
expenses || $50.00 [ 5% of $1100.00]
expenses:personal || $50.00 [ 5% of $1100.00]
expenses:personal:electronics || $20.00 [ 20% of $100.00]
expenses:personal:electronics:upgrades || $10.00
@ -467,28 +456,26 @@ Budget performance in 2019-01-01..2019-01-03:
$ hledger -f- bal --budget --tree
Budget performance in 2019-01-01..2019-01-03:
|| 2019-01-01..2019-01-03
=================++==============================
expenses || $50.00 [ 5% of $1100.00]
personal || $50.00 [ 5% of $1100.00]
electronics || $20.00 [ 20% of $100.00]
liabilities || $-50.00 [ 5% of $-1100.00]
-----------------++------------------------------
|| 0 [ 0]
|| 2019-01-01..2019-01-03
===================++==============================
expenses:personal || $50.00 [ 5% of $1100.00]
electronics || $20.00 [ 20% of $100.00]
liabilities || $-50.00 [ 5% of $-1100.00]
-------------------++------------------------------
|| 0 [ 0]
# 23.
$ hledger -f- bal --budget --tree -E
Budget performance in 2019-01-01..2019-01-03:
|| 2019-01-01..2019-01-03
=================++==============================
expenses || $50.00 [ 5% of $1100.00]
personal || $50.00 [ 5% of $1100.00]
electronics || $20.00 [ 20% of $100.00]
upgrades || $10.00
liabilities || $-50.00 [ 5% of $-1100.00]
-----------------++------------------------------
|| 0 [ 0]
|| 2019-01-01..2019-01-03
===================++==============================
expenses:personal || $50.00 [ 5% of $1100.00]
electronics || $20.00 [ 20% of $100.00]
upgrades || $10.00
liabilities || $-50.00 [ 5% of $-1100.00]
-------------------++------------------------------
|| 0 [ 0]
## 24. Zero budget == no budget
<
@ -519,13 +506,11 @@ Budget performance in 2019-01-01..2019-01-02:
|| 2019-01-01..2019-01-02
==================++========================
expenses || $80 [ 22% of $370]
expenses:bills || $80 [ 22% of $370]
expenses:bills:a || $10 [ 50% of $20]
expenses:bills:b || $40 [ 20% of $200]
expenses:bills:c || 0 [ 0% of $50]
expenses:bills:f || $10 [ 0]
income || $-80 [ 22% of $-370]
income:cash || $-80 [ 22% of $-370]
------------------++------------------------
|| 0 [ 0]
@ -536,7 +521,6 @@ Budget performance in 2019-01-01..2019-01-02:
|| 2019-01-01..2019-01-02
==================++========================
expenses || $80 [ 22% of $370]
expenses:bills || $80 [ 22% of $370]
expenses:bills:a || $10 [ 50% of $20]
expenses:bills:b || $40 [ 20% of $200]
@ -544,7 +528,6 @@ Budget performance in 2019-01-01..2019-01-02:
expenses:bills:d || $20
expenses:bills:e || 0
expenses:bills:f || $10 [ 0]
income || $-80 [ 22% of $-370]
income:cash || $-80 [ 22% of $-370]
------------------++------------------------
|| 0 [ 0]

View File

@ -1,7 +1,6 @@
#!/usr/bin/env shelltest
# 1. One commodity. Zero accounts should be elided but the final total should not.
hledger -f - balance
<<<
#
<
2010/04/01 tr1
a 16$
b -16$
@ -9,52 +8,93 @@ hledger -f - balance
2010/04/02 tr2
a -16$
b 16$
>>>
# 1. One commodity. Zero accounts should be elided but the final total should not.
$ hledger -f - balance
>
--------------------
0
>>>=0
>=0
<
1/1
(a:b) 1
# 2. An uninteresting parent account (with same balance as its single subaccount) is elided by default, like ledger
hledger -f - balance --no-total
<<<
1/1
(a:b) 1
>>>
$ hledger -f - balance --no-total
>
1 a:b
>>>=0
>=0
# 3. But not with --no-elide
hledger -f - balance --no-total --tree --no-elide
<<<
1/1
(a:b) 1
>>>
$ hledger -f - balance --no-total --tree --no-elide
>
1 a
1 b
>>>=0
>=0
# 4. Nor when it has more than one subaccount
hledger -f - balance --tree --no-total
<<<
<
1/1
(a:b) 1
(a:c) -1
>>>
# 4. Nor when it has more than one subaccount
$ hledger -f - balance --tree --no-total
>
0 a
1 b
-1 c
>>>2
>>>=0
>2
>=0
# 5. Zero-balance leaves should also be hidden by default.
hledger -f - balance --no-total
<<<
<
1/1
(a) 1
(a:aa) 1
(a:aa) -1
(a:aa:aaa) 1
(a:aa:aaa) -1
>>>
# 5. Zero-balance leaves should also be hidden by default.
$ hledger -f - balance --tree --no-total
1 a
>>>=0
# 6. Zero-balance leaves should be displayed in tree mode when --empty
# is called, but zero-balance uninteresting parent accounts are elided
# by default.
$ hledger -f - balance --tree --no-total --empty
1 a
0 aa:aaa
# 7. But displayed with --no-elide
$ hledger -f - balance --tree --no-total --empty --no-elide
1 a
0 aa
0 aaa
# 8. Same as 5 for multiperiod
$ hledger -f - balance --tree --no-total -Y
Balance changes in 2020:
|| 2020
===++======
a || 1
# 9. Same as 6 for mulitperiod
$ hledger -f - balance --tree --no-total -Y --empty
Balance changes in 2020:
|| 2020
==========++======
a || 1
aa:aaa || 0
# 10. Same as 7 for multiperiod
$ hledger -f - balance --tree --no-total -Y --empty --no-elide
Balance changes in 2020:
|| 2020
=========++======
a || 1
aa || 0
aaa || 0

View File

@ -57,7 +57,6 @@ Budget performance in 2016-12-01..2016-12-03:
|| 2016-12-01 2016-12-02 2016-12-03
==================++==================================================================
assets || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25]
assets:cash || $-10 [ 40% of $-25] $-14 [ 56% of $-25] $-51 [ 204% of $-25]
expenses || $10 [ 40% of $25] $14 [ 56% of $25] $51 [ 204% of $25]
expenses:food || $10 [ 100% of $10] $9 [ 90% of $10] $11 [ 110% of $10]