mirror of
https://github.com/openimsdk/open-im-server.git
synced 2026-05-01 07:35:58 +08:00
BatchInsertBlock
This commit is contained in:
+105
-97
@@ -6,7 +6,6 @@ import (
|
||||
"fmt"
|
||||
|
||||
table "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/unrelation"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
|
||||
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
|
||||
@@ -26,7 +25,16 @@ type MsgMongoDriver struct {
|
||||
}
|
||||
|
||||
func NewMsgMongoDriver(database *mongo.Database) table.MsgDocModelInterface {
|
||||
return &MsgMongoDriver{MsgCollection: database.Collection(table.MsgDocModel{}.TableName())}
|
||||
collection := database.Collection(table.MsgDocModel{}.TableName())
|
||||
indexModel := mongo.IndexModel{
|
||||
Keys: bson.M{"doc_id": 1},
|
||||
Options: options.Index().SetUnique(true),
|
||||
}
|
||||
_, err := collection.Indexes().CreateOne(context.Background(), indexModel)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return &MsgMongoDriver{MsgCollection: collection}
|
||||
}
|
||||
|
||||
func (m *MsgMongoDriver) PushMsgsToDoc(ctx context.Context, docID string, msgsToMongo []table.MsgInfoModel) error {
|
||||
@@ -103,33 +111,33 @@ func (m *MsgMongoDriver) FindOneByDocID(ctx context.Context, docID string) (*tab
|
||||
}
|
||||
|
||||
func (m *MsgMongoDriver) GetMsgAndIndexBySeqsInOneDoc(ctx context.Context, docID string, seqs []int64) (seqMsgs []*sdkws.MsgData, indexes []int, unExistSeqs []int64, err error) {
|
||||
doc, err := m.FindOneByDocID(ctx, docID)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
singleCount := 0
|
||||
var hasSeqList []int64
|
||||
for i := 0; i < len(doc.Msg); i++ {
|
||||
var msg sdkws.MsgData
|
||||
if err := proto.Unmarshal(doc.Msg[i].Msg, &msg); err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
if utils.Contain(msg.Seq, seqs...) {
|
||||
indexes = append(indexes, i)
|
||||
seqMsgs = append(seqMsgs, &msg)
|
||||
hasSeqList = append(hasSeqList, msg.Seq)
|
||||
singleCount++
|
||||
if singleCount == len(seqs) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, i := range seqs {
|
||||
if utils.Contain(i, hasSeqList...) {
|
||||
continue
|
||||
}
|
||||
unExistSeqs = append(unExistSeqs, i)
|
||||
}
|
||||
//doc, err := m.FindOneByDocID(ctx, docID)
|
||||
//if err != nil {
|
||||
// return nil, nil, nil, err
|
||||
//}
|
||||
//singleCount := 0
|
||||
//var hasSeqList []int64
|
||||
//for i := 0; i < len(doc.Msg); i++ {
|
||||
// var msg sdkws.MsgData
|
||||
// if err := proto.Unmarshal(doc.Msg[i].Msg, &msg); err != nil {
|
||||
// return nil, nil, nil, err
|
||||
// }
|
||||
// if utils.Contain(msg.Seq, seqs...) {
|
||||
// indexes = append(indexes, i)
|
||||
// seqMsgs = append(seqMsgs, &msg)
|
||||
// hasSeqList = append(hasSeqList, msg.Seq)
|
||||
// singleCount++
|
||||
// if singleCount == len(seqs) {
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
//for _, i := range seqs {
|
||||
// if utils.Contain(i, hasSeqList...) {
|
||||
// continue
|
||||
// }
|
||||
// unExistSeqs = append(unExistSeqs, i)
|
||||
//}
|
||||
return seqMsgs, indexes, unExistSeqs, nil
|
||||
}
|
||||
|
||||
@@ -170,30 +178,30 @@ func (m *MsgMongoDriver) GetNewestMsg(ctx context.Context, conversationID string
|
||||
}
|
||||
|
||||
func (m *MsgMongoDriver) GetOldestMsg(ctx context.Context, conversationID string) (*table.MsgInfoModel, error) {
|
||||
var msgDocs []table.MsgDocModel
|
||||
cursor, err := m.MsgCollection.Find(ctx, bson.M{"doc_id": bson.M{"$regex": fmt.Sprintf("^%s:", conversationID)}}, options.Find().SetLimit(1).SetSort(bson.M{"doc_id": 1}))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = cursor.All(ctx, &msgDocs)
|
||||
if err != nil {
|
||||
return nil, utils.Wrap(err, "")
|
||||
}
|
||||
var oldestMsg table.MsgInfoModel
|
||||
if len(msgDocs) > 0 {
|
||||
for _, v := range msgDocs[0].Msg {
|
||||
if v.SendTime != 0 {
|
||||
oldestMsg = v
|
||||
break
|
||||
}
|
||||
}
|
||||
if len(oldestMsg.Msg) == 0 {
|
||||
if len(msgDocs[0].Msg) > 0 {
|
||||
oldestMsg = msgDocs[0].Msg[0]
|
||||
}
|
||||
}
|
||||
return &oldestMsg, nil
|
||||
}
|
||||
//var msgDocs []table.MsgDocModel
|
||||
//cursor, err := m.MsgCollection.Find(ctx, bson.M{"doc_id": bson.M{"$regex": fmt.Sprintf("^%s:", conversationID)}}, options.Find().SetLimit(1).SetSort(bson.M{"doc_id": 1}))
|
||||
//if err != nil {
|
||||
// return nil, err
|
||||
//}
|
||||
//err = cursor.All(ctx, &msgDocs)
|
||||
//if err != nil {
|
||||
// return nil, utils.Wrap(err, "")
|
||||
//}
|
||||
//var oldestMsg table.MsgInfoModel
|
||||
//if len(msgDocs) > 0 {
|
||||
// for _, v := range msgDocs[0].Msg {
|
||||
// if v.SendTime != 0 {
|
||||
// oldestMsg = v
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
// if len(oldestMsg.Msg) == 0 {
|
||||
// if len(msgDocs[0].Msg) > 0 {
|
||||
// oldestMsg = msgDocs[0].Msg[0]
|
||||
// }
|
||||
// }
|
||||
// return &oldestMsg, nil
|
||||
//}
|
||||
return nil, ErrMsgNotFound
|
||||
}
|
||||
|
||||
@@ -211,50 +219,50 @@ func (m *MsgMongoDriver) UpdateOneDoc(ctx context.Context, msg *table.MsgDocMode
|
||||
}
|
||||
|
||||
func (m *MsgMongoDriver) GetMsgBySeqIndexIn1Doc(ctx context.Context, docID string, seqs []int64) (msgs []*sdkws.MsgData, err error) {
|
||||
beginSeq, endSeq := utils.GetSeqsBeginEnd(seqs)
|
||||
beginIndex := m.msg.GetMsgIndex(beginSeq)
|
||||
num := endSeq - beginSeq + 1
|
||||
pipeline := bson.A{
|
||||
bson.M{
|
||||
"$match": bson.M{"doc_id": docID},
|
||||
},
|
||||
bson.M{
|
||||
"$project": bson.M{
|
||||
"msgs": bson.M{
|
||||
"$slice": bson.A{"$msgs", beginIndex, num},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
cursor, err := m.MsgCollection.Aggregate(ctx, pipeline)
|
||||
if err != nil {
|
||||
return nil, errs.Wrap(err)
|
||||
}
|
||||
defer cursor.Close(ctx)
|
||||
var doc table.MsgDocModel
|
||||
i := 0
|
||||
for cursor.Next(ctx) {
|
||||
err := cursor.Decode(&doc)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if i == 0 {
|
||||
break
|
||||
}
|
||||
}
|
||||
log.ZDebug(ctx, "msgInfos", "num", len(doc.Msg), "docID", docID)
|
||||
for _, v := range doc.Msg {
|
||||
var msg sdkws.MsgData
|
||||
if err := proto.Unmarshal(v.Msg, &msg); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if msg.Seq >= beginSeq && msg.Seq <= endSeq {
|
||||
log.ZDebug(ctx, "find msg", "msg", &msg)
|
||||
msgs = append(msgs, &msg)
|
||||
} else {
|
||||
log.ZWarn(ctx, "this msg is at wrong position", nil, "msg", &msg)
|
||||
}
|
||||
}
|
||||
//beginSeq, endSeq := utils.GetSeqsBeginEnd(seqs)
|
||||
//beginIndex := m.msg.GetMsgIndex(beginSeq)
|
||||
//num := endSeq - beginSeq + 1
|
||||
//pipeline := bson.A{
|
||||
// bson.M{
|
||||
// "$match": bson.M{"doc_id": docID},
|
||||
// },
|
||||
// bson.M{
|
||||
// "$project": bson.M{
|
||||
// "msgs": bson.M{
|
||||
// "$slice": bson.A{"$msgs", beginIndex, num},
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
//}
|
||||
//cursor, err := m.MsgCollection.Aggregate(ctx, pipeline)
|
||||
//if err != nil {
|
||||
// return nil, errs.Wrap(err)
|
||||
//}
|
||||
//defer cursor.Close(ctx)
|
||||
//var doc table.MsgDocModel
|
||||
//i := 0
|
||||
//for cursor.Next(ctx) {
|
||||
// err := cursor.Decode(&doc)
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// if i == 0 {
|
||||
// break
|
||||
// }
|
||||
//}
|
||||
//log.ZDebug(ctx, "msgInfos", "num", len(doc.Msg), "docID", docID)
|
||||
//for _, v := range doc.Msg {
|
||||
// var msg sdkws.MsgData
|
||||
// if err := proto.Unmarshal(v.Msg, &msg); err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// if msg.Seq >= beginSeq && msg.Seq <= endSeq {
|
||||
// log.ZDebug(ctx, "find msg", "msg", &msg)
|
||||
// msgs = append(msgs, &msg)
|
||||
// } else {
|
||||
// log.ZWarn(ctx, "this msg is at wrong position", nil, "msg", &msg)
|
||||
// }
|
||||
//}
|
||||
return msgs, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user