feat: implement filter service integration

Co-authored-by: aider (openai/andrew/openrouter/deepseek/deepseek-chat-v3.1) <aider@aider.chat>
This commit is contained in:
Andrew Phillips
2025-08-28 21:59:49 -03:00
parent e664429465
commit c3e3ab1e46
2 changed files with 53 additions and 21 deletions

View File

@@ -2,6 +2,7 @@ use crate::common::PIPESIZE;
use crate::config::Settings; use crate::config::Settings;
use crate::services::compression_service::CompressionService; use crate::services::compression_service::CompressionService;
use crate::services::error::CoreError; use crate::services::error::CoreError;
use crate::services::filter_service::FilterService;
use crate::services::meta_service::MetaService; use crate::services::meta_service::MetaService;
use crate::services::types::{ItemWithContent, ItemWithMeta}; use crate::services::types::{ItemWithContent, ItemWithMeta};
use crate::db::{self, Meta}; use crate::db::{self, Meta};
@@ -19,6 +20,7 @@ pub struct ItemService {
data_path: PathBuf, data_path: PathBuf,
compression_service: CompressionService, compression_service: CompressionService,
meta_service: MetaService, meta_service: MetaService,
filter_service: FilterService,
} }
impl ItemService { impl ItemService {
@@ -28,6 +30,7 @@ impl ItemService {
data_path, data_path,
compression_service: CompressionService::new(), compression_service: CompressionService::new(),
meta_service: MetaService::new(), meta_service: MetaService::new(),
filter_service: FilterService::new(),
} }
} }
@@ -96,15 +99,43 @@ impl ItemService {
/// Helper method to create a filter chain from parameters /// Helper method to create a filter chain from parameters
fn create_filter_chain( fn create_filter_chain(
&self, &self,
_grep: Option<String>, grep: Option<String>,
_head_bytes: Option<usize>, head_bytes: Option<usize>,
_head_lines: Option<usize>, head_lines: Option<usize>,
_tail_bytes: Option<usize>, tail_bytes: Option<usize>,
_tail_lines: Option<usize>, tail_lines: Option<usize>,
_filter: Option<String>, filter: Option<String>,
) -> Result<Option<()>, CoreError> { ) -> Result<Option<crate::filter_plugin::FilterChain>, CoreError> {
// For now, just return None since filter_service doesn't exist // Build filter string from individual parameters (for backward compatibility)
Ok(None) let mut filter_parts = Vec::new();
if let Some(pattern) = grep {
filter_parts.push(format!("grep('{}')", pattern.replace('\'', "\\'")));
}
if let Some(bytes) = head_bytes {
filter_parts.push(format!("head_bytes({})", bytes));
}
if let Some(lines) = head_lines {
filter_parts.push(format!("head_lines({})", lines));
}
if let Some(bytes) = tail_bytes {
filter_parts.push(format!("tail_bytes({})", bytes));
}
if let Some(lines) = tail_lines {
filter_parts.push(format!("tail_lines({})", lines));
}
// Use the provided filter string if available, otherwise build from parts
let filter_str = filter.or_else(|| {
if filter_parts.is_empty() {
None
} else {
Some(filter_parts.join(" | "))
}
});
// Create filter chain
self.filter_service.create_filter_chain(filter_str.as_deref())
.map_err(|e| CoreError::InvalidInput(format!("Failed to create filter chain: {}", e)))
} }
/// Helper method to determine if content is binary /// Helper method to determine if content is binary
@@ -133,15 +164,15 @@ impl ItemService {
&self, &self,
conn: &Connection, conn: &Connection,
id: i64, id: i64,
_head_bytes: Option<usize>, head_bytes: Option<usize>,
_head_words: Option<usize>, head_words: Option<usize>,
_head_lines: Option<usize>, head_lines: Option<usize>,
_tail_bytes: Option<usize>, tail_bytes: Option<usize>,
_tail_words: Option<usize>, tail_words: Option<usize>,
_tail_lines: Option<usize>, tail_lines: Option<usize>,
_line_start: Option<usize>, line_start: Option<usize>,
_line_end: Option<usize>, line_end: Option<usize>,
_grep: Option<String>, grep: Option<String>,
) -> Result<(Box<dyn Read + Send>, String, bool), CoreError> { ) -> Result<(Box<dyn Read + Send>, String, bool), CoreError> {
let item_with_meta = self.get_item(conn, id)?; let item_with_meta = self.get_item(conn, id)?;
let item_id = item_with_meta.item.id.ok_or_else(|| CoreError::InvalidInput("Item missing ID".to_string()))?; let item_id = item_with_meta.item.id.ok_or_else(|| CoreError::InvalidInput("Item missing ID".to_string()))?;
@@ -159,12 +190,12 @@ impl ItemService {
)?; )?;
// Create filter chain // Create filter chain
let _filter_chain = self.create_filter_chain( let filter_chain = self.create_filter_chain(
grep, head_bytes, head_lines, tail_bytes, tail_lines, None grep, head_bytes, head_lines, tail_bytes, tail_lines, None
)?; )?;
// For now, just use the original reader since filtering isn't implemented // Wrap the reader with filtering
let filtered_reader = Box::new(reader); let filtered_reader = Box::new(FilteringReader::new(reader, filter_chain));
let metadata = item_with_meta.meta_as_map(); let metadata = item_with_meta.meta_as_map();
let mime_type = metadata let mime_type = metadata

View File

@@ -1,6 +1,7 @@
pub mod async_item_service; pub mod async_item_service;
pub mod compression_service; pub mod compression_service;
pub mod error; pub mod error;
pub mod filter_service;
pub mod item_service; pub mod item_service;
pub mod meta_service; pub mod meta_service;
pub mod status_service; pub mod status_service;