forked from ostafen/clover
-
Notifications
You must be signed in to change notification settings - Fork 0
/
query.go
68 lines (57 loc) · 2.03 KB
/
query.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package clover
// Query represents a generic query which is submitted to a specific collection.
type Query struct {
engine StorageEngine
collection string
criteria *Criteria
}
func (q *Query) satisfy(doc *Document) bool {
if q.criteria == nil {
return true
}
return q.criteria.p(doc)
}
// Count returns the number of documents which satisfy the query (i.e. len(q.FindAll()) == q.Count()).
func (q *Query) Count() (int, error) {
docs, err := q.FindAll()
return len(docs), err
}
// MatchPredicate selects all the documents which satisfy the supplied predicate function.
func (q *Query) MatchPredicate(p func(doc *Document) bool) *Query {
return q.Where(&Criteria{p})
}
// Where returns a new Query which select all the documents fullfilling both the base query and the provided Criteria.
func (q *Query) Where(c *Criteria) *Query {
newCriteria := q.criteria
if newCriteria == nil {
newCriteria = c
} else {
newCriteria = newCriteria.And(c)
}
return &Query{
engine: q.engine,
collection: q.collection,
criteria: newCriteria,
}
}
// FindById returns the document with the given id, if such a document exists and satisfies the underlying query, or null.
func (q *Query) FindById(id string) (*Document, error) {
return q.engine.FindById(q.collection, id)
}
// FindAll selects all the documents satisfying q.
func (q *Query) FindAll() ([]*Document, error) {
return q.engine.FindAll(q)
}
// Update updates all the document selected by q using the provided updateMap.
// Each update is specified by a mapping fieldName -> newValue.
func (q *Query) Update(updateMap map[string]interface{}) error {
return q.engine.Update(q, updateMap)
}
// DeleteById removes the document with the given id from the underlying collection, provided that such a document exists and satisfies the underlying query.
func (q *Query) DeleteById(id string) error {
return q.engine.DeleteById(q.collection, id)
}
// Delete removes all the documents selected by q from the underlying collection.
func (q *Query) Delete() error {
return q.engine.Delete(q)
}