// Copyright (C) MongoDB, Inc. 2017-present. // // Licensed under the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. You may obtain // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 package options import ( "time" ) // CreateIndexesOptions represents options that can be used to configure IndexView.CreateOne and IndexView.CreateMany // operations. type CreateIndexesOptions struct { // The number of data-bearing members of a replica set, including the primary, that must complete the index builds // successfully before the primary marks the indexes as ready. This should either be a string or int32 value. The // semantics of the values are as follows: // // 1. String: specifies a tag. All members with that tag must complete the build. // 2. int: the number of members that must complete the build. // 3. "majority": A special value to indicate that more than half the nodes must complete the build. // 4. "votingMembers": A special value to indicate that all voting data-bearing nodes must complete. // // This option is only available on MongoDB versions >= 4.4. A client-side error will be returned if the option // is specified for MongoDB versions <= 4.2. The default value is nil, meaning that the server-side default will be // used. See dochub.mongodb.org/core/index-commit-quorum for more information. CommitQuorum interface{} // The maximum amount of time that the query can run on the server. The default value is nil, meaning that there // is no time limit for query execution. // // NOTE(benjirewis): MaxTime will be deprecated in a future release. The more general Timeout option may be used // in its place to control the amount of time that a single operation can run before returning an error. MaxTime // is ignored if Timeout is set on the client. MaxTime *time.Duration } // CreateIndexes creates a new CreateIndexesOptions instance. func CreateIndexes() *CreateIndexesOptions { return &CreateIndexesOptions{} } // SetMaxTime sets the value for the MaxTime field. // // NOTE(benjirewis): MaxTime will be deprecated in a future release. The more general Timeout // option may be used in its place to control the amount of time that a single operation can // run before returning an error. MaxTime is ignored if Timeout is set on the client. func (c *CreateIndexesOptions) SetMaxTime(d time.Duration) *CreateIndexesOptions { c.MaxTime = &d return c } // SetCommitQuorumInt sets the value for the CommitQuorum field as an int32. func (c *CreateIndexesOptions) SetCommitQuorumInt(quorum int32) *CreateIndexesOptions { c.CommitQuorum = quorum return c } // SetCommitQuorumString sets the value for the CommitQuorum field as a string. func (c *CreateIndexesOptions) SetCommitQuorumString(quorum string) *CreateIndexesOptions { c.CommitQuorum = quorum return c } // SetCommitQuorumMajority sets the value for the CommitQuorum to special "majority" value. func (c *CreateIndexesOptions) SetCommitQuorumMajority() *CreateIndexesOptions { c.CommitQuorum = "majority" return c } // SetCommitQuorumVotingMembers sets the value for the CommitQuorum to special "votingMembers" value. func (c *CreateIndexesOptions) SetCommitQuorumVotingMembers() *CreateIndexesOptions { c.CommitQuorum = "votingMembers" return c } // MergeCreateIndexesOptions combines the given CreateIndexesOptions into a single CreateIndexesOptions in a last one // wins fashion. func MergeCreateIndexesOptions(opts ...*CreateIndexesOptions) *CreateIndexesOptions { c := CreateIndexes() for _, opt := range opts { if opt == nil { continue } if opt.MaxTime != nil { c.MaxTime = opt.MaxTime } if opt.CommitQuorum != nil { c.CommitQuorum = opt.CommitQuorum } } return c } // DropIndexesOptions represents options that can be used to configure IndexView.DropOne and IndexView.DropAll // operations. type DropIndexesOptions struct { // The maximum amount of time that the query can run on the server. The default value is nil, meaning that there // is no time limit for query execution. // // NOTE(benjirewis): MaxTime will be deprecated in a future release. The more general Timeout option may be used // in its place to control the amount of time that a single operation can run before returning an error. MaxTime // is ignored if Timeout is set on the client. MaxTime *time.Duration } // DropIndexes creates a new DropIndexesOptions instance. func DropIndexes() *DropIndexesOptions { return &DropIndexesOptions{} } // SetMaxTime sets the value for the MaxTime field. // // NOTE(benjirewis): MaxTime will be deprecated in a future release. The more general Timeout // option may be used in its place to control the amount of time that a single operation can // run before returning an error. MaxTime is ignored if Timeout is set on the client. func (d *DropIndexesOptions) SetMaxTime(duration time.Duration) *DropIndexesOptions { d.MaxTime = &duration return d } // MergeDropIndexesOptions combines the given DropIndexesOptions into a single DropIndexesOptions in a last-one-wins // fashion. func MergeDropIndexesOptions(opts ...*DropIndexesOptions) *DropIndexesOptions { c := DropIndexes() for _, opt := range opts { if opt == nil { continue } if opt.MaxTime != nil { c.MaxTime = opt.MaxTime } } return c } // ListIndexesOptions represents options that can be used to configure an IndexView.List operation. type ListIndexesOptions struct { // The maximum number of documents to be included in each batch returned by the server. BatchSize *int32 // The maximum amount of time that the query can run on the server. The default value is nil, meaning that there // is no time limit for query execution. // // NOTE(benjirewis): MaxTime will be deprecated in a future release. The more general Timeout option may be used // in its place to control the amount of time that a single operation can run before returning an error. MaxTime // is ignored if Timeout is set on the client. MaxTime *time.Duration } // ListIndexes creates a new ListIndexesOptions instance. func ListIndexes() *ListIndexesOptions { return &ListIndexesOptions{} } // SetBatchSize sets the value for the BatchSize field. func (l *ListIndexesOptions) SetBatchSize(i int32) *ListIndexesOptions { l.BatchSize = &i return l } // SetMaxTime sets the value for the MaxTime field. // // NOTE(benjirewis): MaxTime will be deprecated in a future release. The more general Timeout // option may be used in its place to control the amount of time that a single operation can // run before returning an error. MaxTime is ignored if Timeout is set on the client. func (l *ListIndexesOptions) SetMaxTime(d time.Duration) *ListIndexesOptions { l.MaxTime = &d return l } // MergeListIndexesOptions combines the given ListIndexesOptions instances into a single *ListIndexesOptions in a // last-one-wins fashion. func MergeListIndexesOptions(opts ...*ListIndexesOptions) *ListIndexesOptions { c := ListIndexes() for _, opt := range opts { if opt == nil { continue } if opt.BatchSize != nil { c.BatchSize = opt.BatchSize } if opt.MaxTime != nil { c.MaxTime = opt.MaxTime } } return c } // IndexOptions represents options that can be used to configure a new index created through the IndexView.CreateOne // or IndexView.CreateMany operations. type IndexOptions struct { // If true, the index will be built in the background on the server and will not block other tasks. The default // value is false. // // Deprecated: This option has been deprecated in MongoDB version 4.2. Background *bool // The length of time, in seconds, for documents to remain in the collection. The default value is 0, which means // that documents will remain in the collection until they're explicitly deleted or the collection is dropped. ExpireAfterSeconds *int32 // The name of the index. The default value is "[field1]_[direction1]_[field2]_[direction2]...". For example, an // index with the specification {name: 1, age: -1} will be named "name_1_age_-1". Name *string // If true, the index will only reference documents that contain the fields specified in the index. The default is // false. Sparse *bool // Specifies the storage engine to use for the index. The value must be a document in the form // {: }. The default value is nil, which means that the default storage engine // will be used. This option is only applicable for MongoDB versions >= 3.0 and is ignored for previous server // versions. StorageEngine interface{} // If true, the collection will not accept insertion or update of documents where the index key value matches an // existing value in the index. The default is false. Unique *bool // The index version number, either 0 or 1. Version *int32 // The language that determines the list of stop words and the rules for the stemmer and tokenizer. This option // is only applicable for text indexes and is ignored for other index types. The default value is "english". DefaultLanguage *string // The name of the field in the collection's documents that contains the override language for the document. This // option is only applicable for text indexes and is ignored for other index types. The default value is the value // of the DefaultLanguage option. LanguageOverride *string // The index version number for a text index. See https://www.mongodb.com/docs/manual/core/index-text/#text-versions for // information about different version numbers. TextVersion *int32 // A document that contains field and weight pairs. The weight is an integer ranging from 1 to 99,999, inclusive, // indicating the significance of the field relative to the other indexed fields in terms of the score. This option // is only applicable for text indexes and is ignored for other index types. The default value is nil, which means // that every field will have a weight of 1. Weights interface{} // The index version number for a 2D sphere index. See https://www.mongodb.com/docs/manual/core/2dsphere/#dsphere-v2 for // information about different version numbers. SphereVersion *int32 // The precision of the stored geohash value of the location data. This option only applies to 2D indexes and is // ignored for other index types. The value must be between 1 and 32, inclusive. The default value is 26. Bits *int32 // The upper inclusive boundary for longitude and latitude values. This option is only applicable to 2D indexes and // is ignored for other index types. The default value is 180.0. Max *float64 // The lower inclusive boundary for longitude and latitude values. This option is only applicable to 2D indexes and // is ignored for other index types. The default value is -180.0. Min *float64 // The number of units within which to group location values. Location values that are within BucketSize units of // each other will be grouped in the same bucket. This option is only applicable to geoHaystack indexes and is // ignored for other index types. The value must be greater than 0. BucketSize *int32 // A document that defines which collection documents the index should reference. This option is only valid for // MongoDB versions >= 3.2 and is ignored for previous server versions. PartialFilterExpression interface{} // The collation to use for string comparisons for the index. This option is only valid for MongoDB versions >= 3.4. // For previous server versions, the driver will return an error if this option is used. Collation *Collation // A document that defines the wildcard projection for the index. WildcardProjection interface{} // If true, the index will exist on the target collection but will not be used by the query planner when executing // operations. This option is only valid for MongoDB versions >= 4.4. The default value is false. Hidden *bool } // Index creates a new IndexOptions instance. func Index() *IndexOptions { return &IndexOptions{} } // SetBackground sets value for the Background field. // // Deprecated: This option has been deprecated in MongoDB version 4.2. func (i *IndexOptions) SetBackground(background bool) *IndexOptions { i.Background = &background return i } // SetExpireAfterSeconds sets value for the ExpireAfterSeconds field. func (i *IndexOptions) SetExpireAfterSeconds(seconds int32) *IndexOptions { i.ExpireAfterSeconds = &seconds return i } // SetName sets the value for the Name field. func (i *IndexOptions) SetName(name string) *IndexOptions { i.Name = &name return i } // SetSparse sets the value of the Sparse field. func (i *IndexOptions) SetSparse(sparse bool) *IndexOptions { i.Sparse = &sparse return i } // SetStorageEngine sets the value for the StorageEngine field. func (i *IndexOptions) SetStorageEngine(engine interface{}) *IndexOptions { i.StorageEngine = engine return i } // SetUnique sets the value for the Unique field. func (i *IndexOptions) SetUnique(unique bool) *IndexOptions { i.Unique = &unique return i } // SetVersion sets the value for the Version field. func (i *IndexOptions) SetVersion(version int32) *IndexOptions { i.Version = &version return i } // SetDefaultLanguage sets the value for the DefaultLanguage field. func (i *IndexOptions) SetDefaultLanguage(language string) *IndexOptions { i.DefaultLanguage = &language return i } // SetLanguageOverride sets the value of the LanguageOverride field. func (i *IndexOptions) SetLanguageOverride(override string) *IndexOptions { i.LanguageOverride = &override return i } // SetTextVersion sets the value for the TextVersion field. func (i *IndexOptions) SetTextVersion(version int32) *IndexOptions { i.TextVersion = &version return i } // SetWeights sets the value for the Weights field. func (i *IndexOptions) SetWeights(weights interface{}) *IndexOptions { i.Weights = weights return i } // SetSphereVersion sets the value for the SphereVersion field. func (i *IndexOptions) SetSphereVersion(version int32) *IndexOptions { i.SphereVersion = &version return i } // SetBits sets the value for the Bits field. func (i *IndexOptions) SetBits(bits int32) *IndexOptions { i.Bits = &bits return i } // SetMax sets the value for the Max field. func (i *IndexOptions) SetMax(max float64) *IndexOptions { i.Max = &max return i } // SetMin sets the value for the Min field. func (i *IndexOptions) SetMin(min float64) *IndexOptions { i.Min = &min return i } // SetBucketSize sets the value for the BucketSize field func (i *IndexOptions) SetBucketSize(bucketSize int32) *IndexOptions { i.BucketSize = &bucketSize return i } // SetPartialFilterExpression sets the value for the PartialFilterExpression field. func (i *IndexOptions) SetPartialFilterExpression(expression interface{}) *IndexOptions { i.PartialFilterExpression = expression return i } // SetCollation sets the value for the Collation field. func (i *IndexOptions) SetCollation(collation *Collation) *IndexOptions { i.Collation = collation return i } // SetWildcardProjection sets the value for the WildcardProjection field. func (i *IndexOptions) SetWildcardProjection(wildcardProjection interface{}) *IndexOptions { i.WildcardProjection = wildcardProjection return i } // SetHidden sets the value for the Hidden field. func (i *IndexOptions) SetHidden(hidden bool) *IndexOptions { i.Hidden = &hidden return i } // MergeIndexOptions combines the given IndexOptions into a single IndexOptions in a last-one-wins fashion. func MergeIndexOptions(opts ...*IndexOptions) *IndexOptions { i := Index() for _, opt := range opts { if opt == nil { continue } if opt.Background != nil { i.Background = opt.Background } if opt.ExpireAfterSeconds != nil { i.ExpireAfterSeconds = opt.ExpireAfterSeconds } if opt.Name != nil { i.Name = opt.Name } if opt.Sparse != nil { i.Sparse = opt.Sparse } if opt.StorageEngine != nil { i.StorageEngine = opt.StorageEngine } if opt.Unique != nil { i.Unique = opt.Unique } if opt.Version != nil { i.Version = opt.Version } if opt.DefaultLanguage != nil { i.DefaultLanguage = opt.DefaultLanguage } if opt.LanguageOverride != nil { i.LanguageOverride = opt.LanguageOverride } if opt.TextVersion != nil { i.TextVersion = opt.TextVersion } if opt.Weights != nil { i.Weights = opt.Weights } if opt.SphereVersion != nil { i.SphereVersion = opt.SphereVersion } if opt.Bits != nil { i.Bits = opt.Bits } if opt.Max != nil { i.Max = opt.Max } if opt.Min != nil { i.Min = opt.Min } if opt.BucketSize != nil { i.BucketSize = opt.BucketSize } if opt.PartialFilterExpression != nil { i.PartialFilterExpression = opt.PartialFilterExpression } if opt.Collation != nil { i.Collation = opt.Collation } if opt.WildcardProjection != nil { i.WildcardProjection = opt.WildcardProjection } if opt.Hidden != nil { i.Hidden = opt.Hidden } } return i }