begin more powerful query expressions (filter patterns)

This commit is contained in:
Simon Michael 2011-06-03 23:14:26 +00:00
parent dc7a692a19
commit aa41350a16
2 changed files with 40 additions and 1 deletions

View File

@ -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

View File

@ -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)