Skip to content

Commit 067f7a8

Browse files
author
Divjot Arora
authored
GODRIVER-1565 Consolidate IndexView helpers and improve docs (#401)
1 parent 691b9df commit 067f7a8

File tree

2 files changed

+44
-31
lines changed

2 files changed

+44
-31
lines changed

mongo/index_view.go

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515
"time"
1616

1717
"go.mongodb.org/mongo-driver/bson"
18-
"go.mongodb.org/mongo-driver/bson/bsoncodec"
1918
"go.mongodb.org/mongo-driver/bson/bsontype"
2019
"go.mongodb.org/mongo-driver/mongo/options"
2120
"go.mongodb.org/mongo-driver/mongo/readpref"
@@ -45,8 +44,9 @@ type IndexView struct {
4544

4645
// IndexModel represents a new index to be created.
4746
type IndexModel struct {
48-
// A document describing which keys should be used for the index. It cannot be nil. See
49-
// https://docs.mongodb.com/manual/indexes/#indexes for examples of valid documents.
47+
// A document describing which keys should be used for the index. It cannot be nil. This must be an order-preserving
48+
// type such as bson.D. Map types such as bson.M are not valid. See https://docs.mongodb.com/manual/indexes/#indexes
49+
// for examples of valid documents.
5050
Keys interface{}
5151

5252
// The options to use to create the index.
@@ -164,18 +164,18 @@ func (iv IndexView) CreateMany(ctx context.Context, models []IndexModel, opts ..
164164
return nil, fmt.Errorf("index model keys cannot be nil")
165165
}
166166

167-
name, err := getOrGenerateIndexName(iv.coll.registry, model)
167+
keys, err := transformBsoncoreDocument(iv.coll.registry, model.Keys)
168168
if err != nil {
169169
return nil, err
170170
}
171171

172-
names = append(names, name)
173-
174-
keys, err := transformBsoncoreDocument(iv.coll.registry, model.Keys)
172+
name, err := getOrGenerateIndexName(keys, model)
175173
if err != nil {
176174
return nil, err
177175
}
178176

177+
names = append(names, name)
178+
179179
var iidx int32
180180
iidx, indexes = bsoncore.AppendDocumentElementStart(indexes, strconv.Itoa(i))
181181
indexes = bsoncore.AppendDocumentElement(indexes, "key", keys)
@@ -424,27 +424,27 @@ func (iv IndexView) DropAll(ctx context.Context, opts ...*options.DropIndexesOpt
424424
return iv.drop(ctx, "*", opts...)
425425
}
426426

427-
func getOrGenerateIndexName(registry *bsoncodec.Registry, model IndexModel) (string, error) {
427+
func getOrGenerateIndexName(keySpecDocument bsoncore.Document, model IndexModel) (string, error) {
428428
if model.Options != nil && model.Options.Name != nil {
429429
return *model.Options.Name, nil
430430
}
431431

432432
name := bytes.NewBufferString("")
433433
first := true
434434

435-
keys, err := transformDocument(registry, model.Keys)
435+
elems, err := keySpecDocument.Elements()
436436
if err != nil {
437437
return "", err
438438
}
439-
for _, elem := range keys {
439+
for _, elem := range elems {
440440
if !first {
441441
_, err := name.WriteRune('_')
442442
if err != nil {
443443
return "", err
444444
}
445445
}
446446

447-
_, err := name.WriteString(elem.Key)
447+
_, err := name.WriteString(elem.Key())
448448
if err != nil {
449449
return "", err
450450
}
@@ -456,13 +456,14 @@ func getOrGenerateIndexName(registry *bsoncodec.Registry, model IndexModel) (str
456456

457457
var value string
458458

459-
switch elem.Value.Type() {
459+
bsonValue := elem.Value()
460+
switch bsonValue.Type {
460461
case bsontype.Int32:
461-
value = fmt.Sprintf("%d", elem.Value.Int32())
462+
value = fmt.Sprintf("%d", bsonValue.Int32())
462463
case bsontype.Int64:
463-
value = fmt.Sprintf("%d", elem.Value.Int64())
464+
value = fmt.Sprintf("%d", bsonValue.Int64())
464465
case bsontype.String:
465-
value = elem.Value.StringValue()
466+
value = bsonValue.StringValue()
466467
default:
467468
return "", ErrInvalidIndexValue
468469
}

mongo/integration/index_view_test.go

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
)
2020

2121
type index struct {
22-
Key map[string]int
22+
Key bson.D
2323
Name string
2424
}
2525

@@ -29,35 +29,44 @@ func TestIndexView(t *testing.T) {
2929

3030
mt.Run("list", func(mt *mtest.T) {
3131
verifyIndexExists(mt, mt.Coll.Indexes(), index{
32-
Key: map[string]int{
33-
"_id": 1,
34-
},
32+
Key: bson.D{{"_id", int32(1)}},
3533
Name: "_id_",
3634
})
3735
})
3836
mt.RunOpts("create one", noClientOpts, func(mt *mtest.T) {
39-
mt.Run("success", func(mt *mtest.T) {
37+
mt.Run("name not specified", func(mt *mtest.T) {
4038
iv := mt.Coll.Indexes()
39+
keysDoc := bson.D{
40+
{"foo", int32(1)},
41+
{"bar", int32(-1)},
42+
}
43+
expectedName := "foo_1_bar_-1"
44+
4145
indexName, err := iv.CreateOne(mtest.Background, mongo.IndexModel{
42-
Keys: bson.D{{"foo", -1}},
46+
Keys: keysDoc,
4347
})
4448
assert.Nil(mt, err, "CreateOne error: %v", err)
49+
assert.Equal(mt, expectedName, indexName, "expected name %q, got %q", expectedName, indexName)
4550

4651
verifyIndexExists(mt, iv, index{
47-
Key: map[string]int{"foo": -1},
52+
Key: keysDoc,
4853
Name: indexName,
4954
})
5055
})
5156
mt.Run("specify name", func(mt *mtest.T) {
5257
iv := mt.Coll.Indexes()
58+
keysDoc := bson.D{{"foo", int32(-1)}}
59+
name := "testname"
60+
5361
indexName, err := iv.CreateOne(mtest.Background, mongo.IndexModel{
54-
Keys: bson.D{{"foo", -1}},
55-
Options: options.Index().SetName("testname"),
62+
Keys: keysDoc,
63+
Options: options.Index().SetName(name),
5664
})
5765
assert.Nil(mt, err, "CreateOne error: %v", err)
66+
assert.Equal(mt, name, indexName, "expected returned name %q, got %q", name, indexName)
5867

5968
verifyIndexExists(mt, iv, index{
60-
Key: map[string]int{"foo": -1},
69+
Key: keysDoc,
6170
Name: indexName,
6271
})
6372
})
@@ -110,7 +119,7 @@ func TestIndexView(t *testing.T) {
110119
})
111120
assert.Nil(mt, err, "CreateOne error: %v", err)
112121
verifyIndexExists(mt, iv, index{
113-
Key: map[string]int{"$**": 1},
122+
Key: keysDoc,
114123
Name: indexName,
115124
})
116125
})
@@ -213,23 +222,26 @@ func TestIndexView(t *testing.T) {
213222
mt.Run("create many", func(mt *mtest.T) {
214223
mt.Run("success", func(mt *mtest.T) {
215224
iv := mt.Coll.Indexes()
225+
firstKeysDoc := bson.D{{"foo", int32(-1)}}
226+
secondKeysDoc := bson.D{{"bar", int32(1)}, {"baz", int32(-1)}}
227+
expectedNames := []string{"foo_-1", "bar_1_baz_-1"}
216228
indexNames, err := iv.CreateMany(mtest.Background, []mongo.IndexModel{
217229
{
218-
Keys: bson.D{{"foo", -1}},
230+
Keys: firstKeysDoc,
219231
},
220232
{
221-
Keys: bson.D{{"bar", 1}, {"baz", -1}},
233+
Keys: secondKeysDoc,
222234
},
223235
})
224236
assert.Nil(mt, err, "CreateMany error: %v", err)
225-
assert.Equal(mt, 2, len(indexNames), "expected 2 index names, got %v", len(indexNames))
237+
assert.Equal(mt, expectedNames, indexNames, "expected returned names %v, got %v", expectedNames, indexNames)
226238

227239
verifyIndexExists(mt, iv, index{
228-
Key: map[string]int{"foo": -1},
240+
Key: firstKeysDoc,
229241
Name: indexNames[0],
230242
})
231243
verifyIndexExists(mt, iv, index{
232-
Key: map[string]int{"bar": 1, "baz": -1},
244+
Key: secondKeysDoc,
233245
Name: indexNames[1],
234246
})
235247
})

0 commit comments

Comments
 (0)