A general query system for matching things (accounts, postings, transactions..) by various criteria, and a parser for query expressions.
- data Query
- data QueryOpt
- parseQuery :: Day -> String -> (Query, [QueryOpt])
- simplifyQuery :: Query -> Query
- filterQuery :: (Query -> Bool) -> Query -> Query
- queryIsNull :: Query -> Bool
- queryIsAcct :: Query -> Bool
- queryIsDepth :: Query -> Bool
- queryIsDate :: Query -> Bool
- queryIsStartDateOnly :: Bool -> Query -> Bool
- queryIsSym :: Query -> Bool
- queryStartDate :: Bool -> Query -> Maybe Day
- queryDateSpan :: Bool -> Query -> DateSpan
- queryDepth :: Query -> Int
- queryEmpty :: Query -> Bool
- inAccount :: [QueryOpt] -> Maybe (AccountName, Bool)
- inAccountQuery :: [QueryOpt] -> Maybe Query
- matchesTransaction :: Query -> Transaction -> Bool
- matchesPosting :: Query -> Posting -> Bool
- matchesAccount :: Query -> AccountName -> Bool
- matchesMixedAmount :: Query -> MixedAmount -> Bool
- matchesAmount :: Query -> Amount -> Bool
- words'' :: [String] -> String -> [String]
- tests_Hledger_Query :: Test
Query and QueryOpt
A query is a composition of search criteria, which can be used to match postings, transactions, accounts and more.
negate this match
match if any of these match
match if all of these match
match if code matches this regexp
match if description matches this regexp
match postings whose account matches this regexp
match if primary date in this date span
match if secondary date in this date span
match if cleared status has this value
match if realness (involves a real non-virtual account ?) has this value
|Amt OrdPlus Quantity|
match if the amount's numeric quantity is less thangreater thanequal to/unsignedly equal to some value
match if the entire commodity symbol is matched by this regexp
if true, show zero-amount postings/accounts which are usually not shown more of a query option than a query criteria ?
match if account depth is less than or equal to this value
|Tag String (Maybe String)|
match if a tag with this exact name, and with value matching the regexp if provided, exists
A query option changes a query's/report's behaviour and output in some way.
show an account register focussed on this account
as above but include sub-accounts in the account register | QueryOptCostBasis -- ^ show amounts converted to cost where possible | QueryOptDate2 -- ^ show secondary dates instead of primary dates
Convert a query expression containing zero or more space-separated terms to a query and zero or more query options. A query term is either:
- a search pattern, which matches on one or more fields, eg:
acct:REGEXP - match the account name with a regular expression desc:REGEXP - match the transaction description date:PERIODEXP - match the date with a period expression
The prefix indicates the field to match, or if there is no prefix account name is assumed.
- a query option, which modifies the reporting behaviour in some way. There is currently one of these, which may appear only once:
The usual shell quoting rules are assumed. When a pattern contains whitespace, it (or the whole term including prefix) should be enclosed in single or double quotes.
Period expressions may contain relative dates, so a reference date is required to fully parse these.
Multiple terms are combined as follows: 1. multiple account patterns are OR'd together 2. multiple description patterns are OR'd together 3. then all terms are AND'd together
Remove query terms (or whole sub-expressions) not matching the given predicate from this query. XXX Semantics not yet clear.
Does this query specify a start date and nothing else (that would filter postings prior to the date) ? When the flag is true, look for a starting secondary date instead.
What start date (or secondary date) does this query specify, if any ? For OR expressions, use the earliest of the dates. NOT is ignored.
What date span (or secondary date span) does this query specify ? For OR expressions, use the widest possible span. NOT is ignored.
The empty (zero amount) status specified by this query, defaulting to false.
The account we are currently focussed on, if any, and whether subaccounts are included. Just looks at the first query option.
A query for the account(s) we are currently focussed on, if any. Just looks at the first query option.
Does the match expression match this transaction ?
Does the match expression match this account ? A matching in: clause is also considered a match.
Does the match expression match this (simple) amount ?
Quote-and-prefix-aware version of words - don't split on spaces which are inside quotes, including quotes which may have one of the specified prefixes in front, and maybe an additional not: prefix in front of that.