Skip to content

Commit 2f37ce6

Browse files
author
iwysiu
committed
separate indexDocsEqual out
1 parent 3dc4a46 commit 2f37ce6

File tree

1 file changed

+49
-49
lines changed

1 file changed

+49
-49
lines changed

mongo/gridfs/bucket.go

Lines changed: 49 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,47 @@ func (b *Bucket) findChunks(ctx context.Context, fileID interface{}) (*mongo.Cur
452452
return chunksCursor, nil
453453
}
454454

455+
// returns true if the 2 index documents are equal
456+
func indexDocsEqual(expected, actual bsoncore.Document) (bool, error) {
457+
if bytes.Equal(expected, actual) {
458+
return true, nil
459+
}
460+
461+
keyElemElems, err := actual.Elements()
462+
if err != nil {
463+
return false, err
464+
}
465+
modelKeysElems, err := expected.Elements()
466+
if err != nil {
467+
return false, err
468+
}
469+
470+
if len(keyElemElems) != len(modelKeysElems) {
471+
return false, nil
472+
}
473+
474+
for _, elem := range keyElemElems {
475+
key := elem.Key()
476+
modelVal, err := expected.LookupErr(key)
477+
if err != nil {
478+
return false, nil
479+
}
480+
481+
val := elem.Value()
482+
if !val.IsNumber() || !modelVal.IsNumber() {
483+
if val.Equal(modelVal) {
484+
continue
485+
}
486+
return false, nil
487+
}
488+
489+
if val.AsInt64() != modelVal.AsInt64() {
490+
return false, nil
491+
}
492+
}
493+
return true, nil
494+
}
495+
455496
// Create an index if it doesn't already exist
456497
func createIndexIfNotExists(ctx context.Context, iv mongo.IndexView, model mongo.IndexModel) error {
457498
c, err := iv.List(ctx)
@@ -462,66 +503,25 @@ func createIndexIfNotExists(ctx context.Context, iv mongo.IndexView, model mongo
462503
_ = c.Close(ctx)
463504
}()
464505

506+
modelKeysBytes, err := bson.Marshal(model.Keys)
507+
if err != nil {
508+
return err
509+
}
510+
modelKeysDoc := bsoncore.Document(modelKeysBytes)
511+
465512
var found bool
466-
for c.Next(ctx) {
513+
for c.Next(ctx) && !found {
467514
keyElem, err := c.Current.LookupErr("key")
468515
if err != nil {
469516
return err
470517
}
471518

472519
keyElemDoc := bsoncore.Value{Type: keyElem.Type, Data: keyElem.Value}.Document()
473520

474-
modelKeysBytes, err := bson.Marshal(model.Keys)
521+
found, err = indexDocsEqual(modelKeysDoc, keyElemDoc)
475522
if err != nil {
476523
return err
477524
}
478-
modelKeysDoc := bsoncore.Document(modelKeysBytes)
479-
480-
if bytes.Equal(modelKeysDoc, keyElemDoc) {
481-
found = true
482-
break
483-
}
484-
485-
keyElemElems, err := keyElemDoc.Elements()
486-
if err != nil {
487-
return err
488-
}
489-
modelKeysElems, err := modelKeysDoc.Elements()
490-
if err != nil {
491-
return err
492-
}
493-
494-
if len(keyElemElems) != len(modelKeysElems) {
495-
continue
496-
}
497-
498-
docsEqual := true
499-
for _, elem := range keyElemElems {
500-
key := elem.Key()
501-
modelVal, err := modelKeysDoc.LookupErr(key)
502-
if err != nil {
503-
docsEqual = false
504-
break
505-
}
506-
507-
val := elem.Value()
508-
if !val.IsNumber() || !modelVal.IsNumber() {
509-
if val.Equal(modelVal) {
510-
continue
511-
}
512-
docsEqual = false
513-
break
514-
}
515-
516-
if val.AsInt64() != modelVal.AsInt64() {
517-
docsEqual = false
518-
break
519-
}
520-
}
521-
if docsEqual {
522-
found = true
523-
break
524-
}
525525
}
526526

527527
if !found {

0 commit comments

Comments
 (0)