func ReadDimension()

in query/common/dimval.go [36:101]


func ReadDimension(valueStart, nullStart unsafe.Pointer,
	index int, dataType memCom.DataType, enumReverseDict []string, meta *TimeDimensionMeta, cache map[TimeDimensionMeta]map[int64]string) *string {
	isTimeDimension := meta != nil
	// check for nulls
	if *(*uint8)(memAccess(nullStart, index)) == 0 {
		return nil
	}

	// determine value width in bytes
	valueBytes := memCom.DataTypeBytes(dataType)
	valuePtr := memAccess(valueStart, valueBytes*index)

	// read intValue; handle float and signed types
	var intValue int64
	var result string
	switch dataType {
	case memCom.Float32:
		// in case time dimension value was converted to float for division
		if isTimeDimension {
			intValue = int64(*(*float32)(valuePtr))
		} else {
			result = strconv.FormatFloat(float64(*(*float32)(valuePtr)), 'g', -1, 32)
			return &result
		}
	case memCom.Int64, memCom.Int32, memCom.Int16, memCom.Int8, memCom.Bool:
		switch valueBytes {
		case 8:
			intValue = int64(*(*int64)(valuePtr))
		case 4:
			intValue = int64(*(*int32)(valuePtr))
		case 2:
			intValue = int64(*(*int16)(valuePtr))
		case 1:
			intValue = int64(*(*int8)(valuePtr))
		}
		result = strconv.FormatInt(intValue, 10)
		return &result
	case memCom.Uint32, memCom.Uint16, memCom.BigEnum, memCom.Uint8, memCom.SmallEnum:
		switch valueBytes {
		case 4:
			intValue = int64(*(*uint32)(valuePtr))
		case 2:
			intValue = int64(*(*uint16)(valuePtr))
		case 1:
			intValue = int64(*(*uint8)(valuePtr))
		}
	case memCom.UUID:
		return formatWithDataValue(valuePtr, memCom.UUID)
	case memCom.GeoPoint:
		return formatWithDataValue(valuePtr, memCom.GeoPoint)
	default:
		// Should never happen.
		return nil
	}

	// translate enum case back to string for unsigned types
	if intValue >= 0 && intValue < int64(len(enumReverseDict)) {
		result = enumReverseDict[int(intValue)]
	} else if isTimeDimension {
		result = formatTimeDimension(intValue, *meta, cache)
	} else {
		result = strconv.FormatInt(intValue, 10)
	}

	return &result
}