blob: be3baab1d61918c252d7adabea209cfad5c6ad17 [file] [log] [blame]
Don Newton379ae252019-04-01 12:17:06 -04001// Copyright (C) MongoDB, Inc. 2017-present.
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may
4// not use this file except in compliance with the License. You may obtain
5// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
7package options
8
9import "time"
10
11// CountOptions represents all possible options to the count() function
12type CountOptions struct {
13 Collation *Collation // Specifies a collation
14 Hint interface{} // The index to use
15 Limit *int64 // The maximum number of documents to count
16 MaxTime *time.Duration // The maximum amount of time to allow the operation to run
17 Skip *int64 // The number of documents to skip before counting
18}
19
20// Count returns a pointer to a new CountOptions
21func Count() *CountOptions {
22 return &CountOptions{}
23}
24
25// SetCollation specifies a collation
26// Valid for server versions >= 3.4
27func (co *CountOptions) SetCollation(c *Collation) *CountOptions {
28 co.Collation = c
29 return co
30}
31
32// SetHint specifies the index to use
33func (co *CountOptions) SetHint(h interface{}) *CountOptions {
34 co.Hint = h
35 return co
36}
37
38// SetLimit specifies the maximum number of documents to count
39func (co *CountOptions) SetLimit(i int64) *CountOptions {
40 co.Limit = &i
41 return co
42}
43
44// SetMaxTime specifies the maximum amount of time to allow the operation to run
45func (co *CountOptions) SetMaxTime(d time.Duration) *CountOptions {
46 co.MaxTime = &d
47 return co
48}
49
50// SetSkip specifies the number of documents to skip before counting
51func (co *CountOptions) SetSkip(i int64) *CountOptions {
52 co.Skip = &i
53 return co
54}
55
56// MergeCountOptions combines the argued CountOptions into a single CountOptions in a last-one-wins fashion
57func MergeCountOptions(opts ...*CountOptions) *CountOptions {
58 countOpts := Count()
59 for _, co := range opts {
60 if co == nil {
61 continue
62 }
63 if co.Collation != nil {
64 countOpts.Collation = co.Collation
65 }
66 if co.Hint != nil {
67 countOpts.Hint = co.Hint
68 }
69 if co.Limit != nil {
70 countOpts.Limit = co.Limit
71 }
72 if co.MaxTime != nil {
73 countOpts.MaxTime = co.MaxTime
74 }
75 if co.Skip != nil {
76 countOpts.Skip = co.Skip
77 }
78 }
79
80 return countOpts
81}