in banyand/stream/block.go [673:754]
func fullTagAppend(bi, b *blockPointer, offset int) {
existDataSize := len(bi.timestamps)
appendTagFamilies := func(tf tagFamily) {
tfv := tagFamily{name: tf.name}
for i := range tf.tags {
assertIdxAndOffset(tf.tags[i].name, len(tf.tags[i].values), b.idx, offset)
col := tag{name: tf.tags[i].name, valueType: tf.tags[i].valueType}
for j := 0; j < existDataSize; j++ {
col.values = append(col.values, nil)
}
col.values = append(col.values, tf.tags[i].values[b.idx:offset]...)
tfv.tags = append(tfv.tags, col)
}
bi.tagFamilies = append(bi.tagFamilies, tfv)
}
if len(bi.tagFamilies) == 0 {
for _, tf := range b.tagFamilies {
appendTagFamilies(tf)
}
return
}
tagFamilyMap := make(map[string]*tagFamily)
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]*tag)
for i := range existingTagFamily.tags {
columnMap[existingTagFamily.tags[i].name] = &existingTagFamily.tags[i]
}
for _, c := range tf.tags {
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 := tag{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.tags = append(existingTagFamily.tags, 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.tags {
for j := 0; j < emptySize; j++ {
tf.tags[i].values = append(tf.tags[i].values, nil)
}
}
} else {
existingTagFamily := tagFamilyMap[tf.name]
columnMap := make(map[string]*tag)
for i := range existingTagFamily.tags {
columnMap[existingTagFamily.tags[i].name] = &existingTagFamily.tags[i]
}
for i := range tf.tags {
if _, exists := columnMap[tf.tags[i].name]; !exists {
for j := 0; j < emptySize; j++ {
tf.tags[i].values = append(tf.tags[i].values, nil)
}
}
}
}
}
}