func()

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
}