query/common/dim_util.go (48 lines of code) (raw):
package common
import (
memCom "github.com/uber/aresdb/memstore/common"
"github.com/uber/aresdb/query/expr"
)
// GetDimensionDataType gets DataType for given expr
func GetDimensionDataType(expression expr.Expr) memCom.DataType {
if e, ok := expression.(*expr.VarRef); ok {
return e.DataType
}
// special handling element_at for array enum type
if binExpr, ok := expression.(*expr.BinaryExpr); ok && binExpr.Op == expr.ARRAY_ELEMENT_AT {
if vr, ok := binExpr.LHS.(*expr.VarRef); ok && memCom.IsEnumType(vr.DataType) {
return vr.DataType
}
}
switch expression.Type() {
case expr.Boolean:
return memCom.Bool
case expr.Unsigned:
return memCom.Uint32
case expr.Signed:
return memCom.Int32
case expr.Float:
return memCom.Float32
case expr.UUID:
return memCom.UUID
case expr.GeoPoint:
return memCom.GeoPoint
default:
return memCom.Uint32
}
}
// GetDimensionDataBytes gets num bytes for given expr
func GetDimensionDataBytes(expression expr.Expr) int {
return memCom.DataTypeBytes(GetDimensionDataType(expression))
}
// DimValueVectorSize returns the size of final dim value vector on host side.
func DimValResVectorSize(resultSize int, numDimsPerDimWidth DimCountsPerDimWidth) int {
totalDims := 0
for _, numDims := range numDimsPerDimWidth {
totalDims += int(numDims)
}
dimBytes := 1 << uint(len(numDimsPerDimWidth)-1)
var totalBytes int
for _, numDims := range numDimsPerDimWidth {
totalBytes += dimBytes * resultSize * int(numDims)
dimBytes >>= 1
}
totalBytes += totalDims * resultSize
return totalBytes
}