From daee8575d9fd25f93999ece2c8c26ea1b7f197b9 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Fri, 19 Dec 2025 06:52:46 -0300 Subject: [PATCH] filter.GetTheoreticalLimit() to encompass the actual limit specified in the filter. --- eventstore/bleve/query.go | 9 ++++----- eventstore/boltdb/query.go | 5 +---- eventstore/lmdb/query.go | 5 +---- eventstore/mmm/query.go | 5 +---- eventstore/slicestore/lib.go | 8 +++++--- filter.go | 8 ++++++++ filter_test.go | 3 +++ 7 files changed, 23 insertions(+), 20 deletions(-) diff --git a/eventstore/bleve/query.go b/eventstore/bleve/query.go index de5017d..892116d 100644 --- a/eventstore/bleve/query.go +++ b/eventstore/bleve/query.go @@ -11,11 +11,10 @@ import ( func (b *BleveBackend) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[nostr.Event] { return func(yield func(nostr.Event) bool) { - limit := maxLimit - if filter.LimitZero { + if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 { return - } else if filter.Limit > 0 && filter.Limit < limit { - limit = filter.Limit + } else if tlimit < maxLimit { + maxLimit = tlimit } if len(filter.Search) < 2 { @@ -72,7 +71,7 @@ func (b *BleveBackend) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[n } req := bleve.NewSearchRequest(q) - req.Size = limit + req.Size = maxLimit req.From = 0 result, err := b.index.Search(req) diff --git a/eventstore/boltdb/query.go b/eventstore/boltdb/query.go index c7b0674..a18fd1a 100644 --- a/eventstore/boltdb/query.go +++ b/eventstore/boltdb/query.go @@ -30,14 +30,11 @@ func (b *BoltBackend) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[no } // max number of events we'll return - if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 || filter.LimitZero { + if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 { return } else if tlimit < maxLimit { maxLimit = tlimit } - if filter.Limit > 0 && filter.Limit < maxLimit { - maxLimit = filter.Limit - } // do a normal query based on various filters if err := b.DB.View(func(txn *bbolt.Tx) error { diff --git a/eventstore/lmdb/query.go b/eventstore/lmdb/query.go index 23a77f9..ac6580e 100644 --- a/eventstore/lmdb/query.go +++ b/eventstore/lmdb/query.go @@ -31,14 +31,11 @@ func (b *LMDBBackend) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[no } // max number of events we'll return - if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 || filter.LimitZero { + if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 { return } else if tlimit < maxLimit { maxLimit = tlimit } - if filter.Limit > 0 && filter.Limit < maxLimit { - maxLimit = filter.Limit - } // do a normal query based on various filters if err := b.lmdbEnv.View(func(txn *lmdb.Txn) error { diff --git a/eventstore/mmm/query.go b/eventstore/mmm/query.go index ae40d34..26729f0 100644 --- a/eventstore/mmm/query.go +++ b/eventstore/mmm/query.go @@ -96,14 +96,11 @@ func (il *IndexingLayer) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq } // max number of events we'll return - if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 || filter.LimitZero { + if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 { return } else if tlimit < maxLimit { maxLimit = tlimit } - if filter.Limit > 0 && filter.Limit < maxLimit { - maxLimit = filter.Limit - } il.lmdbEnv.View(func(txn *lmdb.Txn) error { txn.RawRead = true diff --git a/eventstore/slicestore/lib.go b/eventstore/slicestore/lib.go index f7ee806..f25c62d 100644 --- a/eventstore/slicestore/lib.go +++ b/eventstore/slicestore/lib.go @@ -29,8 +29,10 @@ func (b *SliceStore) Close() {} func (b *SliceStore) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[nostr.Event] { return func(yield func(nostr.Event) bool) { - if filter.Limit > maxLimit || (filter.Limit == 0 && !filter.LimitZero) { - filter.Limit = maxLimit + if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 { + return + } else if tlimit < maxLimit { + maxLimit = tlimit } // efficiently determine where to start and end @@ -50,7 +52,7 @@ func (b *SliceStore) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[nos count := 0 for _, event := range b.internal[start:end] { - if count == filter.Limit { + if count == maxLimit { break } diff --git a/filter.go b/filter.go index fa9c8ac..c5e5311 100644 --- a/filter.go +++ b/filter.go @@ -183,5 +183,13 @@ func (filter Filter) GetTheoreticalLimit() int { } } + if filter.Limit > 0 { + return filter.Limit + } + + if filter.LimitZero { + return 0 + } + return math.MaxInt } diff --git a/filter_test.go b/filter_test.go index 6a3deb9..ecd6692 100644 --- a/filter_test.go +++ b/filter_test.go @@ -145,6 +145,9 @@ func TestTheoreticalLimit(t *testing.T) { require.Equal(t, 9, Filter{Authors: []PubKey{{'a'}, {'b'}, {'c'}}, Kinds: []Kind{3, 0, 10002}}.GetTheoreticalLimit()) require.Equal(t, math.MaxInt, Filter{Authors: []PubKey{{'a'}}}.GetTheoreticalLimit()) require.Equal(t, 4, Filter{Authors: []PubKey{{'a'}, {'b'}, {'c'}, {'d'}}, Kinds: []Kind{10050}}.GetTheoreticalLimit()) + require.Equal(t, 4, Filter{Limit: 18, Authors: []PubKey{{'a'}, {'b'}, {'c'}, {'d'}}, Kinds: []Kind{10050}}.GetTheoreticalLimit()) + require.Equal(t, 0, Filter{LimitZero: true}.GetTheoreticalLimit()) + require.Equal(t, 18, Filter{Limit: 18}.GetTheoreticalLimit()) require.Equal(t, math.MaxInt, Filter{Authors: []PubKey{{'a'}, {'b'}, {'c'}, {'d'}}}.GetTheoreticalLimit()) require.Equal(t, math.MaxInt, Filter{Kinds: []Kind{3, 0, 10002}}.GetTheoreticalLimit()) require.Equal(t, 24, Filter{Authors: []PubKey{{'a'}, {'b'}, {'c'}, {'d'}, {'e'}, {'f'}}, Kinds: []Kind{30023, 30024}, Tags: TagMap{"d": []string{"aaa", "bbb"}}}.GetTheoreticalLimit())