func writeResult()

in pkg/data-query/resultJsonEncoder.go [22:156]


func writeResult(result *proto.Results, columnNameToIndex map[string]int, columnBuffers [][]*bytebufferpool.ByteBuffer, query Query, splitParameters *SplitParameters) error {
	var rowToSplitIndex []int

	for _, column := range *result {
		rowToSplitIndex = make([]int, column.Data.Rows())
	}

	for _, column := range *result {
		if column.Name == splitParameters.splitField {
			//nolint:gocritic
			switch data := column.Data.(type) {
			case *proto.ColLowCardinality[string]:
				for i, t := range data.Values {
					rowToSplitIndex[i] = splitParameters.values[t]
				}
			case *proto.ColStr:
				for i, position := range data.Pos {
					rowToSplitIndex[i] = splitParameters.values[string(data.Buf[position.Start:position.End])]
				}
			}
		}
	}
	for i := range splitParameters.numberOfSplits {
		if columnBuffers[i] == nil {
			columnBuffers[i] = make([]*bytebufferpool.ByteBuffer, len(*result))
		}
		for j := range *result {
			columnBuffer := columnBuffers[i][j]
			if columnBuffer == nil {
				columnBuffers[i][j] = byteBufferPool.Get()
			}
		}
	}

	for _, column := range *result {
		columnIndex := columnNameToIndex[column.Name]
		switch data := column.Data.(type) {
		case *proto.ColInt32:
			for i, v := range *data {
				buffer := getBufferAndWriteSplittingComma(columnBuffers, rowToSplitIndex, i, columnIndex)
				buffer.B = strconv.AppendInt(buffer.B, int64(v), 10)
			}
		case *proto.ColInt64:
			for i, v := range *data {
				buffer := getBufferAndWriteSplittingComma(columnBuffers, rowToSplitIndex, i, columnIndex)
				buffer.B = strconv.AppendInt(buffer.B, v, 10)
			}
		case *proto.ColUInt8:
			for i, v := range *data {
				buffer := getBufferAndWriteSplittingComma(columnBuffers, rowToSplitIndex, i, columnIndex)
				buffer.B = strconv.AppendUint(buffer.B, uint64(v), 10)
			}

		case *proto.ColBool:
			for i, v := range *data {
				buffer := getBufferAndWriteSplittingComma(columnBuffers, rowToSplitIndex, i, columnIndex)
				buffer.B = strconv.AppendBool(buffer.B, v)
			}

		case *proto.ColUInt16:
			for i, v := range *data {
				buffer := getBufferAndWriteSplittingComma(columnBuffers, rowToSplitIndex, i, columnIndex)
				buffer.B = strconv.AppendUint(buffer.B, uint64(v), 10)
			}
		case *proto.ColUInt32:
			for i, v := range *data {
				buffer := getBufferAndWriteSplittingComma(columnBuffers, rowToSplitIndex, i, columnIndex)
				buffer.B = strconv.AppendUint(buffer.B, uint64(v), 10)
			}
		case *proto.ColUInt64:
			for i, v := range *data {
				buffer := getBufferAndWriteSplittingComma(columnBuffers, rowToSplitIndex, i, columnIndex)
				buffer.B = strconv.AppendUint(buffer.B, v, 10)
			}

		case *proto.ColFloat32:
			for i, v := range *data {
				buffer := getBufferAndWriteSplittingComma(columnBuffers, rowToSplitIndex, i, columnIndex)
				n := int64(v)
				if float32(n) == v {
					// fast path - just int
					buffer.B = strconv.AppendInt(buffer.B, n, 10)
				} else {
					buffer.B = strconv.AppendFloat(buffer.B, float64(v), 'f', -1, 32)
				}
			}

		case *proto.ColFloat64:
			for i, v := range *data {
				buffer := getBufferAndWriteSplittingComma(columnBuffers, rowToSplitIndex, i, columnIndex)
				n := int64(v)
				if float64(n) == v {
					// fast path - just int
					buffer.B = strconv.AppendInt(buffer.B, n, 10)
				} else {
					if math.IsNaN(v) {
						buffer.B = strconv.AppendFloat(buffer.B, 0, 'f', -1, 64)
					} else {
						buffer.B = strconv.AppendFloat(buffer.B, v, 'f', -1, 64)
					}
				}
			}

		case *proto.ColStr:
			templateWriters, jsonWriters := getWriters(splitParameters, columnBuffers, columnIndex)
			for i, position := range data.Pos {
				getBufferAndWriteSplittingComma(columnBuffers, rowToSplitIndex, i, columnIndex)
				jsonWriter := jsonWriters[rowToSplitIndex[i]]
				jsonWriter.Q(string(data.Buf[position.Start:position.End]))
			}
			releaseWriters(splitParameters, templateWriters)

		case *proto.ColDateTime:
			templateWriters, jsonWriters := getWriters(splitParameters, columnBuffers, columnIndex)
			for i, v := range data.Data {
				getBufferAndWriteSplittingComma(columnBuffers, rowToSplitIndex, i, columnIndex)
				jsonWriter := jsonWriters[rowToSplitIndex[i]]
				jsonWriter.Q(v.Time().Format(query.TimeDimensionFormat))
			}
			releaseWriters(splitParameters, templateWriters)

		case *proto.ColLowCardinality[string]:
			templateWriters, jsonWriters := getWriters(splitParameters, columnBuffers, columnIndex)
			for i, t := range data.Values {
				getBufferAndWriteSplittingComma(columnBuffers, rowToSplitIndex, i, columnIndex)
				jsonWriter := jsonWriters[rowToSplitIndex[i]]
				jsonWriter.Q(t)
			}
			releaseWriters(splitParameters, templateWriters)
		default:
			return fmt.Errorf("unsupported column type %T", data)
		}
	}
	return nil
}