Files
gormt/data/view/model/common.go
ly258liuyue d11a1d722e fix model colname error
修复gorm.model 导出问题
2021-07-20 11:43:25 +08:00

249 lines
6.5 KiB
Go
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package model
import (
"bytes"
"fmt"
"regexp"
"strings"
"text/template"
"github.com/xxjwxc/gormt/data/config"
"github.com/xxjwxc/gormt/data/view/cnf"
"github.com/xxjwxc/gormt/data/view/genfunc"
"github.com/xxjwxc/public/mybigcamel"
"github.com/xxjwxc/public/tools"
)
// getCamelName Big Hump or Capital Letter.大驼峰或者首字母大写
func getCamelName(name string) string {
// if !config.GetSingularTable() { // If the table name plural is globally disabled.如果全局禁用表名复数
// return mybigcamel.Marshal(strings.TrimSuffix(name, "s"))
// }
return mybigcamel.Marshal(name)
}
// titleCase title case.首字母大写
func titleCase(name string) string {
vv := []rune(name)
if len(vv) > 0 {
if bool(vv[0] >= 'a' && vv[0] <= 'z') { // title case.首字母大写
vv[0] -= 32
}
}
return string(vv)
}
// CapLowercase 小写.且兼容 golint 驼峰命名规则
func CapLowercase(name string) string { // IDAPIID == > idAPIID
list := strings.Split(mybigcamel.UnMarshal(name), "_")
if len(list) == 0 {
return ""
}
re := list[0] + name[len(list[0]):]
return FilterKeywords(re)
}
// GetTablePrefixName 获取带表前缀名字的tablename
func GetTablePrefixName(name string) string { //
tablePrefix := config.GetTablePrefix()
//如果设置了表前缀
if tablePrefix != "" {
name = tablePrefix + name
}
return name
}
func FilterKeywords(src string) string {
if tools.IsKeywords(src) {
return "_" + src
}
return src
}
// getTypeName Type acquisition filtering.类型获取过滤
func getTypeName(name string, isNull bool) string {
// 优先匹配自定义类型
selfDefineTypeMqlDicMap := config.GetSelfTypeDefine()
if v, ok := selfDefineTypeMqlDicMap[name]; ok {
return fixNullToPorint(v, isNull)
}
// Precise matching first.先精确匹配
if v, ok := cnf.TypeMysqlDicMp[name]; ok {
return fixNullToPorint(v, isNull)
}
// Fuzzy Regular Matching.模糊正则匹配
for _, l := range cnf.TypeMysqlMatchList {
if ok, _ := regexp.MatchString(l.Key, name); ok {
return fixNullToPorint(l.Value, isNull)
}
}
panic(fmt.Sprintf("type (%v) not match in any way.maybe need to add on (https://github.com/xxjwxc/gormt/blob/master/data/view/cnf/def.go)", name))
}
// 过滤null point 类型
func fixNullToPorint(name string, isNull bool) string {
if isNull && config.GetIsNullToPoint() {
if strings.HasPrefix(name, "uint") {
return "*" + name
}
if strings.HasPrefix(name, "int") {
return "*" + name
}
if strings.HasPrefix(name, "float") {
return "*" + name
}
}
return name
}
func getUninStr(left, middle, right string) string {
re := left
if len(right) > 0 {
re = left + middle + right
}
return re
}
func getGormModelElement() []EmInfo {
    var result []EmInfo
    result = append(result, EmInfo{
        IsMulti:       false,
        Notes:         "Primary key",
        Type:          "int64", // Type.类型标记
        ColName:       "id",
        ColNameEx:     "id",
        ColStructName: "ID",
    })
    result = append(result, EmInfo{
        IsMulti:       false,
        Notes:         "created time",
        Type:          "time.Time", // Type.类型标记
        ColName:       "created_at",
        ColNameEx:     "created_at",
        ColStructName: "CreatedAt",
    })
    result = append(result, EmInfo{
        IsMulti:       false,
        Notes:         "updated at",
        Type:          "time.Time", // Type.类型标记
        ColName:       "updated_at",
        ColNameEx:     "updated_at",
        ColStructName: "UpdatedAt",
    })
    result = append(result, EmInfo{
        IsMulti:       false,
        Notes:         "deleted time",
        Type:          "time.Time", // Type.类型标记
        ColName:       "deleted_at",
        ColNameEx:     "deleted_at",
        ColStructName: "DeletedAt",
    })
    return result
}
func buildFList(list *[]FList, key ColumnsKey, keyName, tp, colName string) {
for i := 0; i < len(*list); i++ {
if (*list)[i].KeyName == keyName {
(*list)[i].Kem = append((*list)[i].Kem, FEm{
Type: tp,
ColName: colName,
ColStructName: getCamelName(colName),
})
return
}
}
// 没有 添加一个
*list = append(*list, FList{
Key: key,
KeyName: keyName,
Kem: []FEm{FEm{
Type: tp,
ColName: colName,
ColStructName: getCamelName(colName),
}},
})
}
// GenPreloadList 生成list
func GenPreloadList(list []PreloadInfo, multi bool) string {
if len(list) > 0 {
tmpl, err := template.New("gen_preload").Parse(genfunc.GetGenPreloadTemp(multi))
if err != nil {
panic(err)
}
var buf bytes.Buffer
tmpl.Execute(&buf, list)
return buf.String()
}
return ""
}
// GenFListIndex 生成list status(1:获取函数名,2:获取参数列表,3:获取sql case,4:值列表)
func GenFListIndex(info FList, status int) string {
switch status {
case 1: // 1:获取函数名
{
return widthFunctionName(info)
}
case 2: // 2:获取参数列表
{
var strs []string
for _, v := range info.Kem {
strs = append(strs, fmt.Sprintf("%v %v ", CapLowercase(v.ColStructName), v.Type))
}
return strings.Join(strs, ",")
}
case 3: // 3:获取sql case,
{
var strs []string
for _, v := range info.Kem {
strs = append(strs, fmt.Sprintf("`%v` = ?", v.ColName)) //wxw 2021.2.26 16:53
}
return strings.Join(strs, " AND ")
}
case 4: // 4:值列表
{
var strs []string
for _, v := range info.Kem {
strs = append(strs, CapLowercase(v.ColStructName))
}
return strings.Join(strs, " , ")
}
}
return ""
}
func widthFunctionName(info FList) string {
switch info.Key {
// case ColumnsKeyDefault:
case ColumnsKeyPrimary: // primary key.主键
return "FetchByPrimaryKey"
case ColumnsKeyUnique: // unique key.唯一索引
return "FetchUniqueBy" + getCamelName(info.KeyName)
case ColumnsKeyIndex: // index key.复合索引
return "FetchIndexBy" + getCamelName(info.KeyName)
case ColumnsKeyUniqueIndex: // unique index key.唯一复合索引
return "FetchUniqueIndexBy" + getCamelName(info.KeyName)
}
return ""
}
func fixNotes(str string) string { // 注释
return strings.Replace(str, "\n", "\n//", -1)
}