in banyand/stream/block.go [509:581]
func (bc *blockCursor) loadData(tmpBlock *block) bool {
tmpBlock.reset()
bc.bm.tagProjection = bc.tagProjection
var tf map[string]*dataBlock
for _, tp := range bc.tagProjection {
for tfName, block := range bc.bm.tagFamilies {
if tp.Family == tfName {
if tf == nil {
tf = make(map[string]*dataBlock, len(bc.tagProjection))
}
tf[tfName] = block
}
}
}
if len(tf) == 0 {
return false
}
bc.bm.tagFamilies = tf
tmpBlock.mustReadFrom(&bc.tagValuesDecoder, bc.p, bc.bm)
if len(tmpBlock.timestamps) == 0 {
return false
}
idxList := make([]int, 0)
var start, end int
if bc.elementFilter != nil {
for i := range tmpBlock.elementIDs {
if bc.elementFilter.Contains(tmpBlock.elementIDs[i]) {
idxList = append(idxList, i)
bc.timestamps = append(bc.timestamps, tmpBlock.timestamps[i])
bc.elementIDs = append(bc.elementIDs, tmpBlock.elementIDs[i])
}
}
if len(bc.timestamps) == 0 {
return false
}
} else {
s, e, ok := timestamp.FindRange(tmpBlock.timestamps, bc.minTimestamp, bc.maxTimestamp)
start, end = s, e
if !ok {
return false
}
bc.timestamps = append(bc.timestamps, tmpBlock.timestamps[s:e+1]...)
bc.elementIDs = append(bc.elementIDs, tmpBlock.elementIDs[s:e+1]...)
}
for i, projection := range bc.bm.tagProjection {
tf := tagFamily{
name: projection.Family,
}
for j, name := range projection.Names {
t := tag{
name: name,
}
t.valueType = tmpBlock.tagFamilies[i].tags[j].valueType
if len(tmpBlock.tagFamilies[i].tags[j].values) != len(tmpBlock.timestamps) {
logger.Panicf("unexpected number of values for tags %q: got %d; want %d",
tmpBlock.tagFamilies[i].tags[j].name, len(tmpBlock.tagFamilies[i].tags[j].values), len(tmpBlock.timestamps))
}
if len(idxList) > 0 {
for _, idx := range idxList {
t.values = append(t.values, tmpBlock.tagFamilies[i].tags[j].values[idx])
}
} else {
t.values = append(t.values, tmpBlock.tagFamilies[i].tags[j].values[start:end+1]...)
}
tf.tags = append(tf.tags, t)
}
bc.tagFamilies = append(bc.tagFamilies, tf)
}
return len(bc.timestamps) > 0
}