diff --git a/crates/semantic_index/src/semantic_index.rs b/crates/semantic_index/src/semantic_index.rs index 056f6a3386c2f84cd5038250c78ced6b43bebeeb..063aff96e9dcedb6c78c2a6044a1209b3a5d6ccb 100644 --- a/crates/semantic_index/src/semantic_index.rs +++ b/crates/semantic_index/src/semantic_index.rs @@ -693,7 +693,7 @@ impl SemanticIndex { phrase: String, limit: usize, includes: Vec, - excludes: Vec, + mut excludes: Vec, cx: &mut ModelContext, ) -> Task>> { let index = self.index_project(project.clone(), cx); @@ -741,6 +741,43 @@ impl SemanticIndex { .collect::>(); anyhow::Ok(worktree_db_ids) })?; + + let (dirty_buffers, dirty_paths) = project.read_with(&cx, |project, cx| { + let mut dirty_paths = Vec::new(); + let dirty_buffers = project + .opened_buffers(cx) + .into_iter() + .filter_map(|buffer_handle| { + let buffer = buffer_handle.read(cx); + if buffer.is_dirty() { + let snapshot = buffer.snapshot(); + if let Some(file_pathbuf) = snapshot.resolve_file_path(cx, false) { + let file_path = file_pathbuf.as_path(); + + if excludes.iter().any(|glob| glob.is_match(file_path)) { + return None; + } + + file_pathbuf + .to_str() + .and_then(|path| PathMatcher::new(path).log_err()) + .and_then(|path_matcher| { + dirty_paths.push(path_matcher); + Some(()) + }); + } + // TOOD: @as-cii I removed the downgrade for now to fix the compiler - @kcaverly + Some((buffer_handle, buffer.snapshot())) + } else { + None + } + }) + .collect::>(); + + (dirty_buffers, dirty_paths) + }); + + excludes.extend(dirty_paths); let file_ids = database .retrieve_included_file_ids(&worktree_db_ids, &includes, &excludes) .await?; @@ -770,21 +807,6 @@ impl SemanticIndex { }); } } - let dirty_buffers = project.read_with(&cx, |project, cx| { - project - .opened_buffers(cx) - .into_iter() - .filter_map(|buffer_handle| { - let buffer = buffer_handle.read(cx); - if buffer.is_dirty() { - // TOOD: @as-cii I removed the downgrade for now to fix the compiler - @kcaverly - Some((buffer_handle, buffer.snapshot())) - } else { - None - } - }) - .collect::>() - }); let buffer_results = if let Some(db) = VectorDatabase::new(fs, db_path.clone(), cx.background()) @@ -966,7 +988,7 @@ impl SemanticIndex { t0.elapsed().as_millis() ); - let database_results = buffers + let mut database_results = buffers .into_iter() .zip(ranges) .zip(scores) @@ -987,53 +1009,22 @@ impl SemanticIndex { // Stitch Together Database Results & Buffer Results if let Ok(buffer_results) = buffer_results { - let mut buffer_map = HashMap::default(); for buffer_result in buffer_results { - buffer_map - .entry(buffer_result.clone().buffer) - .or_insert(Vec::new()) - .push(buffer_result); - } - - for db_result in database_results { - if !buffer_map.contains_key(&db_result.buffer) { - buffer_map - .entry(db_result.clone().buffer) - .or_insert(Vec::new()) - .push(db_result); - } - } - - let mut full_results = Vec::::new(); - - for (_, results) in buffer_map { - for res in results.into_iter() { - let ix = match full_results.binary_search_by(|search_result| { - res.similarity - .partial_cmp(&search_result.similarity) - .unwrap_or(Ordering::Equal) - }) { - Ok(ix) => ix, - Err(ix) => ix, - }; - full_results.insert(ix, res); - full_results.truncate(limit); - } + let ix = match database_results.binary_search_by(|search_result| { + buffer_result + .similarity + .partial_cmp(&search_result.similarity) + .unwrap_or(Ordering::Equal) + }) { + Ok(ix) => ix, + Err(ix) => ix, + }; + database_results.insert(ix, buffer_result); + database_results.truncate(limit); } - - return Ok(full_results); - } else { - return Ok(database_results); } - // let ix = match results.binary_search_by(|(_, s)| { - // similarity.partial_cmp(&s).unwrap_or(Ordering::Equal) - // }) { - // Ok(ix) => ix, - // Err(ix) => ix, - // }; - // results.insert(ix, (id, similarity)); - // results.truncate(limit); + Ok(database_results) }) }