github.com/lingyao2333/mo-zero@v1.4.1/core/stores/mongo/query.go (about) 1 package mongo 2 3 import ( 4 "time" 5 6 "github.com/globalsign/mgo" 7 "github.com/lingyao2333/mo-zero/core/breaker" 8 ) 9 10 type ( 11 // Query interface represents a mongo query. 12 Query interface { 13 All(result interface{}) error 14 Apply(change mgo.Change, result interface{}) (*mgo.ChangeInfo, error) 15 Batch(n int) Query 16 Collation(collation *mgo.Collation) Query 17 Comment(comment string) Query 18 Count() (int, error) 19 Distinct(key string, result interface{}) error 20 Explain(result interface{}) error 21 For(result interface{}, f func() error) error 22 Hint(indexKey ...string) Query 23 Iter() Iter 24 Limit(n int) Query 25 LogReplay() Query 26 MapReduce(job *mgo.MapReduce, result interface{}) (*mgo.MapReduceInfo, error) 27 One(result interface{}) error 28 Prefetch(p float64) Query 29 Select(selector interface{}) Query 30 SetMaxScan(n int) Query 31 SetMaxTime(d time.Duration) Query 32 Skip(n int) Query 33 Snapshot() Query 34 Sort(fields ...string) Query 35 Tail(timeout time.Duration) Iter 36 } 37 38 promisedQuery struct { 39 *mgo.Query 40 promise keepablePromise 41 } 42 43 rejectedQuery struct{} 44 ) 45 46 func (q promisedQuery) All(result interface{}) error { 47 return q.promise.keep(q.Query.All(result)) 48 } 49 50 func (q promisedQuery) Apply(change mgo.Change, result interface{}) (*mgo.ChangeInfo, error) { 51 info, err := q.Query.Apply(change, result) 52 return info, q.promise.keep(err) 53 } 54 55 func (q promisedQuery) Batch(n int) Query { 56 return promisedQuery{ 57 Query: q.Query.Batch(n), 58 promise: q.promise, 59 } 60 } 61 62 func (q promisedQuery) Collation(collation *mgo.Collation) Query { 63 return promisedQuery{ 64 Query: q.Query.Collation(collation), 65 promise: q.promise, 66 } 67 } 68 69 func (q promisedQuery) Comment(comment string) Query { 70 return promisedQuery{ 71 Query: q.Query.Comment(comment), 72 promise: q.promise, 73 } 74 } 75 76 func (q promisedQuery) Count() (int, error) { 77 v, err := q.Query.Count() 78 return v, q.promise.keep(err) 79 } 80 81 func (q promisedQuery) Distinct(key string, result interface{}) error { 82 return q.promise.keep(q.Query.Distinct(key, result)) 83 } 84 85 func (q promisedQuery) Explain(result interface{}) error { 86 return q.promise.keep(q.Query.Explain(result)) 87 } 88 89 func (q promisedQuery) For(result interface{}, f func() error) error { 90 var ferr error 91 err := q.Query.For(result, func() error { 92 ferr = f() 93 return ferr 94 }) 95 if ferr == err { 96 return q.promise.accept(err) 97 } 98 99 return q.promise.keep(err) 100 } 101 102 func (q promisedQuery) Hint(indexKey ...string) Query { 103 return promisedQuery{ 104 Query: q.Query.Hint(indexKey...), 105 promise: q.promise, 106 } 107 } 108 109 func (q promisedQuery) Iter() Iter { 110 return promisedIter{ 111 Iter: q.Query.Iter(), 112 promise: q.promise, 113 } 114 } 115 116 func (q promisedQuery) Limit(n int) Query { 117 return promisedQuery{ 118 Query: q.Query.Limit(n), 119 promise: q.promise, 120 } 121 } 122 123 func (q promisedQuery) LogReplay() Query { 124 return promisedQuery{ 125 Query: q.Query.LogReplay(), 126 promise: q.promise, 127 } 128 } 129 130 func (q promisedQuery) MapReduce(job *mgo.MapReduce, result interface{}) (*mgo.MapReduceInfo, error) { 131 info, err := q.Query.MapReduce(job, result) 132 return info, q.promise.keep(err) 133 } 134 135 func (q promisedQuery) One(result interface{}) error { 136 return q.promise.keep(q.Query.One(result)) 137 } 138 139 func (q promisedQuery) Prefetch(p float64) Query { 140 return promisedQuery{ 141 Query: q.Query.Prefetch(p), 142 promise: q.promise, 143 } 144 } 145 146 func (q promisedQuery) Select(selector interface{}) Query { 147 return promisedQuery{ 148 Query: q.Query.Select(selector), 149 promise: q.promise, 150 } 151 } 152 153 func (q promisedQuery) SetMaxScan(n int) Query { 154 return promisedQuery{ 155 Query: q.Query.SetMaxScan(n), 156 promise: q.promise, 157 } 158 } 159 160 func (q promisedQuery) SetMaxTime(d time.Duration) Query { 161 return promisedQuery{ 162 Query: q.Query.SetMaxTime(d), 163 promise: q.promise, 164 } 165 } 166 167 func (q promisedQuery) Skip(n int) Query { 168 return promisedQuery{ 169 Query: q.Query.Skip(n), 170 promise: q.promise, 171 } 172 } 173 174 func (q promisedQuery) Snapshot() Query { 175 return promisedQuery{ 176 Query: q.Query.Snapshot(), 177 promise: q.promise, 178 } 179 } 180 181 func (q promisedQuery) Sort(fields ...string) Query { 182 return promisedQuery{ 183 Query: q.Query.Sort(fields...), 184 promise: q.promise, 185 } 186 } 187 188 func (q promisedQuery) Tail(timeout time.Duration) Iter { 189 return promisedIter{ 190 Iter: q.Query.Tail(timeout), 191 promise: q.promise, 192 } 193 } 194 195 func (q rejectedQuery) All(result interface{}) error { 196 return breaker.ErrServiceUnavailable 197 } 198 199 func (q rejectedQuery) Apply(change mgo.Change, result interface{}) (*mgo.ChangeInfo, error) { 200 return nil, breaker.ErrServiceUnavailable 201 } 202 203 func (q rejectedQuery) Batch(n int) Query { 204 return q 205 } 206 207 func (q rejectedQuery) Collation(collation *mgo.Collation) Query { 208 return q 209 } 210 211 func (q rejectedQuery) Comment(comment string) Query { 212 return q 213 } 214 215 func (q rejectedQuery) Count() (int, error) { 216 return 0, breaker.ErrServiceUnavailable 217 } 218 219 func (q rejectedQuery) Distinct(key string, result interface{}) error { 220 return breaker.ErrServiceUnavailable 221 } 222 223 func (q rejectedQuery) Explain(result interface{}) error { 224 return breaker.ErrServiceUnavailable 225 } 226 227 func (q rejectedQuery) For(result interface{}, f func() error) error { 228 return breaker.ErrServiceUnavailable 229 } 230 231 func (q rejectedQuery) Hint(indexKey ...string) Query { 232 return q 233 } 234 235 func (q rejectedQuery) Iter() Iter { 236 return rejectedIter{} 237 } 238 239 func (q rejectedQuery) Limit(n int) Query { 240 return q 241 } 242 243 func (q rejectedQuery) LogReplay() Query { 244 return q 245 } 246 247 func (q rejectedQuery) MapReduce(job *mgo.MapReduce, result interface{}) (*mgo.MapReduceInfo, error) { 248 return nil, breaker.ErrServiceUnavailable 249 } 250 251 func (q rejectedQuery) One(result interface{}) error { 252 return breaker.ErrServiceUnavailable 253 } 254 255 func (q rejectedQuery) Prefetch(p float64) Query { 256 return q 257 } 258 259 func (q rejectedQuery) Select(selector interface{}) Query { 260 return q 261 } 262 263 func (q rejectedQuery) SetMaxScan(n int) Query { 264 return q 265 } 266 267 func (q rejectedQuery) SetMaxTime(d time.Duration) Query { 268 return q 269 } 270 271 func (q rejectedQuery) Skip(n int) Query { 272 return q 273 } 274 275 func (q rejectedQuery) Snapshot() Query { 276 return q 277 } 278 279 func (q rejectedQuery) Sort(fields ...string) Query { 280 return q 281 } 282 283 func (q rejectedQuery) Tail(timeout time.Duration) Iter { 284 return rejectedIter{} 285 }