lib: multiBalanceReport: Split buildReportRows into a separate function, remove unnecessary query and valuation.

This commit is contained in:
Stephen Morgan 2020-06-12 13:08:00 +10:00
parent a81c6d0397
commit 7a9bf998e5

View File

@ -118,18 +118,15 @@ multiBalanceReportWith ropts@ReportOpts{..} q j priceoracle =
-- handles the hledger-ui+future txns case above).
reportq = dbg "reportq" $ makeReportQuery ropts reportspan q
-- If doing cost valuation, convert amounts to cost.
j' = journalSelectingAmountFromOpts ropts j
-- The matched accounts with a starting balance. All of these shold appear
-- in the report, even if they have no postings during the report period.
startbals = dbg' "startbals" $ startingBalances ropts q j' reportspan
startbals = dbg' "startbals" $ startingBalances ropts reportq j reportspan
-- The matched accounts with a starting balance. All of these should appear
-- in the report even if they have no postings during the report period.
startaccts = dbg'' "startaccts" $ HM.keys startbals
-- Postings matching the query within the report period.
ps :: [(Posting, Day)] = dbg'' "ps" $ getPostings ropts reportq j'
ps :: [(Posting, Day)] = dbg'' "ps" $ getPostings ropts reportq j
days = map snd ps
-- The date spans to be included as report columns.
@ -160,21 +157,8 @@ multiBalanceReportWith ropts@ReportOpts{..} q j priceoracle =
allpostedaccts :: [AccountName] =
dbg'' "allpostedaccts" . sort . accountNamesFromPostings $ map fst ps
----------------------------------------------------------------------
-- 6. Build the report rows.
-- One row per account, with account name info, row amounts, row total and row average.
rows :: [MultiBalanceReportRow] =
dbg'' "rows" $
[ PeriodicReportRow a (accountNameLevel a) rowbals rowtot rowavg
| (a,rowbals) <- HM.toList accumvalued
-- The total and average for the row.
-- These are always simply the sum/average of the displayed row amounts.
-- Total for a cumulative/historical report is always zero.
, let rowtot = if balancetype_==PeriodChange then sum rowbals else 0
, let rowavg = averageMixedAmounts rowbals
, empty_ || depth == 0 || any (not . mixedAmountLooksZero) rowbals
]
-- All the rows of the report.
rows = dbg'' "rows" $ buildReportRows ropts reportq accumvalued
----------------------------------------------------------------------
-- 7. Sort the report rows.
@ -313,10 +297,9 @@ getPostings ropts q =
-- | Remove any date queries and insert queries from the report span.
makeReportQuery :: ReportOpts -> DateSpan -> Query -> Query
makeReportQuery ropts reportspan q
| reportspan == nulldatespan = depthlessq
| otherwise = And [dateless depthlessq, reportspandatesq]
| reportspan == nulldatespan = q
| otherwise = And [dateless q, reportspandatesq]
where
depthlessq = dbg "depthless" $ filterQuery (not . queryIsDepth) q
reportspandatesq = dbg "reportspandatesq" $ dateqcons reportspan
dateless = dbg "dateless" . filterQuery (not . queryIsDateOrDate2)
dateqcons = if date2_ ropts then Date2 else Date
@ -404,6 +387,21 @@ accumValueAmounts ropts j priceoracle startbals = HM.mapWithKey processRow
startingBalanceFor a = HM.lookupDefault nullmixedamt a startbals
-- | Build the report rows.
--
-- One row per account, with account name info, row amounts, row total and row average.
buildReportRows :: ReportOpts -> Query -> HashMap AccountName [MixedAmount] -> [MultiBalanceReportRow]
buildReportRows ropts q acctvalues =
[ PeriodicReportRow a (accountNameLevel a) rowbals rowtot rowavg
| (a,rowbals) <- HM.toList acctvalues
-- The total and average for the row.
-- These are always simply the sum/average of the displayed row amounts.
-- Total for a cumulative/historical report is always zero.
, let rowtot = if balancetype_ ropts == PeriodChange then sum rowbals else 0
, let rowavg = averageMixedAmounts rowbals
, empty_ ropts || queryDepth q == 0 || any (not . mixedAmountLooksZero) rowbals -- TODO: Remove this eventually, to be handled elswhere
]
-- | Generates a simple non-columnar BalanceReport, but using multiBalanceReport,
-- in order to support --historical. Does not support tree-mode boring parent eliding.