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
}