refactor(query): simplify node and tag filtering using InSet function
This commit is contained in:
parent
ef7491d025
commit
805fca90e0
@ -3,6 +3,7 @@ package subscribe
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
|
"github.com/perfect-panel/server/pkg/tool"
|
||||||
"github.com/redis/go-redis/v9"
|
"github.com/redis/go-redis/v9"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
@ -95,29 +96,11 @@ func (m *customSubscribeModel) FilterList(ctx context.Context, params *FilterPar
|
|||||||
query = query.Where("id IN ?", params.Ids)
|
query = query.Where("id IN ?", params.Ids)
|
||||||
}
|
}
|
||||||
if len(params.Node) > 0 {
|
if len(params.Node) > 0 {
|
||||||
query = query.Where(func(db *gorm.DB) *gorm.DB {
|
query = query.Scopes(InSet("nodes", tool.Int64SliceToStringSlice(params.Node)))
|
||||||
for i, id := range params.Node {
|
|
||||||
if i == 0 {
|
|
||||||
db = db.Where("FIND_IN_SET(?, nodes)", id)
|
|
||||||
} else {
|
|
||||||
db = db.Or("FIND_IN_SET(?, nodes)", id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return db
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(params.Tags) > 0 {
|
if len(params.Tags) > 0 {
|
||||||
query = query.Where(func(db *gorm.DB) *gorm.DB {
|
query = query.Scopes(InSet("node_tags", params.Tags))
|
||||||
for i, tag := range params.Tags {
|
|
||||||
if i == 0 {
|
|
||||||
db = db.Where("FIND_IN_SET(?, node_tags)", tag)
|
|
||||||
} else {
|
|
||||||
db = db.Or("FIND_IN_SET(?, node_tags)", tag)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return db
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
if lang != "" {
|
if lang != "" {
|
||||||
query = query.Where("language = ?", lang)
|
query = query.Where("language = ?", lang)
|
||||||
@ -157,3 +140,21 @@ func (m *customSubscribeModel) FilterList(ctx context.Context, params *FilterPar
|
|||||||
|
|
||||||
return total, list, nil
|
return total, list, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func InSet(field string, values []string) func(db *gorm.DB) *gorm.DB {
|
||||||
|
return func(db *gorm.DB) *gorm.DB {
|
||||||
|
if len(values) == 0 {
|
||||||
|
return db
|
||||||
|
}
|
||||||
|
|
||||||
|
conds := db
|
||||||
|
for i, v := range values {
|
||||||
|
if i == 0 {
|
||||||
|
conds = conds.Where("FIND_IN_SET(?, "+field+")", v)
|
||||||
|
} else {
|
||||||
|
conds = conds.Or("FIND_IN_SET(?, "+field+")", v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return conds
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user