filter.GetTheoreticalLimit() to encompass the actual limit specified in the filter.

This commit is contained in:
fiatjaf
2025-12-19 06:52:46 -03:00
parent 14dcc01f8f
commit daee8575d9
7 changed files with 23 additions and 20 deletions

View File

@@ -11,11 +11,10 @@ import (
func (b *BleveBackend) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[nostr.Event] { func (b *BleveBackend) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[nostr.Event] {
return func(yield func(nostr.Event) bool) { return func(yield func(nostr.Event) bool) {
limit := maxLimit if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 {
if filter.LimitZero {
return return
} else if filter.Limit > 0 && filter.Limit < limit { } else if tlimit < maxLimit {
limit = filter.Limit maxLimit = tlimit
} }
if len(filter.Search) < 2 { 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 := bleve.NewSearchRequest(q)
req.Size = limit req.Size = maxLimit
req.From = 0 req.From = 0
result, err := b.index.Search(req) result, err := b.index.Search(req)

View File

@@ -30,14 +30,11 @@ func (b *BoltBackend) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[no
} }
// max number of events we'll return // max number of events we'll return
if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 || filter.LimitZero { if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 {
return return
} else if tlimit < maxLimit { } else if tlimit < maxLimit {
maxLimit = tlimit maxLimit = tlimit
} }
if filter.Limit > 0 && filter.Limit < maxLimit {
maxLimit = filter.Limit
}
// do a normal query based on various filters // do a normal query based on various filters
if err := b.DB.View(func(txn *bbolt.Tx) error { if err := b.DB.View(func(txn *bbolt.Tx) error {

View File

@@ -31,14 +31,11 @@ func (b *LMDBBackend) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[no
} }
// max number of events we'll return // max number of events we'll return
if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 || filter.LimitZero { if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 {
return return
} else if tlimit < maxLimit { } else if tlimit < maxLimit {
maxLimit = tlimit maxLimit = tlimit
} }
if filter.Limit > 0 && filter.Limit < maxLimit {
maxLimit = filter.Limit
}
// do a normal query based on various filters // do a normal query based on various filters
if err := b.lmdbEnv.View(func(txn *lmdb.Txn) error { if err := b.lmdbEnv.View(func(txn *lmdb.Txn) error {

View File

@@ -96,14 +96,11 @@ func (il *IndexingLayer) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq
} }
// max number of events we'll return // max number of events we'll return
if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 || filter.LimitZero { if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 {
return return
} else if tlimit < maxLimit { } else if tlimit < maxLimit {
maxLimit = tlimit maxLimit = tlimit
} }
if filter.Limit > 0 && filter.Limit < maxLimit {
maxLimit = filter.Limit
}
il.lmdbEnv.View(func(txn *lmdb.Txn) error { il.lmdbEnv.View(func(txn *lmdb.Txn) error {
txn.RawRead = true txn.RawRead = true

View File

@@ -29,8 +29,10 @@ func (b *SliceStore) Close() {}
func (b *SliceStore) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[nostr.Event] { func (b *SliceStore) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[nostr.Event] {
return func(yield func(nostr.Event) bool) { return func(yield func(nostr.Event) bool) {
if filter.Limit > maxLimit || (filter.Limit == 0 && !filter.LimitZero) { if tlimit := filter.GetTheoreticalLimit(); tlimit == 0 {
filter.Limit = maxLimit return
} else if tlimit < maxLimit {
maxLimit = tlimit
} }
// efficiently determine where to start and end // 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 count := 0
for _, event := range b.internal[start:end] { for _, event := range b.internal[start:end] {
if count == filter.Limit { if count == maxLimit {
break break
} }

View File

@@ -183,5 +183,13 @@ func (filter Filter) GetTheoreticalLimit() int {
} }
} }
if filter.Limit > 0 {
return filter.Limit
}
if filter.LimitZero {
return 0
}
return math.MaxInt return math.MaxInt
} }

View File

@@ -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, 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, 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{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{Authors: []PubKey{{'a'}, {'b'}, {'c'}, {'d'}}}.GetTheoreticalLimit())
require.Equal(t, math.MaxInt, Filter{Kinds: []Kind{3, 0, 10002}}.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()) require.Equal(t, 24, Filter{Authors: []PubKey{{'a'}, {'b'}, {'c'}, {'d'}, {'e'}, {'f'}}, Kinds: []Kind{30023, 30024}, Tags: TagMap{"d": []string{"aaa", "bbb"}}}.GetTheoreticalLimit())