fix(indexer): fix assignee filters in issue search (#38021)

fix(indexer): fix assignee filters in issue search (#38021)

Issue search filtering still relied on the legacy single-assignee field,
so searches such as "Assigned to you" could miss issues when a keyword
query was used.

Index all issue assignee IDs and add an explicit no_assignee field so
specific, any-assignee, and no-assignee filters work consistently across
Bleve, Elasticsearch, and Meilisearch.

Fixes #36299.
This commit is contained in:
puni9869
2026-06-22 11:15:24 +05:30
committed by GitHub
parent 7684221ed4
commit a4781dde89
7 changed files with 133 additions and 40 deletions
+20 -7
View File
@@ -377,10 +377,10 @@ var cases = []*testIndexerCase{
Expected: func(t *testing.T, data map[int64]*internal.IndexerData, result *internal.SearchResult) {
assert.Len(t, result.Hits, 5)
for _, v := range result.Hits {
assert.Equal(t, int64(1), data[v.ID].AssigneeID)
assert.True(t, slices.Contains(data[v.ID].AssigneeIDs, int64(1)))
}
assert.Equal(t, countIndexerData(data, func(v *internal.IndexerData) bool {
return v.AssigneeID == 1
return slices.Contains(v.AssigneeIDs, int64(1))
}), result.Total)
},
},
@@ -395,10 +395,10 @@ var cases = []*testIndexerCase{
Expected: func(t *testing.T, data map[int64]*internal.IndexerData, result *internal.SearchResult) {
assert.Len(t, result.Hits, 5)
for _, v := range result.Hits {
assert.Equal(t, int64(0), data[v.ID].AssigneeID)
assert.True(t, data[v.ID].NoAssignee)
}
assert.Equal(t, countIndexerData(data, func(v *internal.IndexerData) bool {
return v.AssigneeID == 0
return v.NoAssignee
}), result.Total)
},
},
@@ -630,10 +630,10 @@ var cases = []*testIndexerCase{
Expected: func(t *testing.T, data map[int64]*internal.IndexerData, result *internal.SearchResult) {
assert.Len(t, result.Hits, 180)
for _, v := range result.Hits {
assert.GreaterOrEqual(t, data[v.ID].AssigneeID, int64(1))
assert.False(t, data[v.ID].NoAssignee)
}
assert.Equal(t, countIndexerData(data, func(v *internal.IndexerData) bool {
return v.AssigneeID >= 1
return !v.NoAssignee
}), result.Total)
},
},
@@ -686,6 +686,18 @@ func generateDefaultIndexerData() []*internal.IndexerData {
for i := range projectIDs {
projectIDs[i] = int64(i) + 1 // projectID should not be 0
}
var assigneeIDs []int64
if issueIndex%10 != 0 {
assigneeID := issueIndex % 10
assigneeIDs = []int64{assigneeID}
if issueIndex%3 == 0 {
nextAssigneeID := assigneeID + 1
if nextAssigneeID == 10 {
nextAssigneeID = 1
}
assigneeIDs = append(assigneeIDs, nextAssigneeID)
}
}
data = append(data, &internal.IndexerData{
ID: id,
@@ -702,7 +714,8 @@ func generateDefaultIndexerData() []*internal.IndexerData {
ProjectIDs: projectIDs,
NoProject: len(projectIDs) == 0,
PosterID: id%10 + 1, // PosterID should not be 0
AssigneeID: issueIndex % 10,
AssigneeIDs: assigneeIDs,
NoAssignee: len(assigneeIDs) == 0,
MentionIDs: mentionIDs,
ReviewedIDs: reviewedIDs,
ReviewRequestedIDs: reviewRequestedIDs,