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 ответов

12 просмотров

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

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

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

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

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

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Кто-нибудь знает почему SPM клонирует репо целиком? Некоторые репы просто огромные, как та же swift-syntax которая нужна для использования макросов. Сначала подумал, что это...
iMike
6
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
еще вопрос, допустим мы создадим char массив из 10 элементов и присвоим ему через сканф 10 символов. и выведем все символы. Хотел спросить последний элемент /0 будет включать...
Anthem
11
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
Карта сайта