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  }