Skip to content

Commit 853d163

Browse files
committed
add support of short names in relation tags
1 parent 803566b commit 853d163

File tree

13 files changed

+75
-39
lines changed

13 files changed

+75
-39
lines changed

orm/entity/meta.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ func NewMeta(e interface{}) (*MetaInfo, error) {
122122
}
123123

124124
if relation != nil {
125-
relation.fillFromTag(tag)
125+
relation.fillFromTag(tag, meta)
126126
relation.setField(field)
127127
meta.Relations[fieldReflection.Name] = relation
128128
} else {
@@ -165,11 +165,11 @@ func extractDbFieldAlias(tag *parsedTag, fieldName string) string {
165165
return prop.val
166166
}
167167

168-
func (m *MetaInfo) DependencyEntities() map[Name]struct{} {
169-
dependencies := make(map[Name]struct{})
168+
func (m *MetaInfo) Deps() []Name {
169+
dependencies := make([]Name, 0, len(m.Relations))
170170

171171
for _, relation := range m.Relations {
172-
dependencies[relation.RelatedWith()] = struct{}{}
172+
dependencies = append(dependencies, relation.RelatedWith())
173173
}
174174

175175
return dependencies

orm/entity/meta_test.go

+20-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func TestNewMetaWithRelations(t *testing.T) {
5151
baseRelation: baseRelation{
5252
relType: Lazy,
5353
deleteStrategy: Cascade,
54-
targetEntity: "shopProfile",
54+
targetEntity: "github.com/godzie44/d3/orm/entity/shopProfile",
5555
field: meta.Relations["Profile"].(*OneToOne).field,
5656
},
5757
JoinColumn: "profile_id",
@@ -61,7 +61,7 @@ func TestNewMetaWithRelations(t *testing.T) {
6161
baseRelation: baseRelation{
6262
relType: Lazy,
6363
deleteStrategy: None,
64-
targetEntity: "book",
64+
targetEntity: "github.com/godzie44/d3/orm/entity/book",
6565
field: meta.Relations["Books"].(*OneToMany).field,
6666
},
6767
JoinColumn: "shop_id",
@@ -95,3 +95,21 @@ func TestNewMetaWithFieldAlias(t *testing.T) {
9595
FullDbAlias: "author.author_name",
9696
}, *meta.Fields["Name"])
9797
}
98+
99+
type shop2 struct {
100+
ID sql.NullInt32 `d3:"pk:auto"`
101+
Books *Collection `d3:"one_to_many:<target_entity:book,join_on:shop_id>,type:lazy"`
102+
Profile *Cell `d3:"one_to_one:<target_entity:github.com/godzie44/d3/orm/entity/shopProfile,join_on:profile_id,delete:cascade>"`
103+
}
104+
105+
func (s *shop2) D3Token() MetaToken {
106+
return MetaToken{}
107+
}
108+
109+
func TestShortNamesInRelationSwitchTooFullNames(t *testing.T) {
110+
meta, err := NewMeta((*shop2)(nil))
111+
assert.NoError(t, err)
112+
113+
assert.Equal(t, "github.com/godzie44/d3/orm/entity/book", string(meta.Relations["Books"].RelatedWith()))
114+
assert.Equal(t, "github.com/godzie44/d3/orm/entity/shopProfile", string(meta.Relations["Profile"].RelatedWith()))
115+
}

orm/entity/name.go

+19-1
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,31 @@ func NameFromEntity(e interface{}) Name {
1717
}
1818
}
1919

20+
func nameFromTag(tag string, parentName Name) Name {
21+
defined := Name(tag)
22+
if defined.IsShort() {
23+
return parentName.combine(defined)
24+
}
25+
26+
return defined
27+
}
28+
2029
func (n Name) Short() string {
2130
path := strings.Split(string(n), "/")
2231

2332
return path[len(path)-1]
2433
}
2534

35+
func (n Name) IsShort() bool {
36+
return !strings.Contains(string(n), "/")
37+
}
38+
2639
func (n Name) Equal(name Name) bool {
27-
//return n == name || n.Short() == name.Short()
2840
return n == name
2941
}
42+
43+
func (n Name) combine(entity Name) Name {
44+
path := strings.Split(string(n), "/")
45+
46+
return Name(strings.Join(append(path[:len(path)-1], entity.Short()), "/"))
47+
}

orm/entity/registry.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func (r *MetaRegistry) Add(entities ...interface{}) error {
4141
}
4242
r.metaMap[meta.EntityName] = meta
4343

44-
for entityName := range meta.DependencyEntities() {
44+
for _, entityName := range meta.Deps() {
4545
dependencyInstallers = append(dependencyInstallers, r.makeDepInstaller(meta, entityName))
4646
}
4747
}

orm/entity/relation.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ type Relation interface {
5252
Field() *FieldInfo
5353

5454
setField(f *FieldInfo)
55-
fillFromTag(tag *parsedTag)
55+
fillFromTag(tag *parsedTag, parent *MetaInfo)
5656
}
5757

5858
type baseRelation struct {
@@ -99,13 +99,13 @@ type OneToMany struct {
9999
ReferenceColumn string
100100
}
101101

102-
func (o *OneToMany) fillFromTag(tag *parsedTag) {
102+
func (o *OneToMany) fillFromTag(tag *parsedTag, parent *MetaInfo) {
103103
prop, _ := tag.getProperty("one_to_many")
104104

105105
relType, _ := tag.getProperty("type")
106106
o.baseRelation = baseRelation{
107107
relType: relationTypeFromAlias(relType.val),
108-
targetEntity: Name(prop.getSubPropVal("target_entity")),
108+
targetEntity: nameFromTag(prop.getSubPropVal("target_entity"), parent.EntityName),
109109
deleteStrategy: deleteStrategyFromAlias(prop.getSubPropVal("delete")),
110110
}
111111
o.JoinColumn = prop.getSubPropVal("join_on")
@@ -140,13 +140,13 @@ type OneToOne struct {
140140
ReferenceColumn string
141141
}
142142

143-
func (o *OneToOne) fillFromTag(tag *parsedTag) {
143+
func (o *OneToOne) fillFromTag(tag *parsedTag, parent *MetaInfo) {
144144
prop, _ := tag.getProperty("one_to_one")
145145
relType, _ := tag.getProperty("type")
146146

147147
o.baseRelation = baseRelation{
148148
relType: relationTypeFromAlias(relType.val),
149-
targetEntity: Name(prop.getSubPropVal("target_entity")),
149+
targetEntity: nameFromTag(prop.getSubPropVal("target_entity"), parent.EntityName),
150150
deleteStrategy: deleteStrategyFromAlias(prop.getSubPropVal("delete")),
151151
}
152152
o.JoinColumn = prop.getSubPropVal("join_on")
@@ -185,13 +185,13 @@ type ManyToMany struct {
185185
JoinTable string
186186
}
187187

188-
func (m *ManyToMany) fillFromTag(tag *parsedTag) {
188+
func (m *ManyToMany) fillFromTag(tag *parsedTag, parent *MetaInfo) {
189189
prop, _ := tag.getProperty("many_to_many")
190190
relType, _ := tag.getProperty("type")
191191

192192
m.baseRelation = baseRelation{
193193
relType: relationTypeFromAlias(relType.val),
194-
targetEntity: Name(prop.getSubPropVal("target_entity")),
194+
targetEntity: nameFromTag(prop.getSubPropVal("target_entity"), parent.EntityName),
195195
deleteStrategy: deleteStrategyFromAlias(prop.getSubPropVal("delete")),
196196
}
197197
m.JoinColumn = prop.getSubPropVal("join_on")

tests/benchmark/entities.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import (
99
//d3_table:shop
1010
type shop struct {
1111
id sql.NullInt32 `d3:"pk:auto"`
12-
books *entity.Collection `d3:"one_to_many:<target_entity:github.com/godzie44/d3/tests/benchmark/book,join_on:shop_id,delete:nullable>,type:eager"`
13-
profile *entity.Cell `d3:"one_to_one:<target_entity:github.com/godzie44/d3/tests/benchmark/profile,join_on:profile_id,delete:cascade>,type:eager"`
12+
books *entity.Collection `d3:"one_to_many:<target_entity:book,join_on:shop_id,delete:nullable>,type:eager"`
13+
profile *entity.Cell `d3:"one_to_one:<target_entity:profile,join_on:profile_id,delete:cascade>,type:eager"`
1414
name string `d3:"column:name"`
1515
}
1616

@@ -25,7 +25,7 @@ type profile struct {
2525
//d3_table:book
2626
type book struct {
2727
Id sql.NullInt32 `d3:"pk:auto"`
28-
Authors *entity.Collection `d3:"many_to_many:<target_entity:github.com/godzie44/d3/tests/benchmark/author,join_on:book_id,reference_on:author_id,join_table:book_author_m>,type:lazy"`
28+
Authors *entity.Collection `d3:"many_to_many:<target_entity:author,join_on:book_id,reference_on:author_id,join_table:book_author_m>,type:lazy"`
2929
Name string
3030
}
3131

tests/integration/persist/circularentities.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,20 @@ type ShopCirc struct {
1111
Id sql.NullInt32 `d3:"pk:auto"`
1212
Name string
1313

14-
Profile *entity.Cell `d3:"one_to_one:<target_entity:github.com/godzie44/d3/tests/integration/persist/ShopProfileCirc,join_on:profile_id>,type:lazy"`
14+
Profile *entity.Cell `d3:"one_to_one:<target_entity:ShopProfileCirc,join_on:profile_id>,type:lazy"`
1515

16-
FriendShop *entity.Cell `d3:"one_to_one:<target_entity:github.com/godzie44/d3/tests/integration/persist/ShopCirc,join_on:friend_id>,type:lazy"`
16+
FriendShop *entity.Cell `d3:"one_to_one:<target_entity:ShopCirc,join_on:friend_id>,type:lazy"`
1717

18-
TopSeller *entity.Cell `d3:"one_to_one:<target_entity:github.com/godzie44/d3/tests/integration/persist/SellerCirc,join_on:top_seller_id>,type:lazy"`
19-
Sellers *entity.Collection `d3:"one_to_many:<target_entity:github.com/godzie44/d3/tests/integration/persist/SellerCirc,join_on:shop_id>,type:lazy"`
20-
KnownSellers *entity.Collection `d3:"many_to_many:<target_entity:github.com/godzie44/d3/tests/integration/persist/SellerCirc,join_on:shop_id,reference_on:seller_id,join_table:known_shop_seller_c>,type:lazy"`
18+
TopSeller *entity.Cell `d3:"one_to_one:<target_entity:SellerCirc,join_on:top_seller_id>,type:lazy"`
19+
Sellers *entity.Collection `d3:"one_to_many:<target_entity:SellerCirc,join_on:shop_id>,type:lazy"`
20+
KnownSellers *entity.Collection `d3:"many_to_many:<target_entity:SellerCirc,join_on:shop_id,reference_on:seller_id,join_table:known_shop_seller_c>,type:lazy"`
2121
}
2222

2323
//d3:entity
2424
//d3_table:profile_c
2525
type ShopProfileCirc struct {
2626
Id sql.NullInt32 `d3:"pk:auto"`
27-
Shop *entity.Cell `d3:"one_to_one:<target_entity:github.com/godzie44/d3/tests/integration/persist/ShopCirc,join_on:shop_id>,type:lazy"`
27+
Shop *entity.Cell `d3:"one_to_one:<target_entity:ShopCirc,join_on:shop_id>,type:lazy"`
2828
Description string
2929
}
3030

@@ -34,6 +34,6 @@ type SellerCirc struct {
3434
Id sql.NullInt32 `d3:"pk:auto"`
3535
Name string
3636

37-
CurrentShop *entity.Cell `d3:"one_to_one:<target_entity:github.com/godzie44/d3/tests/integration/persist/ShopCirc,join_on:shop_id>,type:lazy"`
38-
KnownShops *entity.Collection `d3:"many_to_many:<target_entity:github.com/godzie44/d3/tests/integration/persist/ShopCirc,join_on:seller_id,reference_on:shop_id,join_table:known_shop_seller_c>,type:lazy"`
37+
CurrentShop *entity.Cell `d3:"one_to_one:<target_entity:ShopCirc,join_on:shop_id>,type:lazy"`
38+
KnownShops *entity.Collection `d3:"many_to_many:<target_entity:ShopCirc,join_on:seller_id,reference_on:shop_id,join_table:known_shop_seller_c>,type:lazy"`
3939
}

tests/integration/persist/entities.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import (
99
//d3_table:shop_p
1010
type Shop struct {
1111
Id sql.NullInt32 `d3:"pk:auto"`
12-
Books *entity.Collection `d3:"one_to_many:<target_entity:github.com/godzie44/d3/tests/integration/persist/Book,join_on:shop_id,delete:nullable>,type:lazy"`
13-
Profile *entity.Cell `d3:"one_to_one:<target_entity:github.com/godzie44/d3/tests/integration/persist/ShopProfile,join_on:profile_id,delete:cascade>,type:lazy"`
12+
Books *entity.Collection `d3:"one_to_many:<target_entity:Book,join_on:shop_id,delete:nullable>,type:lazy"`
13+
Profile *entity.Cell `d3:"one_to_one:<target_entity:ShopProfile,join_on:profile_id,delete:cascade>,type:lazy"`
1414
Name string
1515
}
1616

@@ -25,7 +25,7 @@ type ShopProfile struct {
2525
//d3_table:book_p
2626
type Book struct {
2727
Id sql.NullInt32 `d3:"pk:auto"`
28-
Authors *entity.Collection `d3:"many_to_many:<target_entity:github.com/godzie44/d3/tests/integration/persist/Author,join_on:book_id,reference_on:author_id,join_table:book_author_p>,type:lazy"`
28+
Authors *entity.Collection `d3:"many_to_many:<target_entity:Author,join_on:book_id,reference_on:author_id,join_table:book_author_p>,type:lazy"`
2929
Name string
3030
}
3131

tests/integration/query/entities.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
//d3_table:q_user
1010
type User struct {
1111
id sql.NullInt64 `d3:"pk:auto"`
12-
photos *entity.Collection `d3:"one_to_many:<target_entity:github.com/godzie44/d3/tests/integration/query/Photo,join_on:user_id>,type:lazy"`
12+
photos *entity.Collection `d3:"one_to_many:<target_entity:Photo,join_on:user_id>,type:lazy"`
1313
name string
1414
age int
1515
}

tests/integration/relation/mtomentities.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ type AuthorLL struct {
2121
//d3_table:book
2222
type BookEL struct {
2323
Id int32 `d3:"pk:auto"`
24-
Rel *entity.Collection `d3:"many_to_many:<target_entity:github.com/godzie44/d3/tests/integration/relation/AuthorEL,join_on:book_id,reference_on:author_id,join_table:book_author>,type:eager"`
24+
Rel *entity.Collection `d3:"many_to_many:<target_entity:AuthorEL,join_on:book_id,reference_on:author_id,join_table:book_author>,type:eager"`
2525
Name string
2626
}
2727

2828
//d3:entity
2929
//d3_table:author
3030
type AuthorEL struct {
3131
Id int32 `d3:"pk:auto"`
32-
Rel *entity.Collection `d3:"many_to_many:<target_entity:github.com/godzie44/d3/tests/integration/relation/Redactor,join_on:author_id,reference_on:redactor_id,join_table:author_redactor>,type:eager"`
32+
Rel *entity.Collection `d3:"many_to_many:<target_entity:Redactor,join_on:author_id,reference_on:redactor_id,join_table:author_redactor>,type:eager"`
3333
Name string
3434
}
3535

tests/integration/relation/otomentities.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import "github.com/godzie44/d3/orm/entity"
66
//d3_table:shop
77
type ShopLR struct {
88
Id int32 `d3:"pk:auto"`
9-
Books *entity.Collection `d3:"one_to_many:<target_entity:github.com/godzie44/d3/tests/integration/relation/BookLR,join_on:t1_id>,type:lazy"`
9+
Books *entity.Collection `d3:"one_to_many:<target_entity:BookLR,join_on:t1_id>,type:lazy"`
1010
Name string
1111
}
1212

tests/integration/relation/otooentities.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ import (
99
//d3_table:shop
1010
type ShopLL struct {
1111
ID sql.NullInt32 `d3:"pk:auto"`
12-
Profile *entity.Cell `d3:"one_to_one:<target_entity:github.com/godzie44/d3/tests/integration/relation/ProfileLL,join_on:t2_id>,type:lazy"`
12+
Profile *entity.Cell `d3:"one_to_one:<target_entity:ProfileLL,join_on:t2_id>,type:lazy"`
1313
Data string
1414
}
1515

1616
//d3:entity
1717
//d3_table:profile
1818
type ProfileLL struct {
1919
ID int32 `d3:"pk:auto"`
20-
Photo *entity.Cell `d3:"one_to_one:<target_entity:github.com/godzie44/d3/tests/integration/relation/PhotoLL,join_on:t3_id,reference_on:id>,type:eager"`
20+
Photo *entity.Cell `d3:"one_to_one:<target_entity:PhotoLL,join_on:t3_id,reference_on:id>,type:eager"`
2121
Data string
2222
}
2323

@@ -32,6 +32,6 @@ type PhotoLL struct {
3232
//d3_table:shop
3333
type ShopEL struct {
3434
Id int32 `d3:"pk:auto"`
35-
Profile *entity.Cell `d3:"one_to_one:<target_entity:github.com/godzie44/d3/tests/integration/relation/ProfileLL,join_on:t2_id,reference_on:id>,type:eager"`
35+
Profile *entity.Cell `d3:"one_to_one:<target_entity:ProfileLL,join_on:t2_id,reference_on:id>,type:eager"`
3636
Data string
3737
}

tests/integration/schema/entities.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import (
1111
//d3_table:shop_m
1212
type shop struct {
1313
Id sql.NullInt32 `d3:"pk:auto"`
14-
Books *entity.Collection `d3:"one_to_many:<target_entity:github.com/godzie44/d3/tests/integration/schema/book,join_on:shop_id,delete:nullable>,type:lazy"`
15-
Profile *entity.Cell `d3:"one_to_one:<target_entity:github.com/godzie44/d3/tests/integration/schema/profile,join_on:profile_id,delete:cascade>,type:lazy"`
14+
Books *entity.Collection `d3:"one_to_many:<target_entity:book,join_on:shop_id,delete:nullable>,type:lazy"`
15+
Profile *entity.Cell `d3:"one_to_one:<target_entity:profile,join_on:profile_id,delete:cascade>,type:lazy"`
1616
Name string
1717
}
1818

@@ -27,7 +27,7 @@ type profile struct {
2727
//d3_table:book_m
2828
type book struct {
2929
Id sql.NullInt32 `d3:"pk:auto"`
30-
Authors *entity.Collection `d3:"many_to_many:<target_entity:github.com/godzie44/d3/tests/integration/schema/author,join_on:book_id,reference_on:author_id,join_table:book_author_m>,type:lazy"`
30+
Authors *entity.Collection `d3:"many_to_many:<target_entity:author,join_on:book_id,reference_on:author_id,join_table:book_author_m>,type:lazy"`
3131
Name string
3232
}
3333

0 commit comments

Comments
 (0)