Files
nostrlib/eventstore/internal/helpers.go
2026-01-22 22:54:44 -03:00

94 lines
2.2 KiB
Go

package internal
import (
"math"
"fiatjaf.com/nostr"
)
func ChooseNarrowestTag(filter nostr.Filter) (key string, values []string, goodness int) {
var tagKey string
var tagValues []string
for key, values := range filter.Tags {
switch key {
case "e", "E", "q":
// 'e' and 'q' are the narrowest possible, so if we have that we will use it and that's it
tagKey = key
tagValues = values
goodness = 9
break
case "a", "A", "i", "I", "g", "r":
// these are second-best as they refer to relatively static things
goodness = 8
tagKey = key
tagValues = values
case "d":
// this is as good as long as we have an "authors"
if len(filter.Authors) != 0 && goodness < 7 {
goodness = 7
tagKey = key
tagValues = values
} else if goodness < 4 {
goodness = 4
tagKey = key
tagValues = values
}
case "h", "t", "l", "k", "K":
// these things denote "categories", so they are a little more broad
if goodness < 6 {
goodness = 6
tagKey = key
tagValues = values
}
case "p":
// this is broad and useless for a pure tag search, but we will still prefer it over others
// for secondary filtering
if goodness < 2 {
goodness = 2
tagKey = key
tagValues = values
}
default:
// all the other tags are probably too broad and useless
if goodness == 0 {
tagKey = key
tagValues = values
}
}
}
return tagKey, tagValues, goodness
}
func CopyMapWithoutKey[K comparable, V any](originalMap map[K]V, key K) map[K]V {
newMap := make(map[K]V, len(originalMap)-1)
for k, v := range originalMap {
if k != key {
newMap[k] = v
}
}
return newMap
}
// BatchSizePerNumberOfQueries tries to make an educated guess for the batch size given the total filter limit and
// the number of abstract queries we'll be conducting at the same time
func BatchSizePerNumberOfQueries(totalFilterLimit int, numberOfQueries int) int {
if numberOfQueries == 1 || totalFilterLimit*numberOfQueries < 50 {
return totalFilterLimit
}
return max(
4,
int(
math.Ceil(
math.Pow(float64(totalFilterLimit), 0.80)/math.Pow(float64(numberOfQueries), 0.71),
),
),
)
}
func SwapDelete[A any](arr []A, i int) []A {
arr[i] = arr[len(arr)-1]
return arr[:len(arr)-1]
}