From 347d8f2b5f34bcfe5f715e0383dc5b13e5552191 Mon Sep 17 00:00:00 2001 From: Haruko386 Date: Fri, 24 Jul 2026 12:07:43 +0800 Subject: [PATCH] fix: not sorted when list chunks (#17329) ### Summary As title, sorted now --- internal/service/chunk/chunk.go | 10 +++++- internal/service/chunk/chunk_test.go | 48 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/internal/service/chunk/chunk.go b/internal/service/chunk/chunk.go index 06124c8349..8cd8c8f9cb 100644 --- a/internal/service/chunk/chunk.go +++ b/internal/service/chunk/chunk.go @@ -840,8 +840,15 @@ func (s *ChunkService) List(req *service.ListChunksRequest, userID string) (*ser page := common.CoalesceInt(req.Page, 1) size := common.CoalesceInt(req.Size, 30) keywords := strings.TrimSpace(req.Keywords) + var orderBy *types.OrderByExpr matchExprs := make([]interface{}, 0, 1) - if keywords != "" { + if keywords == "" { + orderBy = (&types.OrderByExpr{}). + Asc("chunk_order_int"). + Asc("page_num_int"). + Asc("top_int"). + Desc("create_timestamp_flt") + } else { matchExprs = append(matchExprs, &types.MatchTextExpr{ MatchingText: keywords, TopN: size, @@ -855,6 +862,7 @@ func (s *ChunkService) List(req *service.ListChunksRequest, userID string) (*ser KbIDs: kbIDs, Offset: (page - 1) * size, Limit: size, + OrderBy: orderBy, SelectFields: []string{ "id", "content_with_weight", diff --git a/internal/service/chunk/chunk_test.go b/internal/service/chunk/chunk_test.go index c99dd90c7e..6127ece923 100644 --- a/internal/service/chunk/chunk_test.go +++ b/internal/service/chunk/chunk_test.go @@ -279,6 +279,54 @@ func TestParseRejectsRunningDocument(t *testing.T) { } } +func TestListSortsChunksByDocumentPosition(t *testing.T) { + db := setupChunkTestDB(t) + pushChunkTestDB(t, db) + + userID := "user-1" + tenantID := "tenant-1" + datasetID := "kb-1" + documentID := "doc-1" + insertChunkTestUserTenant(t, userID, tenantID) + insertChunkTestKB(t, datasetID, tenantID) + insertChunkTestDoc(t, documentID, datasetID) + + engine := &listChunksSearchEngine{} + svc := &ChunkService{ + docEngine: engine, + kbDAO: dao.NewKnowledgebaseDAO(), + userTenantDAO: dao.NewUserTenantDAO(), + documentDAO: dao.NewDocumentDAO(), + } + + page := 1 + size := 30 + if _, err := svc.List(&service.ListChunksRequest{ + DatasetID: datasetID, + DocID: documentID, + Page: &page, + Size: &size, + }, userID); err != nil { + t.Fatalf("List() error = %v", err) + } + + if engine.searchReq == nil { + t.Fatal("expected Search to be called") + } + if engine.searchReq.OrderBy == nil { + t.Fatal("expected OrderBy to be set") + } + want := []types.OrderByField{ + {Field: "chunk_order_int", Type: types.SortAsc}, + {Field: "page_num_int", Type: types.SortAsc}, + {Field: "top_int", Type: types.SortAsc}, + {Field: "create_timestamp_flt", Type: types.SortDesc}, + } + if !reflect.DeepEqual(engine.searchReq.OrderBy.Fields, want) { + t.Fatalf("OrderBy fields = %#v, want %#v", engine.searchReq.OrderBy.Fields, want) + } +} + func TestListBuildsMatchTextExprForKeywords(t *testing.T) { db := setupChunkTestDB(t) pushChunkTestDB(t, db)