in banyand/measure/block.go [872:953]
func fullTagAppend(bi, b *blockPointer, offset int) {
existDataSize := len(bi.timestamps)
appendTagFamilies := func(tf columnFamily) {
tagFamily := columnFamily{name: tf.name}
for i := range tf.columns {
assertIdxAndOffset(tf.columns[i].name, len(tf.columns[i].values), b.idx, offset)
col := column{name: tf.columns[i].name, valueType: tf.columns[i].valueType}
for j := 0; j < existDataSize; j++ {
col.values = append(col.values, nil)
}
col.values = append(col.values, tf.columns[i].values[b.idx:offset]...)
tagFamily.columns = append(tagFamily.columns, col)
}
bi.tagFamilies = append(bi.tagFamilies, tagFamily)
}
if len(bi.tagFamilies) == 0 {
for _, tf := range b.tagFamilies {
appendTagFamilies(tf)
}
return
}
tagFamilyMap := make(map[string]*columnFamily)
for i := range bi.tagFamilies {
tagFamilyMap[bi.tagFamilies[i].name] = &bi.tagFamilies[i]
}
for _, tf := range b.tagFamilies {
if existingTagFamily, exists := tagFamilyMap[tf.name]; exists {
columnMap := make(map[string]*column)
for i := range existingTagFamily.columns {
columnMap[existingTagFamily.columns[i].name] = &existingTagFamily.columns[i]
}
for _, c := range tf.columns {
if existingColumn, exists := columnMap[c.name]; exists {
assertIdxAndOffset(c.name, len(c.values), b.idx, offset)
existingColumn.values = append(existingColumn.values, c.values[b.idx:offset]...)
} else {
assertIdxAndOffset(c.name, len(c.values), b.idx, offset)
col := column{name: c.name, valueType: c.valueType}
for j := 0; j < existDataSize; j++ {
col.values = append(col.values, nil)
}
col.values = append(col.values, c.values[b.idx:offset]...)
existingTagFamily.columns = append(existingTagFamily.columns, col)
}
}
} else {
appendTagFamilies(tf)
}
}
for k := range tagFamilyMap {
delete(tagFamilyMap, k)
}
for i := range b.tagFamilies {
tagFamilyMap[b.tagFamilies[i].name] = &b.tagFamilies[i]
}
emptySize := offset - b.idx
for _, tf := range bi.tagFamilies {
if _, exists := tagFamilyMap[tf.name]; !exists {
for i := range tf.columns {
for j := 0; j < emptySize; j++ {
tf.columns[i].values = append(tf.columns[i].values, nil)
}
}
} else {
existingTagFamily := tagFamilyMap[tf.name]
columnMap := make(map[string]*column)
for i := range existingTagFamily.columns {
columnMap[existingTagFamily.columns[i].name] = &existingTagFamily.columns[i]
}
for i := range tf.columns {
if _, exists := columnMap[tf.columns[i].name]; !exists {
for j := 0; j < emptySize; j++ {
tf.columns[i].values = append(tf.columns[i].values, nil)
}
}
}
}
}
}