You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.5 KiB
65 lines
1.5 KiB
package database |
|
|
|
import ( |
|
"context" |
|
|
|
"database.orly/indexes/types" |
|
"encoders.orly/filter" |
|
"interfaces.orly/store" |
|
"lol.mleku.dev/chk" |
|
) |
|
|
|
// QueryForSerials takes a filter and returns the serials of events that match, |
|
// sorted in reverse chronological order. |
|
func (d *D) QueryForSerials(c context.Context, f *filter.F) ( |
|
sers types.Uint40s, err error, |
|
) { |
|
var founds []*types.Uint40 |
|
var idPkTs []*store.IdPkTs |
|
if f.Ids != nil && f.Ids.Len() > 0 { |
|
for _, id := range f.Ids.ToSliceOfBytes() { |
|
var ser *types.Uint40 |
|
if ser, err = d.GetSerialById(id); chk.E(err) { |
|
return |
|
} |
|
founds = append(founds, ser) |
|
} |
|
var tmp []*store.IdPkTs |
|
if tmp, err = d.GetFullIdPubkeyBySerials(founds); chk.E(err) { |
|
return |
|
} |
|
idPkTs = append(idPkTs, tmp...) |
|
|
|
// // fetch the events full id indexes so we can sort them |
|
// for _, ser := range founds { |
|
// // scan for the IdPkTs |
|
// var fidpk *store.IdPkTs |
|
// if fidpk, err = d.GetFullIdPubkeyBySerial(ser); chk.E(err) { |
|
// return |
|
// } |
|
// if fidpk == nil { |
|
// continue |
|
// } |
|
// idPkTs = append(idPkTs, fidpk) |
|
// // sort by timestamp |
|
// sort.Slice( |
|
// idPkTs, func(i, j int) bool { |
|
// return idPkTs[i].Ts > idPkTs[j].Ts |
|
// }, |
|
// ) |
|
// } |
|
} else { |
|
if idPkTs, err = d.QueryForIds(c, f); chk.E(err) { |
|
return |
|
} |
|
} |
|
// extract the serials |
|
for _, idpk := range idPkTs { |
|
ser := new(types.Uint40) |
|
if err = ser.Set(idpk.Ser); chk.E(err) { |
|
continue |
|
} |
|
sers = append(sers, ser) |
|
} |
|
return |
|
}
|
|
|