add count (NIP-45) envelope support, bump to version v0.10.0
Some checks failed
Go / build (push) Has been cancelled

This commit is contained in:
2025-10-06 12:21:34 +01:00
parent 386878fec8
commit 3afd6131d5
8 changed files with 292 additions and 164 deletions

44
pkg/database/count.go Normal file
View File

@@ -0,0 +1,44 @@
package database
import (
"context"
"next.orly.dev/pkg/encoders/filter"
)
// CountEvents mirrors the initial selection logic of QueryEvents but stops
// once we have identified candidate event serials (id/pk/ts). It returns the
// count of those serials. The `approx` flag is always false as requested.
func (d *D) CountEvents(c context.Context, f *filter.F) (
count int, approx bool, err error,
) {
approx = false
if f == nil {
return 0, false, nil
}
// If explicit Ids are provided, count how many of them resolve to serials.
if f.Ids != nil && f.Ids.Len() > 0 {
var serials map[string]interface{}
// Use type inference without importing extra packages by discarding the
// concrete value type via a two-step assignment.
if tmp, idErr := d.GetSerialsByIds(f.Ids); idErr != nil {
return 0, false, idErr
} else {
// Reassign to a map with empty interface values to avoid referencing
// the concrete Uint40 type here.
serials = make(map[string]interface{}, len(tmp))
for k := range tmp {
serials[k] = struct{}{}
}
}
return len(serials), false, nil
}
// Otherwise, query for candidate Id/Pubkey/Timestamp triplets and count them.
if idPkTs, qErr := d.QueryForIds(c, f); qErr != nil {
return 0, false, qErr
} else {
return len(idPkTs), false, nil
}
}