optimise summariseTransactionsInDateSpan like cacheLedger
makes summarised register reports faster
This commit is contained in:
		
							parent
							
								
									63999d36fe
								
							
						
					
					
						commit
						b1f2d95e13
					
				@ -76,28 +76,36 @@ summariseTransactionsInDateSpan (DateSpan b e) entryno depth showempty ts
 | 
				
			|||||||
      summaryts'
 | 
					      summaryts'
 | 
				
			||||||
          | showempty = summaryts
 | 
					          | showempty = summaryts
 | 
				
			||||||
          | otherwise = filter (not . isZeroMixedAmount . amount) summaryts
 | 
					          | otherwise = filter (not . isZeroMixedAmount . amount) summaryts
 | 
				
			||||||
      -- aggregate balances by account, like cacheLedger:
 | 
					      txnanames = sort $ nub $ map account ts
 | 
				
			||||||
      anames = sort $ nub $ map account ts
 | 
					
 | 
				
			||||||
      allnames = expandAccountNames anames ++ [""]
 | 
					      -- aggregate balances by account like cacheLedger
 | 
				
			||||||
      -- from cacheLedger:
 | 
					      ant = accountNameTreeFrom txnanames
 | 
				
			||||||
      txnmap = Map.union (transactionsByAccount ts) (Map.fromList [(a,[]) | a <- allnames])
 | 
					      anames = flatten ant
 | 
				
			||||||
      txnsof = (txnmap !)  -- a's txns
 | 
					      txnmap = Map.union (transactionsByAccount ts) (Map.fromList [(a,[]) | a <- anames])
 | 
				
			||||||
      isunder a b = null a || a `isAccountNamePrefixOf` b
 | 
					      txnsof = (txnmap !)
 | 
				
			||||||
      subacctsof a = filter (isunder a) anames -- a plus any subaccounts
 | 
					      addbalances :: Tree AccountName -> Tree (AccountName, MixedAmount)
 | 
				
			||||||
      subtxnsof a = concat [txnsof a | a <- [a] ++ subacctsof a] -- a's and subaccounts' txns
 | 
					      addbalances (Node a []) = Node (a,sumTransactions $ txnsof a) []
 | 
				
			||||||
      inclusivebalmap = Map.union  -- subaccount-including balances for all accounts
 | 
					      addbalances (Node a subs) = Node (a,sumtxns + sumsubaccts) subbals
 | 
				
			||||||
               (Map.fromList [(a,(sumTransactions $ subtxnsof a)) | a <- allnames])
 | 
					          where
 | 
				
			||||||
               (Map.fromList [(a,Mixed []) | a <- anames])
 | 
					            sumtxns = sumTransactions $ txnsof a
 | 
				
			||||||
      --
 | 
					            sumsubaccts = sum $ map (snd . root) subbals
 | 
				
			||||||
      -- then do depth-clipping
 | 
					            subbals = map addbalances subs
 | 
				
			||||||
      exclusivebalmap = Map.union  -- subaccount-excluding balances for all accounts
 | 
					      inclbalmap = Map.fromList $ flatten $ addbalances ant
 | 
				
			||||||
               (Map.fromList [(a,(sumTransactions $ txnsof a)) | a <- allnames])
 | 
					      inclbalof = (inclbalmap !)
 | 
				
			||||||
               (Map.fromList [(a,Mixed []) | a <- anames])
 | 
					
 | 
				
			||||||
      inclusivebalanceof = (inclusivebalmap !)
 | 
					      -- and do depth-clipping
 | 
				
			||||||
      exclusivebalanceof = (exclusivebalmap !)
 | 
					      addexclbalances :: Tree AccountName -> Tree (AccountName, MixedAmount)
 | 
				
			||||||
      clippedanames = clipAccountNames depth anames
 | 
					      addexclbalances (Node a subs) = Node (a,sumtxns) subbals
 | 
				
			||||||
 | 
					          where
 | 
				
			||||||
 | 
					            sumtxns = sumTransactions $ txnsof a
 | 
				
			||||||
 | 
					            subbals = map addexclbalances subs
 | 
				
			||||||
 | 
					      exclbalmap = Map.fromList $ flatten $ addexclbalances ant
 | 
				
			||||||
 | 
					      exclbalof = (exclbalmap !)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      clippedanames = clipAccountNames depth txnanames
 | 
				
			||||||
      isclipped a = accountNameLevel a >= fromMaybe 9999 depth
 | 
					      isclipped a = accountNameLevel a >= fromMaybe 9999 depth
 | 
				
			||||||
      balancetoshowfor a = (if isclipped a then inclusivebalanceof else exclusivebalanceof) a
 | 
					      balancetoshowfor a =
 | 
				
			||||||
 | 
					          (if isclipped a then inclbalof else exclbalof) (if null a then "top" else a)
 | 
				
			||||||
      summaryts = [txn{account=a,amount=balancetoshowfor a} | a <- clippedanames]
 | 
					      summaryts = [txn{account=a,amount=balancetoshowfor a} | a <- clippedanames]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clipAccountNames :: Maybe Int -> [AccountName] -> [AccountName]
 | 
					clipAccountNames :: Maybe Int -> [AccountName] -> [AccountName]
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user