Skip to content

Commit b33db42

Browse files
authored
Merge pull request #1 from yeeuu/develop
New Storage and QuerySet API
2 parents 8c396e9 + 6e355ca commit b33db42

File tree

4 files changed

+157
-141
lines changed

4 files changed

+157
-141
lines changed

examples/main.go

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,34 +36,24 @@ func main() {
3636
panic(err)
3737
}
3838
store := mongo.NewStorage(sess)
39-
err = store.Insert(&userSelector{}, user{Name: "hello"})
39+
err = store.Query(&userSelector{}).Insert(user{Name: "hello"})
4040
if err != nil {
4141
panic(err)
4242
}
4343
var u user
4444
name := "hello"
45-
qs, err := store.Query(&userSelector{
45+
err = store.Query(&userSelector{
4646
Name: &name,
47-
})
47+
}).One(&u)
4848
if err != nil {
4949
panic(err)
5050
}
51-
err = qs.One(&u)
52-
if err != nil {
53-
panic(err)
54-
}
55-
qs.Close()
5651
fmt.Println(u)
57-
err = store.Insert(&userSelector{}, user{Name: "world"})
58-
qs, err = store.Query(&userSelector{})
59-
if err != nil {
60-
panic(err)
61-
}
52+
store.Query(&userSelector{}).Insert(user{Name: "world"})
6253
var users []user
63-
err = qs.All(&users)
54+
err = store.Query(&userSelector{}).All(&users)
6455
if err != nil {
6556
panic(err)
6657
}
67-
qs.Close()
6858
fmt.Println(users)
6959
}

queryset.go

Lines changed: 125 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,166 @@
11
package mongo
22

3-
import "github.com/globalsign/mgo"
3+
import (
4+
"github.com/globalsign/mgo"
5+
"github.com/globalsign/mgo/bson"
6+
)
47

58
// QuerySet likes mgo.Query.
69
type QuerySet interface {
10+
Insert(docs ...interface{}) error
11+
Update(update interface{}) error
12+
UpdateAll(update interface{}) (info *mgo.ChangeInfo, err error)
13+
Upsert(update interface{}) (info *mgo.ChangeInfo, err error)
14+
Remove() error
15+
RemoveAll() (info *mgo.ChangeInfo, err error)
716
All(result interface{}) error
817
One(result interface{}) error
918
Count() (int, error)
1019
Limit(n int) QuerySet
1120
Skip(n int) QuerySet
1221
Prefetch(p float64) QuerySet
1322
Sort(fields ...string) QuerySet
14-
Close()
1523
}
1624

1725
type mongoQuerySet struct {
18-
sess *mgo.Session
19-
query *mgo.Query
26+
sess *mgo.Session
27+
database string
28+
collection string
29+
query bson.M
30+
err error
31+
limit *int
32+
skip *int
33+
prefetch *float64
34+
sort []string
35+
}
36+
37+
func (qs *mongoQuerySet) getSession() (*mgo.Collection, func()) {
38+
sess := qs.sess.Copy()
39+
return sess.DB(qs.database).C(qs.collection), func() {
40+
sess.Close()
41+
}
42+
}
43+
44+
func (qs *mongoQuerySet) getQuery(c *mgo.Collection) *mgo.Query {
45+
q := c.Find(qs.query)
46+
if qs.limit != nil {
47+
q = q.Limit(*qs.limit)
48+
}
49+
if qs.skip != nil {
50+
q = q.Skip(*qs.skip)
51+
}
52+
if qs.prefetch != nil {
53+
q = q.Prefetch(*qs.prefetch)
54+
}
55+
if len(qs.sort) != 0 {
56+
q = q.Sort(qs.sort...)
57+
}
58+
return q
59+
}
60+
61+
func (qs *mongoQuerySet) Insert(docs ...interface{}) error {
62+
c, close := qs.getSession()
63+
defer close()
64+
err := c.Insert(docs...)
65+
return err
66+
}
67+
68+
func (qs *mongoQuerySet) Update(update interface{}) error {
69+
if qs.err != nil {
70+
return qs.err
71+
}
72+
c, close := qs.getSession()
73+
defer close()
74+
err := c.Update(qs.query, update)
75+
return err
76+
}
77+
78+
func (qs *mongoQuerySet) UpdateAll(update interface{}) (info *mgo.ChangeInfo, err error) {
79+
if qs.err != nil {
80+
err = qs.err
81+
return
82+
}
83+
c, close := qs.getSession()
84+
defer close()
85+
info, err = c.UpdateAll(qs.query, update)
86+
return
87+
}
88+
89+
func (qs *mongoQuerySet) Upsert(update interface{}) (info *mgo.ChangeInfo, err error) {
90+
if qs.err != nil {
91+
err = qs.err
92+
return
93+
}
94+
c, close := qs.getSession()
95+
defer close()
96+
info, err = c.Upsert(qs.query, update)
97+
return
98+
}
99+
100+
func (qs *mongoQuerySet) Remove() error {
101+
if qs.err != nil {
102+
return qs.err
103+
}
104+
c, close := qs.getSession()
105+
defer close()
106+
err := c.Remove(qs.query)
107+
return err
108+
}
109+
110+
func (qs *mongoQuerySet) RemoveAll() (info *mgo.ChangeInfo, err error) {
111+
if qs.err != nil {
112+
err = qs.err
113+
return
114+
}
115+
c, close := qs.getSession()
116+
defer close()
117+
info, err = c.RemoveAll(qs.query)
118+
return
20119
}
21120

22121
func (qs *mongoQuerySet) All(result interface{}) error {
23-
return qs.query.All(result)
122+
if qs.err != nil {
123+
return qs.err
124+
}
125+
c, close := qs.getSession()
126+
defer close()
127+
return qs.getQuery(c).All(result)
24128
}
25129

26130
func (qs *mongoQuerySet) One(result interface{}) error {
27-
return qs.query.One(result)
131+
if qs.err != nil {
132+
return qs.err
133+
}
134+
c, close := qs.getSession()
135+
defer close()
136+
return qs.getQuery(c).One(result)
28137
}
29138

30139
func (qs *mongoQuerySet) Count() (int, error) {
31-
return qs.query.Count()
140+
if qs.err != nil {
141+
return 0, qs.err
142+
}
143+
c, close := qs.getSession()
144+
defer close()
145+
return qs.getQuery(c).Count()
32146
}
33147

34148
func (qs *mongoQuerySet) Limit(n int) QuerySet {
35-
qs.query = qs.query.Limit(n)
149+
qs.limit = &n
36150
return qs
37151
}
38152

39153
func (qs *mongoQuerySet) Skip(n int) QuerySet {
40-
qs.query = qs.query.Skip(n)
154+
qs.skip = &n
41155
return qs
42156
}
43157

44158
func (qs *mongoQuerySet) Prefetch(p float64) QuerySet {
45-
qs.query = qs.query.Prefetch(p)
159+
qs.prefetch = &p
46160
return qs
47161
}
48162

49163
func (qs *mongoQuerySet) Sort(fields ...string) QuerySet {
50-
qs.query = qs.query.Sort(fields...)
164+
qs.sort = fields
51165
return qs
52166
}
53-
54-
func (qs *mongoQuerySet) Close() {
55-
qs.sess.Close()
56-
}

storage.go

Lines changed: 22 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@ package mongo
22

33
import (
44
"github.com/globalsign/mgo"
5+
"github.com/globalsign/mgo/bson"
56
"github.com/pkg/errors"
67
)
78

89
// Storage supply a interface for make Queryset.
910
type Storage interface {
10-
Query(interface{}) (QuerySet, error)
11-
Raw(interface{}, interface{}) (QuerySet, error)
12-
Insert(base interface{}, docs ...interface{}) error
13-
Update(filter, update interface{}) error
14-
UpdateAll(filter, update interface{}) (info *mgo.ChangeInfo, err error)
15-
Upsert(filter, update interface{}) (info *mgo.ChangeInfo, err error)
16-
Remove(filter interface{}) error
17-
RemoveAll(filter interface{}) (info *mgo.ChangeInfo, err error)
11+
Query(Collection) QuerySet
12+
Raw(Collection, bson.M) QuerySet
13+
// Insert(c Collection, docs ...interface{}) error
14+
// Update(filter, update interface{}) error
15+
// UpdateAll(filter, update interface{}) (info *mgo.ChangeInfo, err error)
16+
// Upsert(filter, update interface{}) (info *mgo.ChangeInfo, err error)
17+
// Remove(filter interface{}) error
18+
// RemoveAll(filter interface{}) (info *mgo.ChangeInfo, err error)
1819
}
1920

2021
type mongoStorage struct {
@@ -28,99 +29,24 @@ func NewStorage(sess *mgo.Session) Storage {
2829
}
2930
}
3031

31-
func (ms *mongoStorage) realAction(action string, base interface{}, docs ...interface{}) (info *mgo.ChangeInfo, err error) {
32-
sess := ms.sess.Copy()
33-
defer sess.Close()
34-
c, err := getCollection(sess, base)
35-
if err != nil {
36-
err = errors.Wrap(err, "Get collection info failed")
37-
return
38-
}
39-
realQuery, err := structToBsonM(base)
40-
if err != nil {
41-
err = errors.Wrap(err, "Convert struct to query failed")
42-
return
43-
}
44-
switch action {
45-
case "insert":
46-
err = c.Insert(docs...)
47-
case "update":
48-
err = c.Update(realQuery, docs[0])
49-
case "updateAll":
50-
info, err = c.UpdateAll(realQuery, docs[0])
51-
case "upsert":
52-
info, err = c.Upsert(realQuery, docs[0])
53-
case "remove":
54-
err = c.Remove(realQuery)
55-
case "removeAll":
56-
info, err = c.RemoveAll(realQuery)
57-
}
58-
return
59-
}
60-
61-
func (ms *mongoStorage) Insert(base interface{}, docs ...interface{}) error {
62-
_, err := ms.realAction("insert", base, docs...)
63-
return err
64-
}
65-
66-
func (ms *mongoStorage) Update(filter, update interface{}) error {
67-
_, err := ms.realAction("update", filter, update)
68-
return err
69-
}
70-
71-
func (ms *mongoStorage) UpdateAll(filter, update interface{}) (info *mgo.ChangeInfo, err error) {
72-
info, err = ms.realAction("updateAll", filter, update)
73-
return
74-
}
75-
76-
func (ms *mongoStorage) Upsert(filter, update interface{}) (info *mgo.ChangeInfo, err error) {
77-
info, err = ms.realAction("upsert", filter, update)
78-
return
79-
}
80-
81-
func (ms *mongoStorage) Remove(filter interface{}) error {
82-
_, err := ms.realAction("remove", filter, nil)
83-
return err
84-
}
85-
86-
func (ms *mongoStorage) RemoveAll(filter interface{}) (info *mgo.ChangeInfo, err error) {
87-
info, err = ms.realAction("removeAll", filter, nil)
88-
return
89-
}
90-
91-
func (ms *mongoStorage) Query(query interface{}) (QuerySet, error) {
92-
var err error
93-
var c *mgo.Collection
94-
sess := ms.sess.Copy()
32+
func (ms *mongoStorage) Query(query Collection) QuerySet {
9533
qs := &mongoQuerySet{
96-
sess: sess,
97-
}
98-
c, err = getCollection(sess, query)
99-
if err != nil {
100-
err = errors.Wrap(err, "Get collection info failed")
101-
return qs, err
34+
sess: ms.sess,
35+
database: query.Database(),
36+
collection: query.Collection(),
10237
}
10338
realQuery, err := structToBsonM(query)
104-
if err != nil {
105-
err = errors.Wrap(err, "Convert struct to query failed")
106-
return qs, err
107-
}
108-
qs.query = c.Find(realQuery)
109-
return qs, err
39+
qs.err = errors.Wrap(err, "convert to bson.M failed")
40+
qs.query = realQuery
41+
return qs
11042
}
11143

112-
func (ms *mongoStorage) Raw(base, query interface{}) (QuerySet, error) {
113-
var err error
114-
var c *mgo.Collection
115-
sess := ms.sess.Copy()
44+
func (ms *mongoStorage) Raw(base Collection, query bson.M) QuerySet {
11645
qs := &mongoQuerySet{
117-
sess: sess,
118-
}
119-
c, err = getCollection(sess, query)
120-
if err != nil {
121-
err = errors.Wrap(err, "Get collection info failed")
122-
return qs, err
46+
sess: ms.sess,
47+
database: base.Database(),
48+
collection: base.Collection(),
49+
query: query,
12350
}
124-
qs.query = c.Find(query)
125-
return qs, err
51+
return qs
12652
}

0 commit comments

Comments
 (0)