From 7a811f0cb81a2f41dcb23c8e7147f709830ca6eb Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sat, 14 Mar 2026 20:43:30 +0900 Subject: [PATCH] Fix --no-sort jumpiness by merging results in index order Fix #4717 --- src/merger.go | 11 ++--------- src/merger_test.go | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/merger.go b/src/merger.go index d4deaf4f..292a61a8 100644 --- a/src/merger.go +++ b/src/merger.go @@ -136,14 +136,7 @@ func (mg *Merger) Get(idx int) Result { if mg.tac { idx = mg.count - idx - 1 } - for _, list := range mg.lists { - numItems := len(list) - if idx < numItems { - return list[idx] - } - idx -= numItems - } - panic(fmt.Sprintf("Index out of bounds (unsorted, %d/%d)", idx, mg.count)) + return mg.mergedGet(idx) } func (mg *Merger) ToMap() map[int32]Result { @@ -171,7 +164,7 @@ func (mg *Merger) mergedGet(idx int) Result { } if cursor >= 0 { rank := list[cursor] - if minIdx < 0 || compareRanks(rank, minRank, mg.tac) { + if minIdx < 0 || mg.sorted && compareRanks(rank, minRank, mg.tac) || !mg.sorted && rank.item.Index() < minRank.item.Index() { minRank = rank minIdx = listIdx } diff --git a/src/merger_test.go b/src/merger_test.go index e3141be3..d55ea582 100644 --- a/src/merger_test.go +++ b/src/merger_test.go @@ -54,10 +54,25 @@ func buildLists(partiallySorted bool) ([][]Result, []Result) { } func TestMergerUnsorted(t *testing.T) { - lists, items := buildLists(false) + lists, _ := buildLists(false) + + // Sort each list by index to simulate real worker behavior + // (workers process chunks in ascending order via nextChunk.Add(1)) + for _, list := range lists { + sort.Slice(list, func(i, j int) bool { + return list[i].item.Index() < list[j].item.Index() + }) + } + items := []Result{} + for _, list := range lists { + items = append(items, list...) + } + sort.Slice(items, func(i, j int) bool { + return items[i].item.Index() < items[j].item.Index() + }) cnt := len(items) - // Not sorted: same order + // Not sorted: items in ascending index order mg := NewMerger(nil, lists, false, false, revision{}, 0, 0) assert(t, cnt == mg.Length(), "Invalid Length") for i := range cnt {