|
99 | 99 | ---@param min_similarity number |
100 | 100 | ---@return table<CopilotChat.context.embed> |
101 | 101 | local function data_ranked_by_relatedness(query, data, min_similarity) |
102 | | - local results = {} |
103 | 102 | for _, item in ipairs(data) do |
104 | 103 | local score = spatial_distance_cosine(item.embedding, query.embedding) |
105 | | - score = score or item.score or 0 |
106 | | - table.insert(results, vim.tbl_extend('force', item, { score = score })) |
| 104 | + item.score = score or item.score or 0 |
107 | 105 | end |
108 | 106 |
|
109 | | - table.sort(results, function(a, b) |
| 107 | + table.sort(data, function(a, b) |
110 | 108 | return a.score > b.score |
111 | 109 | end) |
112 | 110 |
|
113 | | - -- Take top MAX_RESULTS items that meet threshold, or at least MIN_RESULTS items |
| 111 | + -- Return top items meeting threshold |
114 | 112 | local filtered = {} |
115 | | - for i, result in ipairs(results) do |
| 113 | + for i, result in ipairs(data) do |
116 | 114 | if (result.score >= min_similarity) or (i <= MULTI_FILE_THRESHOLD) then |
117 | 115 | table.insert(filtered, result) |
118 | 116 | end |
@@ -170,7 +168,6 @@ local function data_ranked_by_symbols(query, data, min_similarity) |
170 | 168 | query_trigrams[trigram] = true |
171 | 169 | end |
172 | 170 |
|
173 | | - local results = {} |
174 | 171 | local max_score = 0 |
175 | 172 |
|
176 | 173 | for _, entry in ipairs(data) do |
@@ -200,25 +197,23 @@ local function data_ranked_by_symbols(query, data, min_similarity) |
200 | 197 | score = score + (symbol_score * 0.5) -- Weight symbol matches less |
201 | 198 | end |
202 | 199 |
|
203 | | - if score > 0 then |
204 | | - max_score = math.max(max_score, score) |
205 | | - table.insert(results, vim.tbl_extend('force', entry, { score = score })) |
206 | | - end |
| 200 | + max_score = math.max(max_score, score) |
| 201 | + entry.score = score |
207 | 202 | end |
208 | 203 |
|
209 | 204 | -- Normalize scores |
210 | | - for _, result in ipairs(results) do |
211 | | - result.score = result.score / max_score |
| 205 | + for _, entry in ipairs(data) do |
| 206 | + entry.score = entry.score / max_score |
212 | 207 | end |
213 | 208 |
|
214 | 209 | -- Sort by score first |
215 | | - table.sort(results, function(a, b) |
| 210 | + table.sort(data, function(a, b) |
216 | 211 | return a.score > b.score |
217 | 212 | end) |
218 | 213 |
|
219 | 214 | -- Filter results while preserving top scores |
220 | 215 | local filtered_results = {} |
221 | | - for i, result in ipairs(results) do |
| 216 | + for i, result in ipairs(data) do |
222 | 217 | if (result.score >= min_similarity) or (i <= MULTI_FILE_THRESHOLD) then |
223 | 218 | table.insert(filtered_results, result) |
224 | 219 | end |
|
0 commit comments