168 lines
4.8 KiB
Go
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
|
||
|
}
|