func fullTagAppend()

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)
					}
				}
			}
		}
	}
}