135 lines
3.8 KiB
Go
135 lines
3.8 KiB
Go
|
package repo
|
||
|
|
||
|
import (
|
||
|
"admin/apps/game/model"
|
||
|
"admin/internal/errcode"
|
||
|
"admin/lib/utils"
|
||
|
"github.com/ClickHouse/clickhouse-go/v2/lib/driver"
|
||
|
"github.com/jmoiron/sqlx"
|
||
|
"gorm.io/gorm"
|
||
|
"sort"
|
||
|
)
|
||
|
|
||
|
type IGameLogRepo interface {
|
||
|
QueryAttrListByEvent(appId int, eventName []string) ([]*AttrInfo, error)
|
||
|
NewEventListQuerier(tableName string, eventName []string, attrList []*AttrInfo) *EventListQuerier
|
||
|
}
|
||
|
|
||
|
func NewGameLogRepo(metaDb *gorm.DB, ckDb driver.Conn, clickHouseSqlx *sqlx.DB) IGameLogRepo {
|
||
|
return &gameLogRepoImpl{metaDb: metaDb, db: ckDb, clickHouseSqlx: clickHouseSqlx}
|
||
|
}
|
||
|
|
||
|
type gameLogRepoImpl struct {
|
||
|
metaDb *gorm.DB
|
||
|
db driver.Conn
|
||
|
clickHouseSqlx *sqlx.DB
|
||
|
}
|
||
|
|
||
|
type GetEventAttrResult struct {
|
||
|
AppId int
|
||
|
EventName string
|
||
|
EventAlias string
|
||
|
AttrName string
|
||
|
AttrAlias string
|
||
|
AttrFieldType int
|
||
|
AttrIsPublicField int
|
||
|
}
|
||
|
|
||
|
func (impl *gameLogRepoImpl) QueryAttrListByEvent(appId int, eventName []string) ([]*AttrInfo, error) {
|
||
|
resultList := make([]*GetEventAttrResult, 0)
|
||
|
err := impl.metaDb.Model(&model.EventAttribute{}).Select("meta_attr_relation.app_id,"+
|
||
|
"meta_event.event_name as event_name,"+
|
||
|
"meta_event.show_name as event_alias,"+
|
||
|
"attribute.attribute_name as attr_name,"+
|
||
|
"attribute.show_name as attr_alias,"+
|
||
|
"attribute.data_type as attr_field_type,"+
|
||
|
"attribute.attribute_type as attr_is_public_field",
|
||
|
).
|
||
|
Joins("inner join meta_event on "+
|
||
|
"meta_event.event_name=meta_attr_relation.event_name and "+
|
||
|
"meta_event.appid=? and meta_attr_relation.app_id=?", appId, appId).
|
||
|
Joins("inner join attribute on "+
|
||
|
"attribute.attribute_name=meta_attr_relation.event_attr and "+
|
||
|
"attribute.app_id=?", appId).
|
||
|
Scan(&resultList).Error
|
||
|
if err != nil {
|
||
|
return nil, errcode.New(errcode.DBError, "join tables get event list error:%v", err)
|
||
|
}
|
||
|
|
||
|
attrList := make([]*AttrInfo, 0)
|
||
|
|
||
|
var timeAttr *AttrInfo
|
||
|
for _, attr := range resultList {
|
||
|
if len(eventName) == 0 || utils.IsInSlice(eventName, attr.EventName) {
|
||
|
if len(attr.AttrName) >= 4 && attr.AttrName[:4] == "xwl_" {
|
||
|
if attr.AttrName != "xwl_part_date" {
|
||
|
continue
|
||
|
}
|
||
|
timeAttr = &AttrInfo{
|
||
|
Name: attr.AttrName,
|
||
|
Alias: "时间",
|
||
|
DataType: attr.AttrFieldType,
|
||
|
IsUserAttr: attr.AttrIsPublicField != 2,
|
||
|
}
|
||
|
continue
|
||
|
}
|
||
|
attrList = append(attrList, &AttrInfo{
|
||
|
Name: attr.AttrName,
|
||
|
Alias: attr.AttrAlias,
|
||
|
DataType: attr.AttrFieldType,
|
||
|
IsUserAttr: attr.AttrIsPublicField != 2,
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
sort.SliceStable(attrList, func(i, j int) bool {
|
||
|
if attrList[i].IsUserAttr && !attrList[j].IsUserAttr {
|
||
|
return false
|
||
|
}
|
||
|
if attrList[i].IsUserAttr && attrList[j].IsUserAttr {
|
||
|
return false
|
||
|
}
|
||
|
if attrList[i].IsUserAttr && attrList[j].IsUserAttr {
|
||
|
return false
|
||
|
}
|
||
|
return true
|
||
|
})
|
||
|
if timeAttr != nil {
|
||
|
attrList = append([]*AttrInfo{timeAttr}, attrList...)
|
||
|
}
|
||
|
|
||
|
//retList := make(map[string][]*AttrInfo)
|
||
|
//for _, attr := range resultList {
|
||
|
// attrList, find := retList[attr.EventName]
|
||
|
// if !find {
|
||
|
// attrList = make([]*AttrInfo, 0, 1)
|
||
|
// }
|
||
|
// attrList = append(attrList, &AttrInfo{
|
||
|
// Name: attr.AttrName,
|
||
|
// Alias: attr.AttrAlias,
|
||
|
// DataType: attr.AttrFieldType,
|
||
|
// IsUserAttr: attr.AttrIsPublicField != 2,
|
||
|
// })
|
||
|
// retList[attr.EventName] = attrList
|
||
|
//}
|
||
|
|
||
|
return attrList, nil
|
||
|
}
|
||
|
|
||
|
type AttrInfo struct {
|
||
|
Name string
|
||
|
Alias string
|
||
|
DataType int // 1:number 3:string 4:time
|
||
|
IsUserAttr bool
|
||
|
}
|
||
|
|
||
|
func (impl *gameLogRepoImpl) NewEventListQuerier(tableName string, eventName []string, attrList []*AttrInfo) *EventListQuerier {
|
||
|
querier := new(EventListQuerier)
|
||
|
querier.db = impl.db
|
||
|
querier.clickHouseSqlx = impl.clickHouseSqlx
|
||
|
querier.tableName = tableName
|
||
|
querier.eventName = eventName
|
||
|
querier.attrList = attrList
|
||
|
return querier
|
||
|
}
|