fix: accounts: a tag: query only matches account tags, not posting tags
Eg, `hledger accounts tag:t` lists only account a from this journal:
account a ; t:
2025-01-01
a 1
b -1 ; t:
This commit is contained in:
parent
aabc892277
commit
f604b7a416
@ -98,6 +98,7 @@ module Hledger.Data.Journal (
|
|||||||
journalAccountTypes,
|
journalAccountTypes,
|
||||||
journalAddAccountTypes,
|
journalAddAccountTypes,
|
||||||
journalPostingsAddAccountTags,
|
journalPostingsAddAccountTags,
|
||||||
|
journalPostingsKeepAccountTagsOnly,
|
||||||
defaultBaseConversionAccount,
|
defaultBaseConversionAccount,
|
||||||
-- journalPrices,
|
-- journalPrices,
|
||||||
journalBaseConversionAccount,
|
journalBaseConversionAccount,
|
||||||
@ -114,7 +115,7 @@ module Hledger.Data.Journal (
|
|||||||
-- * Tests
|
-- * Tests
|
||||||
samplejournal,
|
samplejournal,
|
||||||
samplejournalMaybeExplicit,
|
samplejournalMaybeExplicit,
|
||||||
tests_Journal
|
tests_Journal,
|
||||||
--
|
--
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
@ -642,6 +643,13 @@ journalPostingsAddAccountTags :: Journal -> Journal
|
|||||||
journalPostingsAddAccountTags j = journalMapPostings addtags j
|
journalPostingsAddAccountTags j = journalMapPostings addtags j
|
||||||
where addtags p = p `postingAddTags` (journalInheritedAccountTags j $ paccount p)
|
where addtags p = p `postingAddTags` (journalInheritedAccountTags j $ paccount p)
|
||||||
|
|
||||||
|
-- | Remove all tags from the journal's postings except those provided by their account.
|
||||||
|
-- This is useful for the accounts report.
|
||||||
|
-- It does not remove tag declarations from the posting comments.
|
||||||
|
journalPostingsKeepAccountTagsOnly :: Journal -> Journal
|
||||||
|
journalPostingsKeepAccountTagsOnly j = journalMapPostings keepaccounttags j
|
||||||
|
where keepaccounttags p = p{ptags=[]} `postingAddTags` (journalInheritedAccountTags j $ paccount p)
|
||||||
|
|
||||||
-- | The account name to use for conversion postings generated by --infer-equity.
|
-- | The account name to use for conversion postings generated by --infer-equity.
|
||||||
-- This is the first account declared with type V/Conversion,
|
-- This is the first account declared with type V/Conversion,
|
||||||
-- or otherwise the defaultBaseConversionAccount (equity:conversion).
|
-- or otherwise the defaultBaseConversionAccount (equity:conversion).
|
||||||
|
|||||||
@ -62,12 +62,16 @@ accounts opts@CliOpts{rawopts_=rawopts, reportspec_=ReportSpec{_rsQuery=query,_r
|
|||||||
types = boolopt "types" rawopts
|
types = boolopt "types" rawopts
|
||||||
positions = boolopt "positions" rawopts
|
positions = boolopt "positions" rawopts
|
||||||
directives = boolopt "directives" rawopts
|
directives = boolopt "directives" rawopts
|
||||||
|
-- Modified queries. These may not work with boolean queries (#2371).
|
||||||
-- a depth limit will clip and exclude account names later, but we don't want to exclude accounts at this stage
|
-- a depth limit will clip and exclude account names later, but we don't want to exclude accounts at this stage
|
||||||
nodepthq = dbg4 "nodepthq" $ filterQuery (not . queryIsDepth) query
|
nodepthq = dbg4 "nodepthq" $ filterQuery (not . queryIsDepth) query
|
||||||
-- just the acct: part of the query will be reapplied later, after clipping
|
-- just the acct: part of the query will be reapplied later, after clipping
|
||||||
acctq = dbg4 "acctq" $ filterQuery queryIsAcct query
|
acctq = dbg4 "acctq" $ filterQuery queryIsAcct query
|
||||||
dep = dbg4 "depth" $ queryDepth $ filterQuery queryIsDepth query
|
dep = dbg4 "depth" $ queryDepth $ filterQuery queryIsDepth query
|
||||||
matchedused = dbg5 "matchedused" $ nub $ map paccount $ journalPostings $ filterJournalPostings nodepthq j
|
-- when finding accounts used by postings, we remove tags that were declared on the posting,
|
||||||
|
-- so that a tag: query will match account tags and not posting tags.
|
||||||
|
matchedused = dbg5 "matchedused" $ nub $ map paccount $ journalPostings $
|
||||||
|
filterJournalPostings nodepthq $ journalPostingsKeepAccountTagsOnly j
|
||||||
matcheddeclared = dbg5 "matcheddeclared" $
|
matcheddeclared = dbg5 "matcheddeclared" $
|
||||||
nub $
|
nub $
|
||||||
filter (matchesAccountExtra (journalAccountType j) (journalInheritedAccountTags j) nodepthq) $
|
filter (matchesAccountExtra (journalAccountType j) (journalInheritedAccountTags j) nodepthq) $
|
||||||
|
|||||||
@ -92,3 +92,14 @@ trade:A-B:A
|
|||||||
trade:A-B:B
|
trade:A-B:B
|
||||||
a
|
a
|
||||||
b
|
b
|
||||||
|
|
||||||
|
# ** 11. A tag: query only matches account tags, not posting tags.
|
||||||
|
<
|
||||||
|
account a ; t:
|
||||||
|
|
||||||
|
2025-01-01
|
||||||
|
a 1
|
||||||
|
b -1 ; t:
|
||||||
|
|
||||||
|
$ hledger -f- accounts tag:t
|
||||||
|
a
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user