parent
							
								
									0142482834
								
							
						
					
					
						commit
						c138c35d3b
					
				| @ -19,11 +19,14 @@ module Hledger.Query ( | |||||||
|   queryIsAcct, |   queryIsAcct, | ||||||
|   queryIsDepth, |   queryIsDepth, | ||||||
|   queryIsDate, |   queryIsDate, | ||||||
|  |   queryIsDate2, | ||||||
|  |   queryIsDateOrDate2, | ||||||
|   queryIsStartDateOnly, |   queryIsStartDateOnly, | ||||||
|   queryIsSym, |   queryIsSym, | ||||||
|   queryStartDate, |   queryStartDate, | ||||||
|   queryEndDate, |   queryEndDate, | ||||||
|   queryDateSpan, |   queryDateSpan, | ||||||
|  |   queryDateSpan', | ||||||
|   queryDepth, |   queryDepth, | ||||||
|   queryEmpty, |   queryEmpty, | ||||||
|   inAccount, |   inAccount, | ||||||
| @ -415,9 +418,17 @@ queryIsDepth _ = False | |||||||
| 
 | 
 | ||||||
| queryIsDate :: Query -> Bool | queryIsDate :: Query -> Bool | ||||||
| queryIsDate (Date _) = True | queryIsDate (Date _) = True | ||||||
| queryIsDate (Date2 _) = True |  | ||||||
| queryIsDate _ = False | queryIsDate _ = False | ||||||
| 
 | 
 | ||||||
|  | queryIsDate2 :: Query -> Bool | ||||||
|  | queryIsDate2 (Date2 _) = True | ||||||
|  | queryIsDate2 _ = False | ||||||
|  | 
 | ||||||
|  | queryIsDateOrDate2 :: Query -> Bool | ||||||
|  | queryIsDateOrDate2 (Date _) = True | ||||||
|  | queryIsDateOrDate2 (Date2 _) = True | ||||||
|  | queryIsDateOrDate2 _ = False | ||||||
|  | 
 | ||||||
| queryIsDesc :: Query -> Bool | queryIsDesc :: Query -> Bool | ||||||
| queryIsDesc (Desc _) = True | queryIsDesc (Desc _) = True | ||||||
| queryIsDesc _ = False | queryIsDesc _ = False | ||||||
| @ -477,6 +488,20 @@ queryDateSpans False (Date span) = [span] | |||||||
| queryDateSpans True (Date2 span) = [span] | queryDateSpans True (Date2 span) = [span] | ||||||
| queryDateSpans _ _ = [] | queryDateSpans _ _ = [] | ||||||
| 
 | 
 | ||||||
|  | -- | What date span (or secondary date span) does this query specify ? | ||||||
|  | -- For OR expressions, use the widest possible span. NOT is ignored. | ||||||
|  | queryDateSpan' :: Query -> DateSpan | ||||||
|  | queryDateSpan' q = spansUnion $ queryDateSpans' q | ||||||
|  | 
 | ||||||
|  | -- | Extract all date (or secondary date) spans specified in this query. | ||||||
|  | -- NOT is ignored. | ||||||
|  | queryDateSpans' :: Query -> [DateSpan] | ||||||
|  | queryDateSpans' (Or qs) = concatMap queryDateSpans' qs | ||||||
|  | queryDateSpans' (And qs) = concatMap queryDateSpans' qs | ||||||
|  | queryDateSpans' (Date span) = [span] | ||||||
|  | queryDateSpans' (Date2 span) = [span] | ||||||
|  | queryDateSpans' _ = [] | ||||||
|  | 
 | ||||||
| -- | What is the earliest of these dates, where Nothing is latest ? | -- | What is the earliest of these dates, where Nothing is latest ? | ||||||
| earliestMaybeDate :: [Maybe Day] -> Maybe Day | earliestMaybeDate :: [Maybe Day] -> Maybe Day | ||||||
| earliestMaybeDate mds = head $ sortBy compareMaybeDates mds ++ [Nothing] | earliestMaybeDate mds = head $ sortBy compareMaybeDates mds ++ [Nothing] | ||||||
|  | |||||||
| @ -71,7 +71,7 @@ multiBalanceReport opts q j = MultiBalanceReport (displayspans, items, totals) | |||||||
|       depthq     = dbg "depthq" $ filterQuery queryIsDepth q |       depthq     = dbg "depthq" $ filterQuery queryIsDepth q | ||||||
|       depth      = queryDepth depthq |       depth      = queryDepth depthq | ||||||
|       depthless  = dbg "depthless" . filterQuery (not . queryIsDepth) |       depthless  = dbg "depthless" . filterQuery (not . queryIsDepth) | ||||||
|       datelessq  = dbg "datelessq"  $ filterQuery (not . queryIsDate) q |       datelessq  = dbg "datelessq"  $ filterQuery (not . queryIsDateOrDate2) q | ||||||
|       dateqcons  = if date2_ opts then Date2 else Date |       dateqcons  = if date2_ opts then Date2 else Date | ||||||
|       precedingq = dbg "precedingq" $ And [datelessq, dateqcons $ DateSpan Nothing (spanStart reportspan)] |       precedingq = dbg "precedingq" $ And [datelessq, dateqcons $ DateSpan Nothing (spanStart reportspan)] | ||||||
|       requestedspan  = dbg "requestedspan"  $ queryDateSpan (date2_ opts) q                              -- span specified by -b/-e/-p options and query args |       requestedspan  = dbg "requestedspan"  $ queryDateSpan (date2_ opts) q                              -- span specified by -b/-e/-p options and query args | ||||||
|  | |||||||
| @ -57,12 +57,13 @@ postingsReport opts q j = (totallabel, items) | |||||||
|       symq = dbg "symq"   $ filterQuery queryIsSym $ dbg "requested q" q |       symq = dbg "symq"   $ filterQuery queryIsSym $ dbg "requested q" q | ||||||
|       depth = queryDepth q |       depth = queryDepth q | ||||||
|       depthless = filterQuery (not . queryIsDepth) |       depthless = filterQuery (not . queryIsDepth) | ||||||
|       datelessq = filterQuery (not . queryIsDate) q |       datelessq = filterQuery (not . queryIsDateOrDate2) q | ||||||
|       (dateqcons,pdate) | date2_ opts = (Date2, postingDate2) |       -- XXX date:/date2:/--date2 handling is not robust, combinations of these can confuse it | ||||||
|  |       dateq = filterQuery queryIsDateOrDate2 q | ||||||
|  |       (dateqcons,pdate) | queryIsDate2 dateq || (queryIsDate dateq && date2_ opts) = (Date2, postingDate2) | ||||||
|                         | otherwise = (Date, postingDate) |                         | otherwise = (Date, postingDate) | ||||||
|       requestedspan  = dbg "requestedspan"  $ queryDateSpan (date2_ opts) q   -- span specified by -b/-e/-p options and query args |       requestedspan  = dbg "requestedspan"  $ queryDateSpan' q   -- span specified by -b/-e/-p options and query args | ||||||
|                                                                               -- XXX doesn't handle date2: |       requestedspan' = dbg "requestedspan'" $ requestedspan `spanDefaultsFrom` journalDateSpan ({-date2_ opts-} False) j  -- if open-ended, close it using the journal's end dates | ||||||
|       requestedspan' = dbg "requestedspan'" $ requestedspan `spanDefaultsFrom` journalDateSpan (date2_ opts) j  -- if open-ended, close it using the journal's end dates |  | ||||||
|       intervalspans  = dbg "intervalspans"  $ splitSpan (intervalFromOpts opts) requestedspan' -- interval spans enclosing it |       intervalspans  = dbg "intervalspans"  $ splitSpan (intervalFromOpts opts) requestedspan' -- interval spans enclosing it | ||||||
|       reportstart    = dbg "reportstart"    $ maybe Nothing spanStart $ headMay intervalspans |       reportstart    = dbg "reportstart"    $ maybe Nothing spanStart $ headMay intervalspans | ||||||
|       reportend      = dbg "reportend"      $ maybe Nothing spanEnd   $ lastMay intervalspans |       reportend      = dbg "reportend"      $ maybe Nothing spanEnd   $ lastMay intervalspans | ||||||
|  | |||||||
| @ -1,48 +0,0 @@ | |||||||
| # filtering by secondary date (cf #201) |  | ||||||
| 
 |  | ||||||
| # 1. -b/-e/-p match the secondary date if --date2 is present |  | ||||||
| hledgerdev -f- register -p 2014/1/2 --date2 |  | ||||||
| <<< |  | ||||||
| 2014/1/1=1/2 |  | ||||||
|   (a)  1 |  | ||||||
| 
 |  | ||||||
| 2014/1/3 |  | ||||||
|   (b)  1 |  | ||||||
| >>> |  | ||||||
| 2014/01/02                      (a)                              1             1 |  | ||||||
| >>>=0 |  | ||||||
| 
 |  | ||||||
| # 2. date: is not affected by --date2 |  | ||||||
| hledgerdev -f- register date:2014/1/2 --date2 |  | ||||||
| <<< |  | ||||||
| 2014/1/1=1/2 |  | ||||||
|   (a)  1 |  | ||||||
| 
 |  | ||||||
| 2014/1/3 |  | ||||||
|   (b)  1 |  | ||||||
| >>> |  | ||||||
| >>>=0 |  | ||||||
| 
 |  | ||||||
| # 3. date2: matches the secondary date |  | ||||||
| hledgerdev -f- register date2:2014/1/2 |  | ||||||
| <<< |  | ||||||
| 2014/1/1=1/2 |  | ||||||
|   (a)  1 |  | ||||||
| 
 |  | ||||||
| 2014/1/3 |  | ||||||
|   (b)  1 |  | ||||||
| >>> |  | ||||||
| 2014/01/02                      (a)                              1             1 |  | ||||||
| >>>=0 |  | ||||||
| 
 |  | ||||||
| # 4. date2: is not affected by --date2 |  | ||||||
| hledgerdev -f- register date2:2014/1/1 --date2 |  | ||||||
| <<< |  | ||||||
| 2014/1/1=1/2 |  | ||||||
|   (a)  1 |  | ||||||
| 
 |  | ||||||
| 2014/1/3 |  | ||||||
|   (b)  1 |  | ||||||
| >>> |  | ||||||
| >>>=0 |  | ||||||
| 
 |  | ||||||
| @ -1,3 +1,4 @@ | |||||||
|  | # 1. | ||||||
| hledgerdev -f - register --date2 | hledgerdev -f - register --date2 | ||||||
| <<< | <<< | ||||||
| 2009/1/1=2010/1/1 x | 2009/1/1=2010/1/1 x | ||||||
| @ -7,3 +8,63 @@ hledgerdev -f - register --date2 | |||||||
| 2010/01/01 x                    a                                1             1 | 2010/01/01 x                    a                                1             1 | ||||||
|                                 b                               -1             0 |                                 b                               -1             0 | ||||||
| >>>=0 | >>>=0 | ||||||
|  | 
 | ||||||
|  | # 2. -b/-e/-p match the secondary date if --date2 is present (also, the secondary date is displayed) | ||||||
|  | hledgerdev -f- register -p 2014/1/2 --date2 | ||||||
|  | <<< | ||||||
|  | 2014/1/1=1/2 | ||||||
|  |   (a)  1 | ||||||
|  | 
 | ||||||
|  | 2014/1/3 | ||||||
|  |   (b)  1 | ||||||
|  | >>> | ||||||
|  | 2014/01/02                      (a)                              1             1 | ||||||
|  | >>>=0 | ||||||
|  | 
 | ||||||
|  | # 3. date: matches the secondary date if --date2 is present (on the command line, at least) | ||||||
|  | hledgerdev -f- register date:2014/1/2 --date2 | ||||||
|  | <<< | ||||||
|  | 2014/1/1=1/2 | ||||||
|  |   (a)  1 | ||||||
|  | 
 | ||||||
|  | 2014/1/3 | ||||||
|  |   (b)  1 | ||||||
|  | >>> | ||||||
|  | 2014/01/02                      (a)                              1             1 | ||||||
|  | >>>=0 | ||||||
|  | 
 | ||||||
|  | # 4. date2: matches the secondary date | ||||||
|  | hledgerdev -f- register date2:2014/1/2 | ||||||
|  | <<< | ||||||
|  | 2014/1/1=1/2 | ||||||
|  |   (a)  1 | ||||||
|  | 
 | ||||||
|  | 2014/1/3 | ||||||
|  |   (b)  1 | ||||||
|  | >>> | ||||||
|  | 2014/01/01                      (a)                              1             1 | ||||||
|  | >>>=0 | ||||||
|  | 
 | ||||||
|  | # 5. you need to add --date2 if you also want the secondary date displayed | ||||||
|  | hledgerdev -f- register date2:2014/1/2 --date2 | ||||||
|  | <<< | ||||||
|  | 2014/1/1=1/2 | ||||||
|  |   (a)  1 | ||||||
|  | 
 | ||||||
|  | 2014/1/3 | ||||||
|  |   (b)  1 | ||||||
|  | >>> | ||||||
|  | 2014/01/02                      (a)                              1             1 | ||||||
|  | >>>=0 | ||||||
|  | 
 | ||||||
|  | # 3. date2: matching is not affected by --date2 | ||||||
|  | hledgerdev -f- register date2:2014/1/1 --date2 | ||||||
|  | <<< | ||||||
|  | 2014/1/1=1/2 | ||||||
|  |   (a)  1 | ||||||
|  | 
 | ||||||
|  | 2014/1/3 | ||||||
|  |   (b)  1 | ||||||
|  | >>> | ||||||
|  | >>>=0 | ||||||
|  | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user