Skip to content

Commit 89dffa2

Browse files
committed
feat(jzero): support set model cache expiry
feat(jzero): support set model cache expiry feat(jzero): support set model cache expiry feat(jzero): support set model cache expiry feat(jzero): support set model cache expiry
1 parent ed6c5a6 commit 89dffa2

3 files changed

Lines changed: 199 additions & 27 deletions

File tree

cmd/jzero/.template/model/model.go.tpl

Lines changed: 102 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,134 @@
33
package model
44

55
import (
6+
"time"
7+
68
"github.com/zeromicro/go-zero/core/stores/sqlx"
79
"github.com/jzero-io/jzero/core/stores/modelx"
810
"github.com/eddieowens/opts"
11+
"github.com/zeromicro/go-zero/core/stores/cache"
912

1013
{{range $v := .ImportsWithAlias}}{{if $v.Alias}}{{$v.Alias}}{{end}} "{{$v.Path}}"
1114
{{end}}
1215
)
1316

17+
{{if .ModelExpiryTable}}
18+
var (
19+
ModelExpiryTable map[string]int64 = map[string]int64{
20+
{{range $k, $v := .ModelExpiryTable}}"{{$k}}": {{$v}},
21+
{{end}}
22+
}
23+
)
24+
{{end}}
25+
26+
{{if .ModelNotFoundExpiryTable}}
27+
var (
28+
ModelNotFoundExpiryTable map[string]int64 = map[string]int64{
29+
{{range $k, $v := .ModelNotFoundExpiryTable}}"{{$k}}": {{$v}},
30+
{{end}}
31+
}
32+
)
33+
{{end}}
34+
1435
{{range $k,$v := .MutiModelsWithAlias}} type {{$k | FirstUpper | ToCamel}}Model struct {
1536
{{range $vv := $v}}{{$vv.Name | FirstUpper | ToCamel}} {{$vv.Alias}}.{{$vv.Name | FirstUpper |ToCamel}}Model
1637
{{end}}
1738
}
1839
{{end}}
1940

2041
type Model struct {
21-
{{range $v := .TablePackages}}{{$v | FirstUpper | ToCamel}} {{$v}}.{{$v | FirstUpper |ToCamel}}Model
42+
{{range $v := .TableInfos}}{{$v.Name | FirstUpper | ToCamel}} {{$v.Name}}.{{$v.Name | FirstUpper |ToCamel}}Model
2243
{{end}}
2344
}
2445

46+
{{if .ModelNewOriginal}}
47+
{{range $v := .TableInfos}}
48+
func NewOriginal{{$v.Name | FirstUpper | ToCamel}}Model(conn sqlx.SqlConn{{if and $.ModelCache $v.WithCache}}, c cache.CacheConf, op ...cache.Option{{end}}) {{$v.Name}}.{{$v.Name | FirstUpper | ToCamel}}Model {
49+
{{if and $.ModelCache $v.WithCache}}
50+
{{if $v.HasCacheExpiry}}
51+
if expiry, ok := ModelExpiryTable["{{$v.Name}}"]; ok {
52+
op = append(op, cache.WithExpiry(time.Duration(expiry)*time.Millisecond))
53+
}
54+
{{end}}
55+
{{if $v.HasNotFoundExpiry}}
56+
if notFoundExpiry, ok := ModelNotFoundExpiryTable["{{$v.Name}}"]; ok {
57+
op = append(op, cache.WithNotFoundExpiry(time.Duration(notFoundExpiry)*time.Millisecond))
58+
}
59+
{{end}}
60+
return {{$v.Name}}.NewOriginal{{$v.Name | FirstUpper | ToCamel}}Model(conn, c, op...)
61+
{{else}}
62+
return {{$v.Name}}.NewOriginal{{$v.Name | FirstUpper | ToCamel}}Model(conn)
63+
{{end}}
64+
}
65+
{{end}}
66+
{{end}}
67+
68+
{{if .ModelNewOriginal}}
69+
{{range $k,$v := .MutiModelsWithAlias}}
70+
{{range $vv := $v}}
71+
func NewOriginal{{$k | FirstUpper | ToCamel}}{{$vv.Name | FirstUpper | ToCamel}}Model(conn sqlx.SqlConn{{if and $.ModelCache $vv.WithCache}}, c cache.CacheConf, op ...cache.Option{{end}}) {{$vv.Alias}}.{{$vv.Name | FirstUpper |ToCamel}}Model {
72+
{{if and $.ModelCache $vv.WithCache}}
73+
{{if $vv.HasCacheExpiry}}
74+
if expiry, ok := ModelExpiryTable["{{$vv.FullName}}"]; ok {
75+
op = append(op, cache.WithExpiry(time.Duration(expiry)*time.Millisecond))
76+
}
77+
{{end}}
78+
{{if $vv.HasNotFoundExpiry}}
79+
if notFoundExpiry, ok := ModelNotFoundExpiryTable["{{$vv.FullName}}"]; ok {
80+
op = append(op, cache.WithNotFoundExpiry(time.Duration(notFoundExpiry)*time.Millisecond))
81+
}
82+
{{end}}
83+
return {{$vv.Alias}}.NewOriginal{{$vv.Name | FirstUpper | ToCamel}}Model(conn, c, op...)
84+
{{else}}
85+
return {{$vv.Alias}}.NewOriginal{{$vv.Name | FirstUpper | ToCamel}}Model(conn)
86+
{{end}}
87+
}
88+
{{end}}
89+
{{end}}
90+
{{end}}
91+
2592
func NewModel(conn sqlx.SqlConn, op ...opts.Opt[modelx.ModelOpts]) Model {
93+
{{range $v := .TableInfos}}
94+
{{if and $.ModelCache (or $v.HasCacheExpiry $v.HasNotFoundExpiry)}}
95+
{{$v.Name | ToCamel}}CacheOpts := opts.DefaultApply(op...).CacheOpts
96+
{{if $v.HasCacheExpiry}}
97+
if expiry, ok := ModelExpiryTable["{{$v.Name}}"]; ok {
98+
{{$v.Name | ToCamel}}CacheOpts = append({{$v.Name | ToCamel}}CacheOpts, cache.WithExpiry(time.Duration(expiry)*time.Millisecond))
99+
}
100+
{{end}}
101+
{{if $v.HasNotFoundExpiry}}
102+
if notFoundExpiry, ok := ModelNotFoundExpiryTable["{{$v.Name}}"]; ok {
103+
{{$v.Name | ToCamel}}CacheOpts = append({{$v.Name | ToCamel}}CacheOpts, cache.WithNotFoundExpiry(time.Duration(notFoundExpiry)*time.Millisecond))
104+
}
105+
{{end}}
106+
{{end}}
107+
{{end}}
108+
26109
return Model{
27-
{{range $v := .TablePackages}}{{$v | FirstUpper | ToCamel}}: {{$v}}.New{{ $v | FirstUpper | ToCamel }}Model(conn, op...),
110+
{{range $v := .TableInfos}}{{if and $.ModelCache (or $v.HasCacheExpiry $v.HasNotFoundExpiry)}}{{$v.Name | FirstUpper | ToCamel}}: {{$v.Name}}.New{{ $v.Name | FirstUpper | ToCamel }}Model(conn, append(op, modelx.WithCacheOpts({{$v.Name | ToCamel}}CacheOpts...))...),{{else}}{{$v.Name | FirstUpper | ToCamel}}: {{$v.Name}}.New{{ $v.Name | FirstUpper | ToCamel }}Model(conn, op...),{{end}}
28111
{{end}}
29112
}
30113
}
31114

32115
{{range $k,$v := .MutiModelsWithAlias}} func New{{$k | FirstUpper | ToCamel}}Model(conn sqlx.SqlConn, op ...opts.Opt[modelx.ModelOpts]) {{$k | FirstUpper | ToCamel}}Model {
116+
{{range $vv := $v}}
117+
{{if and $.ModelCache (or $vv.HasCacheExpiry $vv.HasNotFoundExpiry)}}
118+
{{$vv.Name | ToCamel}}CacheOpts := opts.DefaultApply(op...).CacheOpts
119+
{{if $vv.HasCacheExpiry}}
120+
if expiry, ok := ModelExpiryTable["{{$vv.FullName}}"]; ok {
121+
{{$vv.Name | ToCamel}}CacheOpts = append({{$vv.Name | ToCamel}}CacheOpts, cache.WithExpiry(time.Duration(expiry)*time.Millisecond))
122+
}
123+
{{end}}
124+
{{if $vv.HasNotFoundExpiry}}
125+
if notFoundExpiry, ok := ModelNotFoundExpiryTable["{{$vv.FullName}}"]; ok {
126+
{{$vv.Name | ToCamel}}CacheOpts = append({{$vv.Name | ToCamel}}CacheOpts, cache.WithNotFoundExpiry(time.Duration(notFoundExpiry)*time.Millisecond))
127+
}
128+
{{end}}
129+
{{end}}
130+
{{end}}
131+
33132
return {{$k | FirstUpper | ToCamel}}Model{
34-
{{range $vv := $v}}{{$vv.Name | FirstUpper | ToCamel}}: {{$vv.Alias}}.New{{ $vv.Name | FirstUpper | ToCamel }}Model(conn, op...),
133+
{{range $vv := $v}}{{$vv.Name | FirstUpper | ToCamel}}: {{$vv.Alias}}.New{{ $vv.Name | FirstUpper | ToCamel }}Model(conn, {{if and $.ModelCache (or $vv.HasCacheExpiry $vv.HasNotFoundExpiry)}}append(op, modelx.WithCacheOpts({{$vv.Name | ToCamel}}CacheOpts...))...{{else}}op...{{end}}),
35134
{{end}}
36135
}
37136
}

cmd/jzero/internal/command/gen/genmodel/plugins.go

Lines changed: 80 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/zeromicro/go-zero/core/logx"
1313
"github.com/zeromicro/go-zero/tools/goctl/util/pathx"
1414

15+
"github.com/jzero-io/jzero/cmd/jzero/internal/config"
1516
"github.com/jzero-io/jzero/cmd/jzero/internal/embeded"
1617
"github.com/jzero-io/jzero/cmd/jzero/internal/pkg/templatex"
1718
)
@@ -21,9 +22,13 @@ type ImportWithAlias struct {
2122
Path string
2223
}
2324

24-
type NameWithAlias struct {
25-
Alias string
26-
Name string
25+
type TableInfo struct {
26+
Alias string
27+
Name string
28+
FullName string // 完整表名,如 "log.user"
29+
WithCache bool
30+
HasCacheExpiry bool
31+
HasNotFoundExpiry bool
2732
}
2833

2934
func (jm *JzeroModel) GenRegister(tables []string) error {
@@ -34,9 +39,10 @@ func (jm *JzeroModel) GenRegister(tables []string) error {
3439
var imports []string
3540
var importsWithAlias []ImportWithAlias
3641
var tablePackages []string
42+
var tableInfos []TableInfo
3743

3844
mutiModels := make(map[string][]string)
39-
mutiModelsWithAlias := make(map[string][]NameWithAlias)
45+
mutiModelsWithAlias := make(map[string][]TableInfo)
4046

4147
for _, t := range tables {
4248
var isMutiModel bool
@@ -57,30 +63,91 @@ func (jm *JzeroModel) GenRegister(tables []string) error {
5763
Alias: strings.ReplaceAll(strings.ReplaceAll(t, ".", "_"), "-", "_"),
5864
Path: fmt.Sprintf("%s/internal/model/%s", jm.Module, strings.ToLower(filepath.ToSlash(tf))),
5965
})
60-
mutiModels[filepath.Dir(tf)] = append(mutiModels[filepath.Dir(tf)], strings.ToLower(filepath.Base(tf)))
61-
mutiModelsWithAlias[filepath.Dir(tf)] = append(mutiModelsWithAlias[filepath.Dir(tf)], NameWithAlias{
62-
Alias: strings.ReplaceAll(strings.ReplaceAll(t, ".", "_"), "-", "_"),
63-
Name: strings.ToLower(filepath.Base(tf)),
66+
tableName := strings.ToLower(filepath.Base(tf))
67+
mutiModels[filepath.Dir(tf)] = append(mutiModels[filepath.Dir(tf)], tableName)
68+
// 将路径分隔符替换为点,如 "log/user" -> "log.user"
69+
fullName := strings.ReplaceAll(strings.ToLower(tf), "/", ".")
70+
mutiModelsWithAlias[filepath.Dir(tf)] = append(mutiModelsWithAlias[filepath.Dir(tf)], TableInfo{
71+
Alias: strings.ReplaceAll(strings.ReplaceAll(t, ".", "_"), "-", "_"),
72+
Name: tableName,
73+
FullName: fullName, // 完整表名,如 "log.user"
74+
WithCache: getIsCacheTable(t),
6475
})
6576
} else {
6677
imports = append(imports, fmt.Sprintf("%s/internal/model/%s", jm.Module, strings.ToLower(filepath.ToSlash(tf))))
6778
importsWithAlias = append(importsWithAlias, ImportWithAlias{
6879
Path: fmt.Sprintf("%s/internal/model/%s", jm.Module, strings.ToLower(filepath.ToSlash(tf))),
6980
})
7081
tablePackages = append(tablePackages, strings.ToLower(tf))
82+
tableInfos = append(tableInfos, TableInfo{
83+
Name: strings.ToLower(tf),
84+
WithCache: getIsCacheTable(t),
85+
})
7186
}
7287
}
7388

7489
logx.Debugf("get register imports: %v", imports)
7590
logx.Debugf("get register table packages: %v", tablePackages)
7691
logx.Debugf("get register muti models: %v", mutiModels)
7792

93+
// Build cache expiry table maps - only when cache is enabled
94+
var modelExpiryTable map[string]int64
95+
var modelNotFoundExpiryTable map[string]int64
96+
if config.C.Gen.ModelCache {
97+
modelExpiryTable = make(map[string]int64)
98+
modelNotFoundExpiryTable = make(map[string]int64)
99+
for _, v := range config.C.Gen.ModelCacheExpiryTable {
100+
if v.Expiry > 0 {
101+
modelExpiryTable[v.Table] = v.Expiry
102+
}
103+
if v.NotFoundExpiry > 0 {
104+
modelNotFoundExpiryTable[v.Table] = v.NotFoundExpiry
105+
}
106+
}
107+
}
108+
109+
// Update tableInfos with cache expiry info
110+
for i := range tableInfos {
111+
if modelExpiryTable != nil {
112+
if _, ok := modelExpiryTable[tableInfos[i].Name]; ok {
113+
tableInfos[i].HasCacheExpiry = true
114+
}
115+
}
116+
if modelNotFoundExpiryTable != nil {
117+
if _, ok := modelNotFoundExpiryTable[tableInfos[i].Name]; ok {
118+
tableInfos[i].HasNotFoundExpiry = true
119+
}
120+
}
121+
}
122+
123+
// Update mutiModelsWithAlias with cache expiry info
124+
for k := range mutiModelsWithAlias {
125+
for i := range mutiModelsWithAlias[k] {
126+
fullName := mutiModelsWithAlias[k][i].FullName
127+
if modelExpiryTable != nil {
128+
if _, ok := modelExpiryTable[fullName]; ok {
129+
mutiModelsWithAlias[k][i].HasCacheExpiry = true
130+
}
131+
}
132+
if modelNotFoundExpiryTable != nil {
133+
if _, ok := modelNotFoundExpiryTable[fullName]; ok {
134+
mutiModelsWithAlias[k][i].HasNotFoundExpiry = true
135+
}
136+
}
137+
}
138+
}
139+
78140
template, err := templatex.ParseTemplate(filepath.Join("model", "model.go.tpl"), map[string]any{
79-
"Imports": imports,
80-
"ImportsWithAlias": importsWithAlias,
81-
"TablePackages": tablePackages,
82-
"MutiModels": mutiModels, // 兼容
83-
"MutiModelsWithAlias": mutiModelsWithAlias, // 兼容
141+
"Imports": imports,
142+
"ImportsWithAlias": importsWithAlias,
143+
"TablePackages": tablePackages,
144+
"TableInfos": tableInfos,
145+
"MutiModels": mutiModels, // 兼容
146+
"MutiModelsWithAlias": mutiModelsWithAlias, // 兼容
147+
"ModelExpiryTable": modelExpiryTable,
148+
"ModelNotFoundExpiryTable": modelNotFoundExpiryTable,
149+
"ModelCache": config.C.Gen.ModelCache,
150+
"ModelNewOriginal": config.C.Gen.ModelNewOriginal,
84151
}, lo.If(
85152
// 兼容老版本 model 路径
86153
// TODO: wait to remove

cmd/jzero/internal/config/config.go

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -120,17 +120,23 @@ type GenConfig struct {
120120
Table string `mapstructure:"table"`
121121
Columns []string `mapstructure:"columns"`
122122
} `mapstructure:"model-ignore-columns-table"`
123-
ModelSchema string `mapstructure:"model-schema"`
124-
ModelDatasource bool `mapstructure:"model-datasource"`
125-
ModelDatasourceUrl []string `mapstructure:"model-datasource-url"`
126-
ModelDatasourceTable []string `mapstructure:"model-datasource-table"`
127-
ModelCache bool `mapstructure:"model-cache"`
128-
ModelCacheTable []string `mapstructure:"model-cache-table"`
129-
ModelCachePrefix string `mapstructure:"model-cache-prefix"`
130-
MongoType []string `mapstructure:"mongo-type"`
131-
MongoCache bool `mapstructure:"mongo-cache"`
132-
MongoCachePrefix string `mapstructure:"mongo-cache-prefix"`
133-
MongoCacheType []string `mapstructure:"mongo-cache-type"`
123+
ModelSchema string `mapstructure:"model-schema"`
124+
ModelDatasource bool `mapstructure:"model-datasource"`
125+
ModelDatasourceUrl []string `mapstructure:"model-datasource-url"`
126+
ModelDatasourceTable []string `mapstructure:"model-datasource-table"`
127+
ModelCache bool `mapstructure:"model-cache"`
128+
ModelCacheTable []string `mapstructure:"model-cache-table"`
129+
ModelCachePrefix string `mapstructure:"model-cache-prefix"`
130+
ModelNewOriginal bool `mapstructure:"model-new-original"`
131+
ModelCacheExpiryTable []struct {
132+
Table string `mapstructure:"table"`
133+
Expiry int64 `mapstructure:"expiry"`
134+
NotFoundExpiry int64 `mapstructure:"not-found-expiry"`
135+
} `mapstructure:"model-cache-expiry-table"`
136+
MongoType []string `mapstructure:"mongo-type"`
137+
MongoCache bool `mapstructure:"mongo-cache"`
138+
MongoCachePrefix string `mapstructure:"mongo-cache-prefix"`
139+
MongoCacheType []string `mapstructure:"mongo-cache-type"`
134140

135141
// Gen Sub Command
136142
Swagger GenSwaggerConfig `mapstructure:"swagger"`

0 commit comments

Comments
 (0)