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
|
-- Various kinds of filtering on journals. We do it differently depending
|
||||||
-- on the command.
|
-- 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
|
-- | Keep only transactions we are interested in, as described by the
|
||||||
-- filter specification.
|
-- filter specification.
|
||||||
filterJournalTransactions :: FilterSpec -> Journal -> Journal
|
filterJournalTransactions :: FilterSpec -> Journal -> Journal
|
||||||
|
|||||||
@ -187,7 +187,7 @@ data Account = Account {
|
|||||||
abalance :: MixedAmount -- ^ sum of postings in this account and subaccounts
|
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 {
|
data FilterSpec = FilterSpec {
|
||||||
datespan :: DateSpan -- ^ only include if in this date span
|
datespan :: DateSpan -- ^ only include if in this date span
|
||||||
,cleared :: Maybe Bool -- ^ only include if cleared\/uncleared\/don't care
|
,cleared :: Maybe Bool -- ^ only include if cleared\/uncleared\/don't care
|
||||||
@ -198,3 +198,17 @@ data FilterSpec = FilterSpec {
|
|||||||
,depth :: Maybe Int
|
,depth :: Maybe Int
|
||||||
} deriving (Show)
|
} 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