147 lines
4.4 KiB
Go
147 lines
4.4 KiB
Go
![]() |
package analysis
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"github.com/1340691923/xwl_bi/engine/db"
|
||
|
"github.com/1340691923/xwl_bi/platform-basic-libs/request"
|
||
|
"github.com/1340691923/xwl_bi/platform-basic-libs/response"
|
||
|
"github.com/1340691923/xwl_bi/platform-basic-libs/service/analysis/utils"
|
||
|
parser "github.com/1340691923/xwl_bi/platform-basic-libs/sinker/parse"
|
||
|
"github.com/1340691923/xwl_bi/platform-basic-libs/util"
|
||
|
jsoniter "github.com/json-iterator/go"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type BehaviorAnalysisService struct {
|
||
|
|
||
|
}
|
||
|
|
||
|
func(this *BehaviorAnalysisService)GetConfigs(appid int)(eventNameList []response.MetaEventListRes,attributeMap map[int][]response.AttributeRes,err error){
|
||
|
|
||
|
attributeMap = map[int][]response.AttributeRes{}
|
||
|
|
||
|
if err := db.Sqlx.Select(&eventNameList, "select event_name,show_name from meta_event where appid = ?", appid); err != nil {
|
||
|
return eventNameList,attributeMap,err
|
||
|
}
|
||
|
|
||
|
var attributeRes []response.AttributeRes
|
||
|
if err := db.Sqlx.Select(&attributeRes, "select attribute_name,show_name,data_type,attribute_type,attribute_source from attribute where app_id = ? and (status = 1 or attribute_type = 1) and attribute_name not in ('xwl_part_date','xwl_kafka_offset','xwl_part_event') order by attribute_type asc", appid); err != nil {
|
||
|
return eventNameList,attributeMap,err
|
||
|
}
|
||
|
|
||
|
for k, v := range attributeRes {
|
||
|
if _, ok := parser.TypeRemarkMap[v.DataType]; ok {
|
||
|
attributeRes[k].DataTypeFormat = parser.TypeRemarkMap[v.DataType]
|
||
|
}
|
||
|
if _, ok := parser.SysColumn[v.AttributeName]; ok {
|
||
|
attributeRes[k].ShowName = parser.SysColumn[v.AttributeName]
|
||
|
}
|
||
|
if _, ok := attributeMap[v.AttributeSource]; ok {
|
||
|
attributeMap[v.AttributeSource] = append(attributeMap[v.AttributeSource], attributeRes[k])
|
||
|
} else {
|
||
|
attributeMap[v.AttributeSource] = []response.AttributeRes{attributeRes[k]}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
type AttributeName struct {
|
||
|
AttributeName string `json:"attribute_name" db:"attribute_name"`
|
||
|
ShowName string `json:"show_name" db:"show_name"`
|
||
|
DataType int `json:"data_type" db:"data_type"`
|
||
|
Analysis map[string]string `json:"analysis" db:"-"`
|
||
|
}
|
||
|
|
||
|
func(this *BehaviorAnalysisService) LoadPropQuotas(reqData request.LoadPropQuotasReq)(attributeNameList []AttributeName,err error){
|
||
|
|
||
|
if err := db.Sqlx.Select(&attributeNameList,
|
||
|
"select attribute_name,show_name,data_type from attribute "+
|
||
|
" where app_id = ? and (status = 1 or attribute_type = 1) and attribute_source = 2 "+
|
||
|
"and attribute_name not in ('xwl_part_event','xwl_part_date') and attribute_name in "+
|
||
|
"(select event_attr from meta_attr_relation where app_id = ? and event_name = ?)",
|
||
|
reqData.Appid,
|
||
|
reqData.Appid,
|
||
|
reqData.EventName,
|
||
|
); err != nil {
|
||
|
return nil,err
|
||
|
}
|
||
|
|
||
|
for index, v := range attributeNameList {
|
||
|
if v.ShowName == "" {
|
||
|
attributeNameList[index].ShowName = v.AttributeName
|
||
|
}
|
||
|
if _, ok := parser.SysColumn[v.AttributeName]; ok {
|
||
|
attributeNameList[index].ShowName = parser.SysColumn[v.AttributeName]
|
||
|
}
|
||
|
|
||
|
switch v.DataType {
|
||
|
case parser.Int:
|
||
|
fallthrough
|
||
|
case parser.Float:
|
||
|
attributeNameList[index].Analysis = utils.IntPropQuotas
|
||
|
case parser.String:
|
||
|
attributeNameList[index].Analysis = utils.StringPropQuotas
|
||
|
}
|
||
|
}
|
||
|
return attributeNameList,nil
|
||
|
}
|
||
|
|
||
|
type ValueStruct struct {
|
||
|
Value interface{} `json:"value" db:"value"`
|
||
|
}
|
||
|
|
||
|
func(this *BehaviorAnalysisService) GetValues(appid string,table string,col string,reqData []byte)(values []ValueStruct,err error){
|
||
|
|
||
|
cache := NewCache(time.Minute*2, fmt.Sprintf("%s_%s_%s_%s", "GetValues", appid, table, col), reqData)
|
||
|
|
||
|
resData, redisErr := cache.LoadData()
|
||
|
|
||
|
if util.FilterRedisNilErr(redisErr) {
|
||
|
return values,err
|
||
|
}
|
||
|
if len(resData) > 0 {
|
||
|
var json = jsoniter.ConfigCompatibleWithStandardLibrary
|
||
|
|
||
|
err := json.Unmarshal(resData, &values)
|
||
|
|
||
|
if err != nil {
|
||
|
return values,err
|
||
|
}
|
||
|
|
||
|
return values,err
|
||
|
}
|
||
|
|
||
|
tableName := ""
|
||
|
switch table {
|
||
|
case "1":
|
||
|
tableName = "xwl_user" + appid
|
||
|
case "2":
|
||
|
tableName = "xwl_event" + appid
|
||
|
}
|
||
|
|
||
|
SQL := "select DISTINCT " + col + " as value from " + tableName + " where isNotNull(" + col + ") ;"
|
||
|
|
||
|
err = db.ClickHouseSqlx.Select(&values, SQL)
|
||
|
if err != nil {
|
||
|
return values,err
|
||
|
}
|
||
|
|
||
|
for index, v := range values {
|
||
|
switch v.Value.(type) {
|
||
|
case time.Time:
|
||
|
values[index].Value = v.Value.(time.Time).Format(util.TimeFormat)
|
||
|
default:
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
resB, err := json.Marshal(values)
|
||
|
if err != nil {
|
||
|
return values,err
|
||
|
}
|
||
|
cache.SetData(resB)
|
||
|
|
||
|
return values,err
|
||
|
}
|