put query parsers first
This commit is contained in:
		
							parent
							
								
									0580ef69a3
								
							
						
					
					
						commit
						ddda6705c0
					
				| @ -9,13 +9,14 @@ module Hledger.Data.Query ( | ||||
|   -- * Query and QueryOpt | ||||
|   Query(..), | ||||
|   QueryOpt(..), | ||||
|   -- * parsing | ||||
|   parseQuery, | ||||
|   -- * accessors | ||||
|   queryIsNull, | ||||
|   queryStartDate, | ||||
|   queryIsStartDateOnly, | ||||
|   inAccount, | ||||
|   inAccountQuery, | ||||
|   -- * parsing | ||||
|   parseQuery, | ||||
|   -- * matching | ||||
|   matchesTransaction, | ||||
|   matchesPosting, | ||||
| @ -35,11 +36,9 @@ import Hledger.Utils | ||||
| import Hledger.Data.Types | ||||
| import Hledger.Data.AccountName | ||||
| import Hledger.Data.Amount | ||||
| -- import Hledger.Data.Commodity (canonicaliseCommodities) | ||||
| import Hledger.Data.Dates | ||||
| import Hledger.Data.Posting | ||||
| import Hledger.Data.Transaction | ||||
| -- import Hledger.Data.TimeLog | ||||
| 
 | ||||
| 
 | ||||
| -- | A query is a composition of search criteria, which can be used to | ||||
| @ -69,68 +68,7 @@ data QueryOpt = QueryOptInAcctOnly AccountName  -- ^ show an account register fo | ||||
|            -- | QueryOptEffectiveDate  -- ^ show effective dates instead of actual dates | ||||
|     deriving (Show, Eq) | ||||
| 
 | ||||
| -- | Does this query match everything ? | ||||
| queryIsNull Any = True | ||||
| queryIsNull (And []) = True | ||||
| queryIsNull (Not (Or [])) = True | ||||
| queryIsNull _ = False | ||||
| 
 | ||||
| -- | What start date does this query specify, if any ? | ||||
| -- If the query is an OR expression, returns the earliest of the alternatives. | ||||
| -- When the flag is true, look for a starting effective date instead. | ||||
| queryStartDate :: Bool -> Query -> Maybe Day | ||||
| queryStartDate effective (Or ms) = earliestMaybeDate $ map (queryStartDate effective) ms | ||||
| queryStartDate effective (And ms) = latestMaybeDate $ map (queryStartDate effective) ms | ||||
| queryStartDate False (Date (DateSpan (Just d) _)) = Just d | ||||
| queryStartDate True (EDate (DateSpan (Just d) _)) = Just d | ||||
| queryStartDate _ _ = Nothing | ||||
| 
 | ||||
| -- | 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 effective date instead. | ||||
| queryIsStartDateOnly :: Bool -> Query -> Bool | ||||
| queryIsStartDateOnly _ Any = False | ||||
| queryIsStartDateOnly _ None = False | ||||
| queryIsStartDateOnly effective (Or ms) = and $ map (queryIsStartDateOnly effective) ms | ||||
| queryIsStartDateOnly effective (And ms) = and $ map (queryIsStartDateOnly effective) ms | ||||
| queryIsStartDateOnly False (Date (DateSpan (Just _) _)) = True | ||||
| queryIsStartDateOnly True (EDate (DateSpan (Just _) _)) = True | ||||
| queryIsStartDateOnly _ _ = False | ||||
| 
 | ||||
| -- | What is the earliest of these dates, where Nothing is earliest ? | ||||
| earliestMaybeDate :: [Maybe Day] -> Maybe Day | ||||
| earliestMaybeDate = headDef Nothing . sortBy compareMaybeDates | ||||
| 
 | ||||
| -- | What is the latest of these dates, where Nothing is earliest ? | ||||
| latestMaybeDate :: [Maybe Day] -> Maybe Day | ||||
| latestMaybeDate = headDef Nothing . sortBy (flip compareMaybeDates) | ||||
| 
 | ||||
| -- | Compare two maybe dates, Nothing is earliest. | ||||
| compareMaybeDates :: Maybe Day -> Maybe Day -> Ordering | ||||
| compareMaybeDates Nothing Nothing = EQ | ||||
| compareMaybeDates Nothing (Just _) = LT | ||||
| compareMaybeDates (Just _) Nothing = GT | ||||
| compareMaybeDates (Just a) (Just b) = compare a b | ||||
| 
 | ||||
| -- | The account we are currently focussed on, if any, and whether subaccounts are included. | ||||
| -- Just looks at the first query option. | ||||
| inAccount :: [QueryOpt] -> Maybe (AccountName,Bool) | ||||
| inAccount [] = Nothing | ||||
| inAccount (QueryOptInAcctOnly a:_) = Just (a,False) | ||||
| inAccount (QueryOptInAcct a:_) = Just (a,True) | ||||
| 
 | ||||
| -- | A query for the account(s) we are currently focussed on, if any. | ||||
| -- Just looks at the first query option. | ||||
| inAccountQuery :: [QueryOpt] -> Maybe Query | ||||
| inAccountQuery [] = Nothing | ||||
| inAccountQuery (QueryOptInAcctOnly a:_) = Just $ Acct $ accountNameToAccountOnlyRegex a | ||||
| inAccountQuery (QueryOptInAcct a:_) = Just $ Acct $ accountNameToAccountRegex a | ||||
| 
 | ||||
| -- -- | Convert a query to its inverse. | ||||
| -- negateQuery :: Query -> Query | ||||
| -- negateQuery =  Not | ||||
| 
 | ||||
| -- query parsing | ||||
| -- parsing | ||||
| 
 | ||||
| -- -- | A query restricting the account(s) to be shown in the sidebar, if any. | ||||
| -- -- Just looks at the first query option. | ||||
| @ -269,7 +207,70 @@ parseBool s = s `elem` truestrings | ||||
| truestrings :: [String] | ||||
| truestrings = ["1","t","true"] | ||||
| 
 | ||||
| -- query matching | ||||
| -- * accessors | ||||
| 
 | ||||
| -- | Does this query match everything ? | ||||
| queryIsNull Any = True | ||||
| queryIsNull (And []) = True | ||||
| queryIsNull (Not (Or [])) = True | ||||
| queryIsNull _ = False | ||||
| 
 | ||||
| -- | What start date does this query specify, if any ? | ||||
| -- If the query is an OR expression, returns the earliest of the alternatives. | ||||
| -- When the flag is true, look for a starting effective date instead. | ||||
| queryStartDate :: Bool -> Query -> Maybe Day | ||||
| queryStartDate effective (Or ms) = earliestMaybeDate $ map (queryStartDate effective) ms | ||||
| queryStartDate effective (And ms) = latestMaybeDate $ map (queryStartDate effective) ms | ||||
| queryStartDate False (Date (DateSpan (Just d) _)) = Just d | ||||
| queryStartDate True (EDate (DateSpan (Just d) _)) = Just d | ||||
| queryStartDate _ _ = Nothing | ||||
| 
 | ||||
| -- | 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 effective date instead. | ||||
| queryIsStartDateOnly :: Bool -> Query -> Bool | ||||
| queryIsStartDateOnly _ Any = False | ||||
| queryIsStartDateOnly _ None = False | ||||
| queryIsStartDateOnly effective (Or ms) = and $ map (queryIsStartDateOnly effective) ms | ||||
| queryIsStartDateOnly effective (And ms) = and $ map (queryIsStartDateOnly effective) ms | ||||
| queryIsStartDateOnly False (Date (DateSpan (Just _) _)) = True | ||||
| queryIsStartDateOnly True (EDate (DateSpan (Just _) _)) = True | ||||
| queryIsStartDateOnly _ _ = False | ||||
| 
 | ||||
| -- | What is the earliest of these dates, where Nothing is earliest ? | ||||
| earliestMaybeDate :: [Maybe Day] -> Maybe Day | ||||
| earliestMaybeDate = headDef Nothing . sortBy compareMaybeDates | ||||
| 
 | ||||
| -- | What is the latest of these dates, where Nothing is earliest ? | ||||
| latestMaybeDate :: [Maybe Day] -> Maybe Day | ||||
| latestMaybeDate = headDef Nothing . sortBy (flip compareMaybeDates) | ||||
| 
 | ||||
| -- | Compare two maybe dates, Nothing is earliest. | ||||
| compareMaybeDates :: Maybe Day -> Maybe Day -> Ordering | ||||
| compareMaybeDates Nothing Nothing = EQ | ||||
| compareMaybeDates Nothing (Just _) = LT | ||||
| compareMaybeDates (Just _) Nothing = GT | ||||
| compareMaybeDates (Just a) (Just b) = compare a b | ||||
| 
 | ||||
| -- | The account we are currently focussed on, if any, and whether subaccounts are included. | ||||
| -- Just looks at the first query option. | ||||
| inAccount :: [QueryOpt] -> Maybe (AccountName,Bool) | ||||
| inAccount [] = Nothing | ||||
| inAccount (QueryOptInAcctOnly a:_) = Just (a,False) | ||||
| inAccount (QueryOptInAcct a:_) = Just (a,True) | ||||
| 
 | ||||
| -- | A query for the account(s) we are currently focussed on, if any. | ||||
| -- Just looks at the first query option. | ||||
| inAccountQuery :: [QueryOpt] -> Maybe Query | ||||
| inAccountQuery [] = Nothing | ||||
| inAccountQuery (QueryOptInAcctOnly a:_) = Just $ Acct $ accountNameToAccountOnlyRegex a | ||||
| inAccountQuery (QueryOptInAcct a:_) = Just $ Acct $ accountNameToAccountRegex a | ||||
| 
 | ||||
| -- -- | Convert a query to its inverse. | ||||
| -- negateQuery :: Query -> Query | ||||
| -- negateQuery =  Not | ||||
| 
 | ||||
| -- matching | ||||
| 
 | ||||
| -- | Does the match expression match this posting ? | ||||
| matchesPosting :: Query -> Posting -> Bool | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user