mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-10-29 07:22:24 -05:00
[performance] overhaul struct (+ result) caching library for simplicity, performance and multiple-result lookups (#2535)
* rewrite cache library as codeberg.org/gruf/go-structr, implement in gotosocial
* use actual go-structr release version (not just commit hash)
* revert go toolchain changes (damn you go for auto changing this)
* fix go mod woes
* ensure %w is used in calls to errs.Appendf()
* fix error checking
* fix possible panic
* remove unnecessary start/stop functions, move to main Cache{} struct, add note regarding which caches require start/stop
* fix copy-paste artifact... 😇
* fix all comment copy-paste artifacts
* remove dropID() function, now we can just use slices.DeleteFunc()
* use util.Deduplicate() instead of collate(), move collate to util
* move orderByIDs() to util package and "generify"
* add a util.DeleteIf() function, use this to delete entries on failed population
* use slices.DeleteFunc() instead of util.DeleteIf() (i had the logic mixed up in my head somehow lol)
* add note about how collate differs from deduplicate
This commit is contained in:
parent
67e11a1a61
commit
7ec1e1332e
66 changed files with 4038 additions and 2711 deletions
|
|
@ -61,3 +61,75 @@ func DeduplicateFunc[T any, C comparable](in []T, key func(v T) C) []T {
|
|||
|
||||
return deduped
|
||||
}
|
||||
|
||||
// Collate will collect the values of type K from input type []T,
|
||||
// passing each item to 'get' and deduplicating the end result.
|
||||
// Compared to Deduplicate() this returns []K, NOT input type []T.
|
||||
func Collate[T any, K comparable](in []T, get func(T) K) []K {
|
||||
ks := make([]K, 0, len(in))
|
||||
km := make(map[K]struct{}, len(in))
|
||||
|
||||
for i := 0; i < len(in); i++ {
|
||||
// Get next k.
|
||||
k := get(in[i])
|
||||
|
||||
if _, ok := km[k]; !ok {
|
||||
// New value, add
|
||||
// to map + slice.
|
||||
ks = append(ks, k)
|
||||
km[k] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
return ks
|
||||
}
|
||||
|
||||
// OrderBy orders a slice of given type by the provided alternative slice of comparable type.
|
||||
func OrderBy[T any, K comparable](in []T, keys []K, key func(T) K) {
|
||||
var (
|
||||
start int
|
||||
offset int
|
||||
)
|
||||
|
||||
for i := 0; i < len(keys); i++ {
|
||||
var (
|
||||
// key at index.
|
||||
k = keys[i]
|
||||
|
||||
// sentinel
|
||||
// idx value.
|
||||
idx = -1
|
||||
)
|
||||
|
||||
// Look for model with key in slice.
|
||||
for j := start; j < len(in); j++ {
|
||||
if key(in[j]) == k {
|
||||
idx = j
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if idx == -1 {
|
||||
// model with key
|
||||
// was not found.
|
||||
offset++
|
||||
continue
|
||||
}
|
||||
|
||||
// Update
|
||||
// start
|
||||
start++
|
||||
|
||||
// Expected ID index.
|
||||
exp := i - offset
|
||||
|
||||
if idx == exp {
|
||||
// Model is in expected
|
||||
// location, keep going.
|
||||
continue
|
||||
}
|
||||
|
||||
// Swap models at current and expected.
|
||||
in[idx], in[exp] = in[exp], in[idx]
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue