1340691923@qq.com ebbf4120bf 第一次提交
2022-01-26 16:40:50 +08:00

168 lines
4.8 KiB
Go

package parser
import (
"fmt"
"github.com/1340691923/xwl_bi/engine/logs"
"github.com/1340691923/xwl_bi/platform-basic-libs/sinker/model"
"strings"
)
const (
TypeUnknown = iota
Int
Float
String
DateTime
ElasticDateTime
IntArray
FloatArray
StringArray
DateTimeArray
)
var TypeRemarkMap = map[int]string{
TypeUnknown: "未知类型",
Int: "数字类型",
Float: "浮点数类型",
String: "字符串类型",
DateTime: "时间类型",
ElasticDateTime: "时间类型",
IntArray: "数字数组类型",
FloatArray: "浮点数数组类型",
StringArray: "字符串数组类型",
DateTimeArray: "时间数组类型",
}
/**系统字段*/
var SysColumn = map[string]string{
"xwl_account_id": "账户ID",
"xwl_distinct_id": "访客ID",
"xwl_reg_time": "用户注册时间",
"xwl_server_time": "服务端入库时间",
"xwl_update_time": "用户信息最后修改时间",
"xwl_kafka_offset": "kafka偏移量",
"xwl_part_date": "事件入库时间",
"xwl_part_event": "事件名",
"xwl_lib_version": "SDK版本",
"xwl_os": "用户操作系统",
"xwl_ip": "事件生成时用户所在IP",
"xwl_screen_width": "用户屏幕宽度",
"xwl_screen_height": "用户屏幕高度",
"xwl_device_id": "用户设备ID",
"xwl_network_type": "用户网络类型",
"xwl_device_model": "用户机型",
"xwl_city": "用户所在城市",
"xwl_province": "用户所在省份",
"xwl_lib": "SDK语言",
"xwl_scene": "场景值",
"xwl_manufacturer": "设备提供商",
"xwl_os_version": "用户操作系统版本",
"xwl_cpu": "cpu",
"xwl_client_time": "客户端上报时间",
"xwl_browser_version": "浏览器版本号",
"xwl_browser": "浏览器类型",
"xwl_kafka_partition": "kafka分区",
}
type TypeInfo struct {
Type int
Nullable bool
}
var (
typeInfo map[string]TypeInfo
)
func GetValueByType(metric *FastjsonMetric, cwt *model.ColumnWithType) (val interface{}) {
name := cwt.SourceName
switch cwt.Type {
case Int:
val = metric.GetInt(name, cwt.Nullable)
case Float:
val = metric.GetFloat(name, cwt.Nullable)
case String:
val = metric.GetString(name, cwt.Nullable)
case DateTime:
val = metric.GetDateTime(name, cwt.Nullable)
case ElasticDateTime:
val = metric.GetElasticDateTime(name, cwt.Nullable)
case IntArray:
val = metric.GetArray(name, Int)
case FloatArray:
val = metric.GetArray(name, Float)
case StringArray:
val = metric.GetArray(name, String)
case DateTimeArray:
val = metric.GetArray(name, DateTime)
default:
logs.Logger.Sugar().Errorf("未知TYPE:%s", cwt.Type)
}
return
}
func init() {
primTypeInfo := make(map[string]TypeInfo)
typeInfo = make(map[string]TypeInfo)
for _, t := range []string{"UInt8", "UInt16", "UInt32", "UInt64", "Int8", "Int16", "Int32", "Int64"} {
primTypeInfo[t] = TypeInfo{Type: Int, Nullable: false}
}
for _, t := range []string{"Float32", "Float64"} {
primTypeInfo[t] = TypeInfo{Type: Float, Nullable: false}
}
for _, t := range []string{"String"} {
primTypeInfo[t] = TypeInfo{Type: String, Nullable: false}
}
for _, t := range []string{"Date", "DateTime"} {
primTypeInfo[t] = TypeInfo{Type: DateTime, Nullable: false}
}
primTypeInfo["ElasticDateTime"] = TypeInfo{Type: ElasticDateTime, Nullable: false}
for k, v := range primTypeInfo {
typeInfo[k] = v
nullK := fmt.Sprintf("Nullable(%s)", k)
typeInfo[nullK] = TypeInfo{Type: v.Type, Nullable: true}
arrK := fmt.Sprintf("Array(%s)", k)
switch v.Type {
case Int:
typeInfo[arrK] = TypeInfo{Type: IntArray, Nullable: false}
case Float:
typeInfo[arrK] = TypeInfo{Type: FloatArray, Nullable: false}
case String:
typeInfo[arrK] = TypeInfo{Type: StringArray, Nullable: false}
case DateTime:
typeInfo[arrK] = TypeInfo{Type: DateTimeArray, Nullable: false}
}
}
}
func WhichType(typ string) (dataType int, nullable bool) {
ti, ok := typeInfo[typ]
if ok {
dataType, nullable = ti.Type, ti.Nullable
return
}
nullable = strings.HasPrefix(typ, "Nullable(")
if nullable {
typ = typ[len("Nullable(") : len(typ)-1]
}
if strings.HasPrefix(typ, "DateTime64") {
dataType = DateTime
} else if strings.HasPrefix(typ, "Array(DateTime64") {
dataType = DateTimeArray
nullable = false
} else if strings.HasPrefix(typ, "Decimal") {
dataType = Float
} else if strings.HasPrefix(typ, "Array(Decimal") {
dataType = FloatArray
nullable = false
} else if strings.HasPrefix(typ, "FixedString") {
dataType = String
} else if strings.HasPrefix(typ, "Array(FixedString") {
dataType = StringArray
nullable = false
} else {
logs.Logger.Sugar().Errorf("未知TYPE:%s", typ)
}
typeInfo[typ] = TypeInfo{Type: dataType, Nullable: nullable}
return
}