diff --git a/eventstore/lmdb/query.go b/eventstore/lmdb/query.go index 8cb6f75..133a11f 100644 --- a/eventstore/lmdb/query.go +++ b/eventstore/lmdb/query.go @@ -14,13 +14,19 @@ import ( func (b *LMDBBackend) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[nostr.Event] { return func(yield func(nostr.Event) bool) { - if filter.Search != "" { - return + if filter.IDs != nil { + // when there are ids we ignore everything else and just fetch the ids + if err := b.lmdbEnv.View(func(txn *lmdb.Txn) error { + txn.RawRead = true + return b.queryByIds(txn, filter.IDs, yield) + }); err != nil { + log.Printf("lmdb: unexpected id query error: %s\n", err) + } } - if filter.IDs != nil { - // do a special id query - // TODO + // ignore search queries + if filter.Search != "" { + return } // max number of events we'll return @@ -33,13 +39,42 @@ func (b *LMDBBackend) QueryEvents(filter nostr.Filter, maxLimit int) iter.Seq[no maxLimit = filter.Limit } - b.lmdbEnv.View(func(txn *lmdb.Txn) error { + // do a normal query based on various filters + if err := b.lmdbEnv.View(func(txn *lmdb.Txn) error { txn.RawRead = true return b.query(txn, filter, maxLimit, yield) - }) + }); err != nil { + log.Printf("lmdb: unexpected query error: %s\n", err) + } } } +func (b *LMDBBackend) queryByIds(txn *lmdb.Txn, ids []nostr.ID, yield func(nostr.Event) bool) error { + for _, id := range ids { + idx, err := txn.Get(b.indexId, id[0:8]) + if err != nil { + continue + } + + txn.Get(b.rawEventStore, idx) + bin, err := txn.Get(b.rawEventStore, idx) + if err != nil { + continue + } + + event := nostr.Event{} + if err := betterbinary.Unmarshal(bin, &event); err != nil { + continue + } + + if !yield(event) { + return nil + } + } + + return nil +} + func (b *LMDBBackend) query(txn *lmdb.Txn, filter nostr.Filter, limit int, yield func(nostr.Event) bool) error { queries, extraAuthors, extraKinds, extraTagKey, extraTagValues, since, err := b.prepareQueries(filter) if err != nil { diff --git a/eventstore/lmdb/query_planner.go b/eventstore/lmdb/query_planner.go index fde0e7f..f8534e5 100644 --- a/eventstore/lmdb/query_planner.go +++ b/eventstore/lmdb/query_planner.go @@ -47,17 +47,6 @@ func (b *LMDBBackend) prepareQueries(filter nostr.Filter) ( } }() - // if filter.IDs != nil { - // // when there are ids we ignore everything else - // queries = make([]query, len(filter.IDs)) - // for i, id := range filter.IDs { - // prefix := make([]byte, 8) - // copy(prefix[0:8], id[0:8]) - // queries[i] = query{i: i, dbi: b.indexId, prefix: prefix[0:8], keySize: 8} - // } - // return queries, nil, nil, "", nil, 0, nil - // } - // this is where we'll end the iteration if filter.Since != 0 { if fs := uint32(filter.Since); fs > since {