fix(knowledge): Fix the issue of ineffective pagination parameters in the image-based knowledge base (#831)
This commit is contained in:
parent
f956c18a09
commit
e7070b419c
|
|
@ -27,8 +27,15 @@ type WhereSliceOpt struct {
|
|||
DocumentID int64
|
||||
DocumentIDs []int64
|
||||
Keyword *string
|
||||
Sequence int64
|
||||
PageSize int64
|
||||
Offset int64
|
||||
NotEmpty *bool
|
||||
}
|
||||
|
||||
type WherePhotoSliceOpt struct {
|
||||
KnowledgeID int64
|
||||
DocumentIDs []int64
|
||||
Limit *int
|
||||
Offset *int
|
||||
HasCaption *bool
|
||||
}
|
||||
|
|
|
|||
|
|
@ -236,8 +236,11 @@ func (dao *KnowledgeDocumentSliceDAO) FindSliceByCondition(ctx context.Context,
|
|||
|
||||
if opts.PageSize != 0 {
|
||||
do = do.Limit(int(opts.PageSize))
|
||||
do = do.Offset(int(opts.Sequence)).Order(s.Sequence.Asc())
|
||||
}
|
||||
if opts.Offset != 0 {
|
||||
do = do.Offset(int(opts.Offset))
|
||||
}
|
||||
do = do.Order(s.Sequence.Asc())
|
||||
if opts.NotEmpty != nil {
|
||||
if ptr.From(opts.NotEmpty) {
|
||||
do = do.Where(s.Content.Neq(""))
|
||||
|
|
@ -319,3 +322,44 @@ func (dao *KnowledgeDocumentSliceDAO) GetLastSequence(ctx context.Context, docum
|
|||
}
|
||||
return resp.Sequence, nil
|
||||
}
|
||||
|
||||
func (dao *KnowledgeDocumentSliceDAO) ListPhotoSlice(ctx context.Context, opts *entity.WherePhotoSliceOpt) ([]*model.KnowledgeDocumentSlice, int64, error) {
|
||||
s := dao.Query.KnowledgeDocumentSlice
|
||||
do := s.WithContext(ctx)
|
||||
if opts.KnowledgeID != 0 {
|
||||
do = do.Where(s.KnowledgeID.Eq(opts.KnowledgeID))
|
||||
}
|
||||
if len(opts.DocumentIDs) != 0 {
|
||||
do = do.Where(s.DocumentID.In(opts.DocumentIDs...))
|
||||
}
|
||||
if ptr.From(opts.Limit) != 0 {
|
||||
do = do.Limit(int(ptr.From(opts.Limit)))
|
||||
}
|
||||
if ptr.From(opts.Offset) != 0 {
|
||||
do = do.Offset(int(ptr.From(opts.Offset)))
|
||||
}
|
||||
if opts.HasCaption != nil {
|
||||
if ptr.From(opts.HasCaption) {
|
||||
do = do.Where(s.Content.Neq(""))
|
||||
} else {
|
||||
do = do.Where(s.Content.Eq(""))
|
||||
}
|
||||
}
|
||||
do = do.Order(s.UpdatedAt.Desc())
|
||||
pos, err := do.Find()
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
total, err := do.Limit(-1).Offset(-1).Count()
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
return pos, total, nil
|
||||
}
|
||||
|
||||
func (dao *KnowledgeDocumentSliceDAO) BatchCreateWithTX(ctx context.Context, tx *gorm.DB, slices []*model.KnowledgeDocumentSlice) error {
|
||||
if len(slices) == 0 {
|
||||
return nil
|
||||
}
|
||||
return tx.WithContext(ctx).Debug().Model(&model.KnowledgeDocumentSlice{}).CreateInBatches(slices, 100).Error
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ type baseDocProcessor struct {
|
|||
// Drop DB model
|
||||
TableName string
|
||||
docModels []*model.KnowledgeDocument
|
||||
imageSlices []*model.KnowledgeDocumentSlice
|
||||
|
||||
storage storage.Storage
|
||||
knowledgeRepo repository.KnowledgeRepo
|
||||
|
|
@ -69,14 +70,14 @@ func (p *baseDocProcessor) BeforeCreate() error {
|
|||
|
||||
func (p *baseDocProcessor) BuildDBModel() error {
|
||||
p.docModels = make([]*model.KnowledgeDocument, 0, len(p.Documents))
|
||||
ids, err := p.idgen.GenMultiIDs(p.ctx, len(p.Documents))
|
||||
for i := range p.Documents {
|
||||
id, err := p.idgen.GenID(p.ctx)
|
||||
if err != nil {
|
||||
logs.CtxErrorf(p.ctx, "gen ids failed, err: %v", err)
|
||||
logs.CtxErrorf(p.ctx, "gen id failed, err: %v", err)
|
||||
return errorx.New(errno.ErrKnowledgeIDGenCode)
|
||||
}
|
||||
for i := range p.Documents {
|
||||
docModel := &model.KnowledgeDocument{
|
||||
ID: ids[i],
|
||||
ID: id,
|
||||
KnowledgeID: p.Documents[i].KnowledgeID,
|
||||
Name: p.Documents[i].Name,
|
||||
FileExtension: string(p.Documents[i].FileExtension),
|
||||
|
|
@ -95,6 +96,23 @@ func (p *baseDocProcessor) BuildDBModel() error {
|
|||
}
|
||||
p.Documents[i].ID = docModel.ID
|
||||
p.docModels = append(p.docModels, docModel)
|
||||
if p.Documents[i].Type == knowledge.DocumentTypeImage {
|
||||
id, err := p.idgen.GenID(p.ctx)
|
||||
if err != nil {
|
||||
logs.CtxErrorf(p.ctx, "gen id failed, err: %v", err)
|
||||
return errorx.New(errno.ErrKnowledgeIDGenCode)
|
||||
}
|
||||
p.imageSlices = append(p.imageSlices, &model.KnowledgeDocumentSlice{
|
||||
ID: id,
|
||||
KnowledgeID: p.Documents[i].KnowledgeID,
|
||||
DocumentID: p.Documents[i].ID,
|
||||
CreatedAt: time.Now().UnixMilli(),
|
||||
UpdatedAt: time.Now().UnixMilli(),
|
||||
CreatorID: p.UserID,
|
||||
SpaceID: p.SpaceID,
|
||||
Status: int32(knowledge.SliceStatusInit),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
|
|
@ -142,6 +160,11 @@ func (p *baseDocProcessor) InsertDBModel() (err error) {
|
|||
logs.CtxErrorf(ctx, "create document failed, err: %v", err)
|
||||
return errorx.New(errno.ErrKnowledgeDBCode, errorx.KV("msg", err.Error()))
|
||||
}
|
||||
err = p.sliceRepo.BatchCreateWithTX(ctx, tx, p.imageSlices)
|
||||
if err != nil {
|
||||
logs.CtxErrorf(ctx, "update knowledge failed, err: %v", err)
|
||||
return errorx.New(errno.ErrKnowledgeDBCode, errorx.KV("msg", err.Error()))
|
||||
}
|
||||
err = p.knowledgeRepo.UpdateWithTx(ctx, tx, p.Documents[0].KnowledgeID, map[string]interface{}{
|
||||
"updated_at": time.Now().UnixMilli(),
|
||||
})
|
||||
|
|
|
|||
|
|
@ -84,12 +84,12 @@ type KnowledgeDocumentSliceRepo interface {
|
|||
Create(ctx context.Context, slice *model.KnowledgeDocumentSlice) error
|
||||
Update(ctx context.Context, slice *model.KnowledgeDocumentSlice) error
|
||||
Delete(ctx context.Context, slice *model.KnowledgeDocumentSlice) error
|
||||
|
||||
BatchCreateWithTX(ctx context.Context, tx *gorm.DB, slices []*model.KnowledgeDocumentSlice) error
|
||||
BatchCreate(ctx context.Context, slices []*model.KnowledgeDocumentSlice) error
|
||||
BatchSetStatus(ctx context.Context, ids []int64, status int32, reason string) error
|
||||
DeleteByDocument(ctx context.Context, documentID int64) error
|
||||
MGetSlices(ctx context.Context, sliceIDs []int64) ([]*model.KnowledgeDocumentSlice, error)
|
||||
|
||||
ListPhotoSlice(ctx context.Context, opts *entity.WherePhotoSliceOpt) ([]*model.KnowledgeDocumentSlice, int64, error)
|
||||
FindSliceByCondition(ctx context.Context, opts *entity.WhereSliceOpt) (
|
||||
[]*model.KnowledgeDocumentSlice, int64, error)
|
||||
GetDocumentSliceIDs(ctx context.Context, docIDs []int64) (sliceIDs []int64, err error)
|
||||
|
|
|
|||
|
|
@ -190,6 +190,7 @@ func (k *knowledgeSVC) indexDocument(ctx context.Context, event *entity.Event) (
|
|||
collectionName := getCollectionName(doc.KnowledgeID)
|
||||
|
||||
if !doc.IsAppend {
|
||||
if doc.Type != knowledge.DocumentTypeImage {
|
||||
ids, err := k.sliceRepo.GetDocumentSliceIDs(ctx, []int64{doc.ID})
|
||||
if err != nil {
|
||||
return errorx.New(errno.ErrKnowledgeDBCode, errorx.KV("msg", fmt.Sprintf("get document slice ids failed, err: %v", err)))
|
||||
|
|
@ -212,6 +213,7 @@ func (k *knowledgeSVC) indexDocument(ctx context.Context, event *entity.Event) (
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// set chunk status
|
||||
if err = k.documentRepo.SetStatus(ctx, doc.ID, int32(entity.DocumentStatusChunking), ""); err != nil {
|
||||
|
|
@ -298,6 +300,39 @@ func (k *knowledgeSVC) indexDocument(ctx context.Context, event *entity.Event) (
|
|||
seqOffset += 1
|
||||
}
|
||||
|
||||
if doc.Type == knowledge.DocumentTypeImage {
|
||||
if len(parseResult) != 0 {
|
||||
slices, _, err := k.sliceRepo.FindSliceByCondition(ctx, &entity.WhereSliceOpt{DocumentID: doc.ID})
|
||||
if err != nil {
|
||||
return errorx.New(errno.ErrKnowledgeDBCode, errorx.KV("msg", fmt.Sprintf("find slice failed, err: %v", err)))
|
||||
}
|
||||
var slice *model.KnowledgeDocumentSlice
|
||||
if len(slices) > 0 {
|
||||
slice = slices[0]
|
||||
slice.Content = parseResult[0].Content
|
||||
} else {
|
||||
id, err := k.idgen.GenID(ctx)
|
||||
if err != nil {
|
||||
return errorx.New(errno.ErrKnowledgeIDGenCode, errorx.KV("msg", fmt.Sprintf("GenID failed, err: %v", err)))
|
||||
}
|
||||
slice = &model.KnowledgeDocumentSlice{
|
||||
ID: id,
|
||||
KnowledgeID: doc.KnowledgeID,
|
||||
DocumentID: doc.ID,
|
||||
Content: parseResult[0].Content,
|
||||
CreatedAt: time.Now().UnixMilli(),
|
||||
UpdatedAt: time.Now().UnixMilli(),
|
||||
CreatorID: doc.CreatorID,
|
||||
SpaceID: doc.SpaceID,
|
||||
Status: int32(model.SliceStatusProcessing),
|
||||
FailReason: "",
|
||||
}
|
||||
}
|
||||
if err = k.sliceRepo.Update(ctx, slice); err != nil {
|
||||
return errorx.New(errno.ErrKnowledgeDBCode, errorx.KV("msg", fmt.Sprintf("update slice failed, err: %v", err)))
|
||||
}
|
||||
}
|
||||
} else {
|
||||
sliceModels := make([]*model.KnowledgeDocumentSlice, 0, len(parseResult))
|
||||
for i, src := range parseResult {
|
||||
now := time.Now().UnixMilli()
|
||||
|
|
@ -327,6 +362,7 @@ func (k *knowledgeSVC) indexDocument(ctx context.Context, event *entity.Event) (
|
|||
if err = k.sliceRepo.BatchCreate(ctx, sliceModels); err != nil {
|
||||
return errorx.New(errno.ErrKnowledgeDBCode, errorx.KV("msg", fmt.Sprintf("batch create slice failed, err: %v", err)))
|
||||
}
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if err != nil { // set slice status
|
||||
|
|
|
|||
|
|
@ -876,9 +876,8 @@ func (k *knowledgeSVC) ListSlice(ctx context.Context, request *ListSliceRequest)
|
|||
KnowledgeID: ptr.From(request.KnowledgeID),
|
||||
DocumentID: ptr.From(request.DocumentID),
|
||||
Keyword: request.Keyword,
|
||||
Sequence: request.Sequence,
|
||||
Offset: request.Sequence,
|
||||
PageSize: request.Limit,
|
||||
Offset: request.Offset,
|
||||
})
|
||||
if err != nil {
|
||||
logs.CtxErrorf(ctx, "list slice failed, err: %v", err)
|
||||
|
|
@ -1375,12 +1374,12 @@ func (k *knowledgeSVC) ListPhotoSlice(ctx context.Context, request *ListPhotoSli
|
|||
if request == nil {
|
||||
return nil, errorx.New(errno.ErrKnowledgeInvalidParamCode, errorx.KV("msg", "request is empty"))
|
||||
}
|
||||
sliceArr, total, err := k.sliceRepo.FindSliceByCondition(ctx, &entity.WhereSliceOpt{
|
||||
sliceArr, total, err := k.sliceRepo.ListPhotoSlice(ctx, &entity.WherePhotoSliceOpt{
|
||||
KnowledgeID: request.KnowledgeID,
|
||||
DocumentIDs: request.DocumentIDs,
|
||||
Offset: int64(ptr.From(request.Offset)),
|
||||
PageSize: int64(ptr.From(request.Limit)),
|
||||
NotEmpty: request.HasCaption,
|
||||
Offset: request.Offset,
|
||||
Limit: request.Limit,
|
||||
HasCaption: request.HasCaption,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, errorx.New(errno.ErrKnowledgeDBCode, errorx.KV("msg", err.Error()))
|
||||
|
|
|
|||
Loading…
Reference in New Issue