in banyand/tsdb/series_seek_sort.go [105:162]
func (s *seekerBuilder) buildSeriesByTime() ([]Iterator, error) {
bb := s.seriesSpan.blocks
switch s.order {
case modelv1.Sort_SORT_ASC, modelv1.Sort_SORT_UNSPECIFIED:
sort.SliceStable(bb, func(i, j int) bool {
return bb[i].startTime().Before(bb[j].startTime())
})
case modelv1.Sort_SORT_DESC:
sort.SliceStable(bb, func(i, j int) bool {
return bb[i].startTime().After(bb[j].startTime())
})
}
delegated := make([]Iterator, 0, len(bb))
bTimes := make([]time.Time, 0, len(bb))
timeRange := s.seriesSpan.timeRange
termRange := index.RangeOpts{
Lower: convert.Int64ToBytes(timeRange.Start.UnixNano()),
Upper: convert.Int64ToBytes(timeRange.End.UnixNano()),
IncludesLower: true,
}
for _, b := range bb {
bTimes = append(bTimes, b.startTime())
inner, err := b.primaryIndexReader().
Iterator(
index.FieldKey{
SeriesID: s.seriesSpan.seriesID,
},
termRange,
s.order,
)
if err != nil {
return nil, err
}
if inner != nil {
filter, err := s.buildIndexFilter(b)
if err != nil {
return nil, err
}
if filter == nil {
delegated = append(delegated, newSearcherIterator(s.seriesSpan.l, inner, b.dataReader(),
s.seriesSpan.seriesID, emptyFilters))
} else {
delegated = append(delegated, newSearcherIterator(s.seriesSpan.l, inner, b.dataReader(),
s.seriesSpan.seriesID, []filterFn{filter}))
}
}
}
if e := s.seriesSpan.l.Debug(); e.Enabled() {
e.Str("order", modelv1.Sort_name[int32(s.order)]).
Times("blocks", bTimes).
Uint64("series_id", uint64(s.seriesSpan.seriesID)).
Str("series", s.seriesSpan.series).
Int("shard_id", int(s.seriesSpan.shardID)).
Msg("seek series by time")
}
return []Iterator{newMergedIterator(delegated)}, nil
}