in banyand/measure/block.go [691:768]
func (bc *blockCursor) loadData(tmpBlock *block) bool {
tmpBlock.reset()
cfm := make([]columnMetadata, 0, len(bc.fieldProjection))
NEXT_FIELD:
for _, fp := range bc.fieldProjection {
for _, cm := range bc.bm.field.columnMetadata {
if cm.name == fp {
cfm = append(cfm, cm)
continue NEXT_FIELD
}
}
cfm = append(cfm, columnMetadata{
name: fp,
valueType: pbv1.ValueTypeUnknown,
})
}
bc.bm.field.columnMetadata = cfm
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
}
}
}
bc.bm.tagFamilies = tf
tmpBlock.mustReadFrom(&bc.columnValuesDecoder, bc.p, bc.bm)
start, end, ok := timestamp.FindRange(tmpBlock.timestamps, bc.minTimestamp, bc.maxTimestamp)
if !ok {
return false
}
bc.timestamps = append(bc.timestamps, tmpBlock.timestamps[start:end+1]...)
bc.versions = append(bc.versions, tmpBlock.versions[start:end+1]...)
for _, cf := range tmpBlock.tagFamilies {
tf := columnFamily{
name: cf.name,
}
for i := range cf.columns {
column := column{
name: cf.columns[i].name,
valueType: cf.columns[i].valueType,
}
if len(cf.columns[i].values) == 0 {
continue
}
if len(cf.columns[i].values) != len(tmpBlock.timestamps) {
logger.Panicf("unexpected number of values for tags %q: got %d; want %d", cf.columns[i].name, len(cf.columns[i].values), len(tmpBlock.timestamps))
}
column.values = append(column.values, cf.columns[i].values[start:end+1]...)
tf.columns = append(tf.columns, column)
}
bc.tagFamilies = append(bc.tagFamilies, tf)
}
bc.fields.name = tmpBlock.field.name
for i := range tmpBlock.field.columns {
if len(tmpBlock.field.columns[i].values) == 0 {
continue
}
if len(tmpBlock.field.columns[i].values) != len(tmpBlock.timestamps) {
logger.Panicf("unexpected number of values for fields %q: got %d; want %d",
tmpBlock.field.columns[i].name, len(tmpBlock.field.columns[i].values), len(tmpBlock.timestamps))
}
c := column{
name: tmpBlock.field.columns[i].name,
valueType: tmpBlock.field.columns[i].valueType,
}
c.values = append(c.values, tmpBlock.field.columns[i].values[start:end+1]...)
bc.fields.columns = append(bc.fields.columns, c)
}
return true
}