170 похожих чатов

Type RwcIndexItem struct { Id

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
}
Можно как-то еще оптимизировать?

2 ответов

32 просмотра

Почитайте про btree индексы, если сильно хочется их можно реализовать в го

Andrey-Kolkov Автор вопроса
Nikita
Почитайте про btree индексы, если сильно хочется и...

есть библиотека готовая, но пока сделал кустарно через 2 мапа.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта