int64
CreatedAt time.Time
DeletedAt null.Time
}
func (it RwcIndexItem) IsBetween(timestamp time.Time) bool {
if (it.CreatedAt.Before(timestamp) || it.CreatedAt.Equal(timestamp)) &&
(!it.DeletedAt.Valid || (it.DeletedAt.Time.After(timestamp) || it.DeletedAt.Time.Equal(timestamp))) {
return true
}
return false
}
type RwcIndex struct {
ids []RwcIndexItem
}
func (r *RwcIndex) Add(id int64, createdAt time.Time, deletedAt null.Time) {
r.ids = append(r.ids, RwcIndexItem{
Id: id,
CreatedAt: createdAt,
DeletedAt: deletedAt,
})
}
func (r *RwcIndex) Find(timestamp time.Time) []int64 {
var ids []int64
//var idsForDelete []int
for _, item := range r.ids {
if item.IsBetween(timestamp) {
ids = append(ids, item.Id)
}
/*if item.DeletedAt.Valid && (item.DeletedAt.Time.Before(timestamp) {
idsForDelete = append(idsForDelete, i)
}*/
}
/*var removedIds []RwcIndexItem
for _, i := range idsForDelete {
removedIds = removeFromSlice(r.ids, i)
}
r.ids = removedIds*/
return ids
}
func removeFromSlice(slice []RwcIndexItem, s int) []RwcIndexItem {
return append(slice[:s], slice[s+1:]...)
}
type RwcIndexer struct {
rwcTracks map[int64]model.ClientWagonTrackRWC
rwcTrackMap map[string]RwcIndex
}
func NewIndexer() *RwcIndexer {
return &RwcIndexer{
rwcTracks: make(map[int64]model.ClientWagonTrackRWC),
rwcTrackMap: make(map[string]RwcIndex),
}
}
func (i *RwcIndexer) Index(items []model.ClientWagonTrackRWC) {
for _, item := range items {
i.rwcTracks[item.Id] = item
rwcIndex, ok := i.rwcTrackMap[item.WagonCode]
if !ok {
indexItem := RwcIndexItem{
Id: item.Id,
CreatedAt: item.CreatedAt,
DeletedAt: item.DeletedAt,
}
i.rwcTrackMap[item.WagonCode] = RwcIndex{ids: []RwcIndexItem{indexItem}}
continue
}
rwcIndex.Add(item.Id, item.CreatedAt, item.DeletedAt)
i.rwcTrackMap[item.WagonCode] = rwcIndex
}
}
func (i *RwcIndexer) FindItems(identifier string, timestamp time.Time) []model.ClientWagonTrackRWC {
var items []model.ClientWagonTrackRWC
rwcIndex := i.rwcTrackMap[identifier]
ids := rwcIndex.Find(timestamp)
for _, id := range ids {
items = append(items, i.rwcTracks[id])
}
return items
}
Можно как-то еще оптимизировать?
Почитайте про btree индексы, если сильно хочется их можно реализовать в го
есть библиотека готовая, но пока сделал кустарно через 2 мапа.
Обсуждают сегодня