From 762ced6734e775e0a23f29e34198840beec278a2 Mon Sep 17 00:00:00 2001 From: bth Date: Mon, 8 Jun 2026 20:09:12 -0700 Subject: [PATCH] tag : simplify nil handling --- tag/process.go | 31 ++++++++++--------------------- tag/tag_test.go | 9 +++++++++ 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/tag/process.go b/tag/process.go index 0ba9f8b..1490f53 100644 --- a/tag/process.go +++ b/tag/process.go @@ -34,7 +34,7 @@ func dateRange(entries []Entry, date string) []Entry { func processQueries(tagmap map[string]Set, query Query) Set { set := Set{} // sanity check: - if len(query.Tags) < 1 { + if len(query.Tags) == 0 { return set } @@ -42,6 +42,11 @@ func processQueries(tagmap map[string]Set, query Query) Set { q := query.Tags[0] // NOTE: clone so that we don't accidentally overwrite the incoming tagmap set = maps.Clone(tagmap[q]) + // if first query matches nothing: set will be nil and Union will fail: + // TODO: solve this in set.Union by moving to pointer receiver. + if set == nil { + set = Set{} + } // empty query // TODO: do I want to handle WILD and a tag? Actual regex? @@ -50,32 +55,16 @@ func processQueries(tagmap map[string]Set, query Query) Set { set.Union(slices.Collect(maps.Values(tagmap))...) return set } - // no need for set logic in this case: + // non-empty query of single tag: no need for set logic: if len(query.Tags) == 1 { return set } - // if first query matches nothing: set will be nil and Union will fail: - // TODO: solve this in set.Union by moving to pointer receiver. - if set == nil { - for _, t := range query.Tags { - if tagmap[t] != nil { - set = tagmap[t] - break - } - } - } - // all tagmap[q] are still nil: - if set == nil { - return set - } - - for i := 0; i < len(query.Tags); i++ { - q = query.Tags[i] + for _, t := range query.Tags { switch query.Op { case OR: - set.Union(tagmap[q]) + set.Union(tagmap[t]) case AND: - set.Intersect(tagmap[q]) + set.Intersect(tagmap[t]) } } return set diff --git a/tag/tag_test.go b/tag/tag_test.go index ede0ffd..a6ba58f 100644 --- a/tag/tag_test.go +++ b/tag/tag_test.go @@ -89,6 +89,15 @@ func TestBadTag(t *testing.T) { assert.False(t, ok) } +func TestBadTagOr(t *testing.T) { + entries := entriesGlobOrStdin(TEST_PATTERN) + tagmap := makeTagmap(entries) + queries := parseQuery("flob,bar") + fs := processQueries(tagmap, queries) + expected := Set{"01.foo.md": true, "02.foo.md": true, "03.bar.md": true} + assert.Equal(t, expected, fs) +} + // Since entriesGlobOrStdin() involves filesystem reads, we test the underlying logic. func BenchmarkParseContent(b *testing.B) { e := entriesGlobOrStdin(TEST_PATTERN)[0]