2023-05-20 17:38:19 +00:00
|
|
|
package model
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/fthvgb1/wp-go/app/pkg/models"
|
2023-05-27 06:42:14 +00:00
|
|
|
"github.com/fthvgb1/wp-go/helper/slice"
|
2023-05-20 17:38:19 +00:00
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
2023-05-24 13:33:30 +00:00
|
|
|
type TermTaxonomy struct {
|
|
|
|
TermTaxonomyId uint64 `gorm:"column:term_taxonomy_id" db:"term_taxonomy_id" json:"term_taxonomy_id" form:"term_taxonomy_id"`
|
|
|
|
TermId uint64 `gorm:"column:term_id" db:"term_id" json:"term_id" form:"term_id"`
|
|
|
|
Taxonomy string `gorm:"column:taxonomy" db:"taxonomy" json:"taxonomy" form:"taxonomy"`
|
|
|
|
Description string `gorm:"column:description" db:"description" json:"description" form:"description"`
|
|
|
|
Parent uint64 `gorm:"column:parent" db:"parent" json:"parent" form:"parent"`
|
|
|
|
Count int64 `gorm:"column:count" db:"count" json:"count" form:"count"`
|
|
|
|
Term *models.Terms
|
|
|
|
}
|
|
|
|
|
2023-05-29 11:40:11 +00:00
|
|
|
type CommentMeta struct {
|
|
|
|
MetaId uint64 `db:"meta_id"`
|
|
|
|
CommentId uint64 `db:"comment_id"`
|
|
|
|
MetaKey string `db:"meta_key"`
|
|
|
|
MetaValue string `db:"meta_value"`
|
|
|
|
}
|
|
|
|
|
2023-05-24 13:33:30 +00:00
|
|
|
var termMyHasOneTerm = RelationHasOne(func(m *TermTaxonomy) uint64 {
|
|
|
|
return m.TermTaxonomyId
|
|
|
|
}, func(p *models.Terms) uint64 {
|
|
|
|
return p.TermId
|
|
|
|
}, func(m *TermTaxonomy, p *models.Terms) {
|
|
|
|
m.Term = p
|
|
|
|
}, Relationship{
|
|
|
|
RelationType: HasOne,
|
|
|
|
Table: "wp_terms",
|
|
|
|
ForeignKey: "term_id",
|
|
|
|
Local: "term_id",
|
|
|
|
})
|
|
|
|
|
|
|
|
var postHasManyShip = RelationHasMany(func(m *post) uint64 {
|
|
|
|
return m.Id
|
|
|
|
}, func(p *TermRelationships) uint64 {
|
|
|
|
return p.ObjectID
|
|
|
|
}, func(m *post, i *[]TermRelationships) {
|
|
|
|
m.Ships = i
|
|
|
|
}, Relationship{
|
|
|
|
RelationType: HasMany,
|
|
|
|
Table: "wp_term_relationships",
|
|
|
|
ForeignKey: "object_id",
|
|
|
|
Local: "ID",
|
|
|
|
})
|
|
|
|
|
|
|
|
var shipHasManyTermMy = RelationHasMany(func(m *TermRelationships) uint64 {
|
|
|
|
return m.TermTaxonomyId
|
|
|
|
}, func(p *TermTaxonomy) uint64 {
|
|
|
|
return p.TermTaxonomyId
|
|
|
|
}, func(m *TermRelationships, i *[]TermTaxonomy) {
|
|
|
|
m.TermTaxonomy = i
|
|
|
|
}, Relationship{
|
|
|
|
RelationType: HasMany,
|
|
|
|
Table: "wp_term_taxonomy",
|
|
|
|
ForeignKey: "term_taxonomy_id",
|
|
|
|
Local: "term_taxonomy_id",
|
|
|
|
})
|
|
|
|
|
|
|
|
func (w TermTaxonomy) PrimaryKey() string {
|
|
|
|
return "term_taxonomy_id"
|
|
|
|
}
|
|
|
|
|
|
|
|
func (w TermTaxonomy) Table() string {
|
|
|
|
return "wp_term_taxonomy"
|
|
|
|
}
|
|
|
|
|
2023-05-20 17:38:19 +00:00
|
|
|
func postAuthorId(p *post) uint64 {
|
|
|
|
return p.PostAuthor
|
|
|
|
}
|
|
|
|
|
|
|
|
func postId(p *post) uint64 {
|
|
|
|
return p.Id
|
|
|
|
}
|
|
|
|
|
|
|
|
func userId(u *user) uint64 {
|
|
|
|
return u.Id
|
|
|
|
}
|
|
|
|
|
|
|
|
func metasPostId(m *models.PostMeta) uint64 {
|
|
|
|
return m.PostId
|
|
|
|
}
|
|
|
|
|
|
|
|
func PostAuthor() (func(any) []any, func(any, any), any, any, Relationship) {
|
|
|
|
var u user
|
|
|
|
var uu []user
|
|
|
|
return GetWithID[post](func(t *post) uint64 {
|
|
|
|
return t.PostAuthor
|
|
|
|
}),
|
|
|
|
SetHasOne(func(p *post, u *user) {
|
|
|
|
p.User = u
|
|
|
|
}, func(t *post) uint64 {
|
|
|
|
return t.PostAuthor
|
|
|
|
}, func(u *user) uint64 {
|
|
|
|
return u.Id
|
|
|
|
}),
|
|
|
|
&u, &uu,
|
|
|
|
Relationship{
|
2023-05-21 13:30:00 +00:00
|
|
|
RelationType: HasOne,
|
2023-05-20 17:38:19 +00:00
|
|
|
Table: "wp_users user",
|
|
|
|
ForeignKey: "ID",
|
|
|
|
Local: "post_author",
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func PostMetas() (func(any) []any, func(any, any), any, any, Relationship) {
|
|
|
|
var u []models.PostMeta
|
|
|
|
return GetWithID(func(t *post) any {
|
|
|
|
return t.Id
|
|
|
|
}), SetHasMany(func(t *post, v *[]models.PostMeta) {
|
|
|
|
t.PostMeta = v
|
|
|
|
}, func(t *post) uint64 {
|
|
|
|
return t.Id
|
|
|
|
}, func(m *models.PostMeta) uint64 {
|
|
|
|
return m.PostId
|
|
|
|
}), &u, &u, Relationship{
|
2023-05-21 13:30:00 +00:00
|
|
|
RelationType: HasMany,
|
2023-05-20 17:38:19 +00:00
|
|
|
Table: "wp_postmeta meta",
|
|
|
|
ForeignKey: "post_id",
|
|
|
|
Local: "ID",
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-05-27 06:42:14 +00:00
|
|
|
var postHaveManyTerms = RelationHasMany(func(m *post) uint64 {
|
2023-05-24 12:41:24 +00:00
|
|
|
return m.Id
|
2023-05-27 06:42:14 +00:00
|
|
|
}, func(p *struct {
|
|
|
|
ObjectId uint64 `db:"object_id"`
|
|
|
|
models.Terms
|
|
|
|
}) uint64 {
|
|
|
|
return p.ObjectId
|
|
|
|
}, func(m *post, i *[]struct {
|
|
|
|
ObjectId uint64 `db:"object_id"`
|
|
|
|
models.Terms
|
|
|
|
}) {
|
|
|
|
v := slice.Map(*i, func(t struct {
|
|
|
|
ObjectId uint64 `db:"object_id"`
|
|
|
|
models.Terms
|
|
|
|
}) models.Terms {
|
|
|
|
return t.Terms
|
|
|
|
})
|
|
|
|
m.Terms = &v
|
2023-05-24 12:41:24 +00:00
|
|
|
}, Relationship{
|
|
|
|
RelationType: HasOne,
|
2023-05-27 06:42:14 +00:00
|
|
|
Table: "wp_terms",
|
|
|
|
ForeignKey: "term_id",
|
|
|
|
Local: "term_id",
|
2023-05-24 12:41:24 +00:00
|
|
|
Middle: &Relationship{
|
2023-05-27 06:42:14 +00:00
|
|
|
RelationType: HasOne,
|
|
|
|
Table: "wp_term_taxonomy taxonomy",
|
|
|
|
ForeignKey: "term_taxonomy_id",
|
|
|
|
Local: "term_taxonomy_id",
|
|
|
|
Middle: &Relationship{
|
|
|
|
RelationType: HasMany,
|
|
|
|
Table: "wp_term_relationships",
|
|
|
|
ForeignKey: "object_id",
|
|
|
|
Local: "ID",
|
|
|
|
},
|
2023-05-24 12:41:24 +00:00
|
|
|
},
|
|
|
|
})
|
|
|
|
|
2023-05-29 11:40:11 +00:00
|
|
|
var postHaveManyCommentMetas = func() RelationFn {
|
|
|
|
type metas struct {
|
|
|
|
CommentPostID uint64 `db:"comment_post_ID"`
|
|
|
|
CommentMeta
|
|
|
|
}
|
|
|
|
return RelationHasMany(func(m *post) uint64 {
|
|
|
|
return m.Id
|
|
|
|
}, func(p *metas) uint64 {
|
|
|
|
return p.CommentPostID
|
|
|
|
}, func(m *post, i *[]metas) {
|
|
|
|
v := slice.Map(*i, func(t metas) CommentMeta {
|
|
|
|
return t.CommentMeta
|
|
|
|
})
|
2023-05-31 13:54:23 +00:00
|
|
|
m.CommentMetas = v
|
2023-05-29 11:40:11 +00:00
|
|
|
}, Relationship{
|
|
|
|
RelationType: HasOne,
|
|
|
|
Table: "wp_commentmeta",
|
|
|
|
ForeignKey: "comment_id",
|
|
|
|
Local: "comment_ID",
|
|
|
|
Middle: &Relationship{
|
|
|
|
RelationType: HasMany,
|
|
|
|
Table: "wp_comments comments",
|
|
|
|
ForeignKey: "comment_post_ID",
|
|
|
|
Local: "ID",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}()
|
|
|
|
|
2023-05-20 17:38:19 +00:00
|
|
|
func Meta2() RelationFn {
|
|
|
|
return RelationHasMany(postId, metasPostId, func(m *post, i *[]models.PostMeta) {
|
|
|
|
m.PostMeta = i
|
|
|
|
}, Relationship{
|
|
|
|
RelationType: "hasMany",
|
|
|
|
Table: "wp_postmeta meta",
|
|
|
|
ForeignKey: "post_id",
|
|
|
|
Local: "ID",
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func PostAuthor2() RelationFn {
|
2023-05-21 13:30:00 +00:00
|
|
|
return RelationHasOne(postAuthorId, userId, func(p *post, u *user) {
|
2023-05-20 17:38:19 +00:00
|
|
|
p.User = u
|
|
|
|
}, Relationship{
|
|
|
|
RelationType: "hasOne",
|
|
|
|
Table: "wp_users user",
|
|
|
|
ForeignKey: "ID",
|
|
|
|
Local: "post_author",
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGets2(t *testing.T) {
|
|
|
|
t.Run("one", func(t *testing.T) {
|
|
|
|
{
|
|
|
|
q := Conditions(
|
|
|
|
Where(SqlBuilder{{"posts.id = 190"}}),
|
|
|
|
WithCtx(&ctx),
|
|
|
|
WithFn(true, true, Conditions(
|
|
|
|
Fields("ID,user_login,user_pass"),
|
|
|
|
), PostAuthor2()),
|
|
|
|
Fields("posts.*"),
|
|
|
|
From("wp_posts posts"),
|
2023-05-24 13:33:30 +00:00
|
|
|
WithFn(true, true, nil, Meta2()),
|
|
|
|
WithFn(true, false, Conditions(
|
|
|
|
WithFn(true, false, Conditions(
|
|
|
|
WithFn(true, false, nil, termMyHasOneTerm),
|
|
|
|
), shipHasManyTermMy),
|
|
|
|
), postHasManyShip),
|
2023-05-27 06:42:14 +00:00
|
|
|
WithFn(true, false, nil, postHaveManyTerms),
|
2023-05-20 17:38:19 +00:00
|
|
|
)
|
|
|
|
got, err := Gets[post](ctx, q)
|
|
|
|
_ = got
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("err:%v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
t.Run("many", func(t *testing.T) {
|
|
|
|
{
|
|
|
|
q := Conditions(
|
|
|
|
Where(SqlBuilder{{"posts.id", "in", ""}}),
|
2023-05-29 11:40:11 +00:00
|
|
|
In([]any{190, 3022, 291, 2858}),
|
2023-05-20 17:38:19 +00:00
|
|
|
WithCtx(&ctx),
|
|
|
|
WithFn(true, false, Conditions(
|
|
|
|
Fields("ID,user_login,user_pass"),
|
|
|
|
), PostAuthor2()),
|
|
|
|
Fields("posts.*"),
|
|
|
|
From("wp_posts posts"),
|
|
|
|
WithFn(true, false, nil, Meta2()),
|
2023-05-27 06:42:14 +00:00
|
|
|
/*WithFn(true, false, Conditions(
|
2023-05-24 13:33:30 +00:00
|
|
|
WithFn(true, false, Conditions(
|
|
|
|
WithFn(true, false, nil, termMyHasOneTerm),
|
|
|
|
), shipHasManyTermMy),
|
2023-05-27 06:42:14 +00:00
|
|
|
), postHasManyShip),*/
|
|
|
|
WithFn(true, false, nil, postHaveManyTerms),
|
2023-05-29 11:40:11 +00:00
|
|
|
WithFn(true, false, nil, postHaveManyCommentMetas),
|
2023-05-20 17:38:19 +00:00
|
|
|
)
|
|
|
|
got, err := Finds[post](ctx, q)
|
|
|
|
_ = got
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("err:%v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
2023-06-09 14:28:23 +00:00
|
|
|
|
|
|
|
func TestWithOther(t *testing.T) {
|
|
|
|
t.Run("hasMany", func(t *testing.T) {
|
|
|
|
r, err := Finds[post](ctx, Conditions(
|
|
|
|
Where(SqlBuilder{{"id", "in", ""}}),
|
|
|
|
In([]any{190, 3022, 291, 2858}),
|
|
|
|
))
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("fatal:%v", err)
|
|
|
|
}
|
|
|
|
if err = WithOther(ctx, &r, Conditions(
|
|
|
|
WithFn(true, false, nil, postHaveManyTerms),
|
|
|
|
WithFn(true, false, nil, postHaveManyCommentMetas),
|
|
|
|
)); err != nil {
|
|
|
|
t.Errorf("WithOther() error = %v", err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|