Skip to content

Commit 74a0e93

Browse files
committed
Add IndexOptionsBuilder
GODRIVER-294 Change-Id: Iaee40b1c2e87e87ed14b09ac6e3511c2a7189f25
1 parent 9754325 commit 74a0e93

File tree

2 files changed

+221
-48
lines changed

2 files changed

+221
-48
lines changed

mongo/index_options_builder.go

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package mongo
2+
3+
import "github.com/mongodb/mongo-go-driver/bson"
4+
5+
// IndexOptionsBuilder constructs a BSON document for index options
6+
type IndexOptionsBuilder struct {
7+
document *bson.Document
8+
}
9+
10+
// NewIndexOptionsBuilder creates a new instance of IndexOptionsBuilder
11+
func NewIndexOptionsBuilder() *IndexOptionsBuilder {
12+
var b IndexOptionsBuilder
13+
b.document = bson.NewDocument()
14+
return &b
15+
}
16+
17+
// Background sets the background option
18+
func (iob *IndexOptionsBuilder) Background(background bool) *IndexOptionsBuilder {
19+
iob.document.Append(bson.EC.Boolean("background", background))
20+
return iob
21+
}
22+
23+
// ExpireAfter sets the expireAfter option
24+
func (iob *IndexOptionsBuilder) ExpireAfter(expireAfter int32) *IndexOptionsBuilder {
25+
iob.document.Append(bson.EC.Int32("expireAfter", expireAfter))
26+
return iob
27+
}
28+
29+
// Name sets the name option
30+
func (iob *IndexOptionsBuilder) Name(name string) *IndexOptionsBuilder {
31+
iob.document.Append(bson.EC.String("name", name))
32+
return iob
33+
}
34+
35+
// Sparse sets the sparse option
36+
func (iob *IndexOptionsBuilder) Sparse(sparse bool) *IndexOptionsBuilder {
37+
iob.document.Append(bson.EC.Boolean("sparse", sparse))
38+
return iob
39+
}
40+
41+
// StorageEngine sets the storageEngine option
42+
func (iob *IndexOptionsBuilder) StorageEngine(storageEngine string) *IndexOptionsBuilder {
43+
iob.document.Append(bson.EC.String("storageEngine", storageEngine))
44+
return iob
45+
}
46+
47+
// Unique sets the unique option
48+
func (iob *IndexOptionsBuilder) Unique(unique bool) *IndexOptionsBuilder {
49+
iob.document.Append(bson.EC.Boolean("unique", unique))
50+
return iob
51+
}
52+
53+
// Version sets the verison option
54+
func (iob *IndexOptionsBuilder) Version(version int32) *IndexOptionsBuilder {
55+
iob.document.Append(bson.EC.Int32("version", version))
56+
return iob
57+
}
58+
59+
// DefaultLanguage sets the defaultLanguage option
60+
func (iob *IndexOptionsBuilder) DefaultLanguage(defaultLanguage string) *IndexOptionsBuilder {
61+
iob.document.Append(bson.EC.String("defaultLanguage", defaultLanguage))
62+
return iob
63+
}
64+
65+
// LanguageOverride sets the languageOverride option
66+
func (iob *IndexOptionsBuilder) LanguageOverride(languageOverride string) *IndexOptionsBuilder {
67+
iob.document.Append(bson.EC.String("languageOverride", languageOverride))
68+
return iob
69+
}
70+
71+
// TextVersion sets the textVersion option
72+
func (iob *IndexOptionsBuilder) TextVersion(textVersion int32) *IndexOptionsBuilder {
73+
iob.document.Append(bson.EC.Int32("textVersion", textVersion))
74+
return iob
75+
}
76+
77+
// Weights sets the weights option
78+
func (iob *IndexOptionsBuilder) Weights(weights *bson.Document) *IndexOptionsBuilder {
79+
iob.document.Append(bson.EC.SubDocument("weights", weights))
80+
return iob
81+
}
82+
83+
// SphereVersion sets the sphereVersion option
84+
func (iob *IndexOptionsBuilder) SphereVersion(sphereVersion int32) *IndexOptionsBuilder {
85+
iob.document.Append(bson.EC.Int32("sphereVersion", sphereVersion))
86+
return iob
87+
}
88+
89+
// Bits sets the bits option
90+
func (iob *IndexOptionsBuilder) Bits(bits int32) *IndexOptionsBuilder {
91+
iob.document.Append(bson.EC.Int32("bits", bits))
92+
return iob
93+
}
94+
95+
// Max sets the max option
96+
func (iob *IndexOptionsBuilder) Max(max float64) *IndexOptionsBuilder {
97+
iob.document.Append(bson.EC.Double("max", max))
98+
return iob
99+
}
100+
101+
// Min sets the min option
102+
func (iob *IndexOptionsBuilder) Min(min float64) *IndexOptionsBuilder {
103+
iob.document.Append(bson.EC.Double("min", min))
104+
return iob
105+
}
106+
107+
// BucketSize sets the bucketSize option
108+
func (iob *IndexOptionsBuilder) BucketSize(bucketSize int32) *IndexOptionsBuilder {
109+
iob.document.Append(bson.EC.Int32("bucketSize", bucketSize))
110+
return iob
111+
}
112+
113+
// PartialFilterExpression sets the partialFilterExpression option
114+
func (iob *IndexOptionsBuilder) PartialFilterExpression(partialFilterExpression *bson.Document) *IndexOptionsBuilder {
115+
iob.document.Append(bson.EC.SubDocument("partialFilterExpression", partialFilterExpression))
116+
return iob
117+
}
118+
119+
// Collation sets the collation option
120+
func (iob *IndexOptionsBuilder) Collation(collation *bson.Document) *IndexOptionsBuilder {
121+
iob.document.Append(bson.EC.SubDocument("collation", collation))
122+
return iob
123+
}
124+
125+
// Build returns the BSON document from the builder
126+
func (iob *IndexOptionsBuilder) Build() *bson.Document {
127+
return iob.document
128+
}

mongo/index_view_internal_test.go

Lines changed: 93 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,18 @@ func TestIndexView_List(t *testing.T) {
6767
cursor, err := indexView.List(context.Background())
6868
require.NoError(t, err)
6969

70-
found := false
71-
var index = index{}
70+
var found bool
71+
var idx index
7272

7373
for cursor.Next(context.Background()) {
74-
err := cursor.Decode(&index)
74+
err := cursor.Decode(&idx)
7575
require.NoError(t, err)
7676

77-
require.Equal(t, expectedNS, index.NS)
77+
require.Equal(t, expectedNS, idx.NS)
7878

79-
if index.Name == "_id_" {
80-
require.Len(t, index.Key, 1)
81-
require.Equal(t, 1, index.Key["_id"])
79+
if idx.Name == "_id_" {
80+
require.Len(t, idx.Key, 1)
81+
require.Equal(t, 1, idx.Key["_id"])
8282
found = true
8383
}
8484
}
@@ -110,18 +110,63 @@ func TestIndexView_CreateOne(t *testing.T) {
110110
cursor, err := indexView.List(context.Background())
111111
require.NoError(t, err)
112112

113-
found := false
114-
var index = index{}
113+
var found bool
114+
var idx index
115115

116116
for cursor.Next(context.Background()) {
117-
err := cursor.Decode(&index)
117+
err := cursor.Decode(&idx)
118118
require.NoError(t, err)
119119

120-
require.Equal(t, expectedNS, index.NS)
120+
require.Equal(t, expectedNS, idx.NS)
121121

122-
if index.Name == indexName {
123-
require.Len(t, index.Key, 1)
124-
require.Equal(t, -1, index.Key["foo"])
122+
if idx.Name == indexName {
123+
require.Len(t, idx.Key, 1)
124+
require.Equal(t, -1, idx.Key["foo"])
125+
found = true
126+
}
127+
}
128+
require.NoError(t, cursor.Err())
129+
require.True(t, found)
130+
}
131+
132+
func TestIndexView_CreateOneWithIndexOptions(t *testing.T) {
133+
t.Parallel()
134+
135+
if testing.Short() {
136+
t.Skip()
137+
}
138+
139+
dbName, coll := getIndexableCollection(t)
140+
expectedNS := fmt.Sprintf("IndexView.%s", dbName)
141+
indexView := coll.Indexes()
142+
143+
indexName, err := indexView.CreateOne(
144+
context.Background(),
145+
IndexModel{
146+
Keys: bson.NewDocument(
147+
bson.EC.Int32("foo", -1),
148+
),
149+
Options: NewIndexOptionsBuilder().Name("testname").Build(),
150+
},
151+
)
152+
require.NoError(t, err)
153+
require.Equal(t, "testname", indexName)
154+
155+
cursor, err := indexView.List(context.Background())
156+
require.NoError(t, err)
157+
158+
var found bool
159+
var idx index
160+
161+
for cursor.Next(context.Background()) {
162+
err := cursor.Decode(&idx)
163+
require.NoError(t, err)
164+
165+
require.Equal(t, expectedNS, idx.NS)
166+
167+
if idx.Name == indexName {
168+
require.Len(t, idx.Key, 1)
169+
require.Equal(t, -1, idx.Key["foo"])
125170
found = true
126171
}
127172
}
@@ -167,24 +212,24 @@ func TestIndexView_CreateMany(t *testing.T) {
167212

168213
fooFound := false
169214
barBazFound := false
170-
var index = index{}
215+
var idx index
171216

172217
for cursor.Next(context.Background()) {
173-
err := cursor.Decode(&index)
218+
err := cursor.Decode(&idx)
174219
require.NoError(t, err)
175220

176-
require.Equal(t, expectedNS, index.NS)
221+
require.Equal(t, expectedNS, idx.NS)
177222

178-
if index.Name == fooName {
179-
require.Len(t, index.Key, 1)
180-
require.Equal(t, -1, index.Key["foo"])
223+
if idx.Name == fooName {
224+
require.Len(t, idx.Key, 1)
225+
require.Equal(t, -1, idx.Key["foo"])
181226
fooFound = true
182227
}
183228

184-
if index.Name == barBazName {
185-
require.Len(t, index.Key, 2)
186-
require.Equal(t, 1, index.Key["bar"])
187-
require.Equal(t, -1, index.Key["baz"])
229+
if idx.Name == barBazName {
230+
require.Len(t, idx.Key, 2)
231+
require.Equal(t, 1, idx.Key["bar"])
232+
require.Equal(t, -1, idx.Key["baz"])
188233
barBazFound = true
189234
}
190235
}
@@ -232,14 +277,14 @@ func TestIndexView_DropOne(t *testing.T) {
232277
cursor, err := indexView.List(context.Background())
233278
require.NoError(t, err)
234279

235-
var index = index{}
280+
var idx index
236281

237282
for cursor.Next(context.Background()) {
238-
err := cursor.Decode(&index)
283+
err := cursor.Decode(&idx)
239284
require.NoError(t, err)
240285

241-
require.Equal(t, expectedNS, index.NS)
242-
require.NotEqual(t, indexNames[1], index.Name)
286+
require.Equal(t, expectedNS, idx.NS)
287+
require.NotEqual(t, indexNames[1], idx.Name)
243288
}
244289
require.NoError(t, cursor.Err())
245290
}
@@ -282,15 +327,15 @@ func TestIndexView_DropAll(t *testing.T) {
282327
cursor, err := indexView.List(context.Background())
283328
require.NoError(t, err)
284329

285-
var index = index{}
330+
var idx index
286331

287332
for cursor.Next(context.Background()) {
288-
err := cursor.Decode(&index)
333+
err := cursor.Decode(&idx)
289334
require.NoError(t, err)
290335

291-
require.Equal(t, expectedNS, index.NS)
292-
require.NotEqual(t, indexNames[0], index.Name)
293-
require.NotEqual(t, indexNames[1], index.Name)
336+
require.Equal(t, expectedNS, idx.NS)
337+
require.NotEqual(t, indexNames[0], idx.Name)
338+
require.NotEqual(t, indexNames[1], idx.Name)
294339
}
295340
require.NoError(t, cursor.Err())
296341
}
@@ -339,24 +384,24 @@ func TestIndexView_CreateIndexesOptioner(t *testing.T) {
339384

340385
fooFound := false
341386
barBazFound := false
342-
var index = index{}
387+
var idx index
343388

344389
for cursor.Next(context.Background()) {
345-
err := cursor.Decode(&index)
390+
err := cursor.Decode(&idx)
346391
require.NoError(t, err)
347392

348-
require.Equal(t, expectedNS, index.NS)
393+
require.Equal(t, expectedNS, idx.NS)
349394

350-
if index.Name == fooName {
351-
require.Len(t, index.Key, 1)
352-
require.Equal(t, -1, index.Key["foo"])
395+
if idx.Name == fooName {
396+
require.Len(t, idx.Key, 1)
397+
require.Equal(t, -1, idx.Key["foo"])
353398
fooFound = true
354399
}
355400

356-
if index.Name == barBazName {
357-
require.Len(t, index.Key, 2)
358-
require.Equal(t, 1, index.Key["bar"])
359-
require.Equal(t, -1, index.Key["baz"])
401+
if idx.Name == barBazName {
402+
require.Len(t, idx.Key, 2)
403+
require.Equal(t, 1, idx.Key["bar"])
404+
require.Equal(t, -1, idx.Key["baz"])
360405
barBazFound = true
361406
}
362407
}
@@ -413,14 +458,14 @@ func TestIndexView_DropIndexesOptioner(t *testing.T) {
413458
cursor, err := indexView.List(context.Background())
414459
require.NoError(t, err)
415460

416-
var index = index{}
461+
var idx index
417462

418463
for cursor.Next(context.Background()) {
419-
err := cursor.Decode(&index)
464+
err := cursor.Decode(&idx)
420465
require.NoError(t, err)
421-
require.Equal(t, expectedNS, index.NS)
422-
require.NotEqual(t, indexNames[0], index.Name)
423-
require.NotEqual(t, indexNames[1], index.Name)
466+
require.Equal(t, expectedNS, idx.NS)
467+
require.NotEqual(t, indexNames[0], idx.Name)
468+
require.NotEqual(t, indexNames[1], idx.Name)
424469
}
425470
require.NoError(t, cursor.Err())
426471
}

0 commit comments

Comments
 (0)