2019-05-30 14:05:08 +03:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"log"
|
|
|
|
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
|
|
)
|
|
|
|
|
2019-06-03 13:59:49 +03:00
|
|
|
func write(ctx context.Context, db *mongo.Database, insertCh chan Object, initial bool, blockSize int, worker int) error {
|
|
|
|
nodes := db.Collection("items")
|
2019-05-30 14:05:08 +03:00
|
|
|
opts := (new(options.BulkWriteOptions)).SetOrdered(false)
|
2019-06-03 13:59:49 +03:00
|
|
|
buf := make([]mongo.WriteModel, 0, blockSize)
|
|
|
|
ic := 0
|
2019-05-30 14:05:08 +03:00
|
|
|
for {
|
|
|
|
select {
|
2019-06-03 13:59:49 +03:00
|
|
|
case w := <-insertCh:
|
2019-05-30 14:05:08 +03:00
|
|
|
if initial {
|
|
|
|
um := mongo.NewInsertOneModel()
|
|
|
|
um.SetDocument(w)
|
2019-06-03 13:59:49 +03:00
|
|
|
buf = append(buf, um)
|
2019-05-30 14:05:08 +03:00
|
|
|
} else {
|
|
|
|
um := mongo.NewUpdateOneModel()
|
|
|
|
um.SetUpsert(true)
|
|
|
|
um.SetUpdate(w)
|
2019-06-03 13:59:49 +03:00
|
|
|
um.SetFilter(bson.M{"osm_id": w.ID})
|
|
|
|
buf = append(buf, um)
|
2019-05-30 14:05:08 +03:00
|
|
|
}
|
|
|
|
case <-ctx.Done():
|
2019-06-03 13:59:49 +03:00
|
|
|
if len(buf) > 0 {
|
|
|
|
log.Printf("Worker: %d\tSaving last info in buffers...", worker)
|
|
|
|
if _, err := nodes.BulkWrite(context.Background(), buf, opts); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2019-05-30 14:05:08 +03:00
|
|
|
}
|
2019-06-03 13:59:49 +03:00
|
|
|
log.Printf("Worker: %d\tDone", worker)
|
2019-05-30 14:05:08 +03:00
|
|
|
return nil
|
|
|
|
}
|
2019-06-03 13:59:49 +03:00
|
|
|
if len(buf) == blockSize {
|
|
|
|
ic++
|
|
|
|
log.Printf("Worker: %d\tWriting block %d (%d objects)", worker, ic, ic*blockSize)
|
|
|
|
if _, err := nodes.BulkWrite(context.Background(), buf, opts); err != nil {
|
2019-05-30 14:05:08 +03:00
|
|
|
return err
|
|
|
|
}
|
2019-06-03 13:59:49 +03:00
|
|
|
buf = make([]mongo.WriteModel, 0)
|
2019-05-30 14:05:08 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|