begin more powerful query expressions (filter patterns)
This commit is contained in:
		
							parent
							
								
									dc7a692a19
								
							
						
					
					
						commit
						aa41350a16
					
				| @ -98,6 +98,31 @@ journalAccountNameTree = accountNameTreeFrom . journalAccountNames | ||||
| -- Various kinds of filtering on journals. We do it differently depending | ||||
| -- on the command. | ||||
| 
 | ||||
| ------------------------------------------------------------------------------- | ||||
| -- filtering V2 | ||||
| 
 | ||||
| -- | Keep only transactions matching the query expression. | ||||
| -- filterJournalTransactions2 :: Matcher -> Journal -> Journal | ||||
| -- filterJournalTransactions2 = undefined | ||||
| -- pats j@Journal{jtxns=ts} = j{jtxns=filter matchdesc ts} | ||||
| --     where matchdesc = matchpats pats . tdescription | ||||
| 
 | ||||
| -- | Keep only postings matching the query expression. | ||||
| -- This can leave unbalanced transactions. | ||||
| filterJournalPostings2 :: Matcher -> Journal -> Journal | ||||
| filterJournalPostings2 m j@Journal{jtxns=ts} = j{jtxns=map filterpostings ts} | ||||
|     where filterpostings t@Transaction{tpostings=ps} = t{tpostings=filter (m `matches`) ps} | ||||
| 
 | ||||
| matches :: Matcher -> Posting -> Bool | ||||
| matches (MatchOr ms) p = any (`matches` p) ms | ||||
| matches (MatchAnd ms) p = all (`matches` p) ms | ||||
| matches (MatchAcct True r) p = containsRegex r $ paccount p | ||||
| matches (MatchAcct False r) p = not $ matches (MatchAcct True r) p | ||||
| matches _ _ = False | ||||
| 
 | ||||
| ------------------------------------------------------------------------------- | ||||
| -- filtering V1 | ||||
| 
 | ||||
| -- | Keep only transactions we are interested in, as described by the | ||||
| -- filter specification. | ||||
| filterJournalTransactions :: FilterSpec -> Journal -> Journal | ||||
|  | ||||
| @ -187,7 +187,7 @@ data Account = Account { | ||||
|       abalance :: MixedAmount    -- ^ sum of postings in this account and subaccounts | ||||
|     } | ||||
| 
 | ||||
| -- | A generic, pure specification of how to filter transactions and postings. | ||||
| -- | A generic, pure specification of how to filter (or search) transactions and postings. | ||||
| data FilterSpec = FilterSpec { | ||||
|      datespan  :: DateSpan   -- ^ only include if in this date span | ||||
|     ,cleared   :: Maybe Bool -- ^ only include if cleared\/uncleared\/don't care | ||||
| @ -198,3 +198,17 @@ data FilterSpec = FilterSpec { | ||||
|     ,depth     :: Maybe Int | ||||
|     } deriving (Show) | ||||
| 
 | ||||
| -- | A more general way to match transactions and postings, successor to FilterSpec. (?) | ||||
| -- If the first boolean is False, it's a negative match. | ||||
| data Matcher = MatchDesc Bool String          -- ^ match if description matches this regexp | ||||
|              | MatchAcct Bool String          -- ^ match postings whose account matches this regexp | ||||
|              | MatchOtherAcct Bool String -- ^ match postings whose transaction contains a posting to an account matching this regexp | ||||
|              | MatchADate Bool DateSpan   -- ^ match if actual date in this date span | ||||
|              | MatchEDate Bool DateSpan   -- ^ match if effective date in this date span | ||||
|              | MatchStatus Bool Bool      -- ^ match if cleared status has this value | ||||
|              | MatchReal Bool Bool        -- ^ match if "realness" (involves a real non-virtual account ?) has this value | ||||
|              | MatchEmpty Bool Bool       -- ^ match if "emptiness" (amount is zero ?) has this value | ||||
|              | MatchDepth Bool Int        -- ^ match if account depth is less than or equal to this value | ||||
|              | MatchAnd [Matcher]         -- ^ match if all match | ||||
|              | MatchOr [Matcher]          -- ^ match if any match | ||||
|     deriving (Show) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user