in banyand/measure/block.go [479:579]
func (bc *blockCursor) copyAllTo(r *model.MeasureResult, storedIndexValue map[common.SeriesID]map[string]*modelv1.TagValue,
tagProjection []model.TagProjection, desc bool,
) {
var idx, offset int
if desc {
idx = 0
offset = bc.idx + 1
} else {
idx = bc.idx
offset = len(bc.timestamps)
}
if offset <= idx {
return
}
size := offset - idx
r.SID = bc.bm.seriesID
r.Timestamps = append(r.Timestamps, bc.timestamps[idx:offset]...)
r.Versions = append(r.Versions, bc.versions[idx:offset]...)
if desc {
slices.Reverse(r.Timestamps)
slices.Reverse(r.Versions)
}
var indexValue map[string]*modelv1.TagValue
if storedIndexValue != nil {
indexValue = storedIndexValue[r.SID]
}
OUTER:
for _, tp := range tagProjection {
tf := model.TagFamily{
Name: tp.Family,
}
var cf *columnFamily
for _, tagName := range tp.Names {
t := model.Tag{
Name: tagName,
}
if indexValue != nil && indexValue[tagName] != nil {
t.Values = make([]*modelv1.TagValue, size)
for i := 0; i < size; i++ {
t.Values[i] = indexValue[tagName]
}
tf.Tags = append(tf.Tags, t)
continue
}
if cf == nil {
for i := range bc.tagFamilies {
if bc.tagFamilies[i].name == tp.Family {
cf = &bc.tagFamilies[i]
break
}
}
}
if cf == nil {
for _, n := range tp.Names {
t = model.Tag{
Name: n,
Values: make([]*modelv1.TagValue, size),
}
for i := 0; i < size; i++ {
t.Values[i] = pbv1.NullTagValue
}
tf.Tags = append(tf.Tags, t)
}
r.TagFamilies = append(r.TagFamilies, tf)
continue OUTER
}
var foundTag bool
for i := range cf.columns {
if cf.columns[i].name == tagName {
for _, v := range cf.columns[i].values[idx:offset] {
t.Values = append(t.Values, mustDecodeTagValue(cf.columns[i].valueType, v))
}
foundTag = true
break
}
}
if !foundTag {
t.Values = make([]*modelv1.TagValue, size)
for i := 0; i < size; i++ {
t.Values[i] = pbv1.NullTagValue
}
} else if desc {
slices.Reverse(t.Values)
}
tf.Tags = append(tf.Tags, t)
}
r.TagFamilies = append(r.TagFamilies, tf)
}
for _, c := range bc.fields.columns {
f := model.Field{
Name: c.name,
}
for _, v := range c.values[idx:offset] {
f.Values = append(f.Values, mustDecodeFieldValue(c.valueType, v))
}
if desc {
slices.Reverse(f.Values)
}
r.Fields = append(r.Fields, f)
}
}