diff --git a/src/basic_memory/repository/search_repository.py b/src/basic_memory/repository/search_repository.py index 5c926d47..4081d171 100644 --- a/src/basic_memory/repository/search_repository.py +++ b/src/basic_memory/repository/search_repository.py @@ -71,8 +71,8 @@ class SearchRepository: conditions.append("(title MATCH :text OR content MATCH :text)") # Handle pattern search on permalink using FTS - if query.permalink_pattern: - fts_pattern = self._convert_pattern_to_fts(query.permalink_pattern) + if query.permalink: + fts_pattern = self._convert_pattern_to_fts(query.permalink) if fts_pattern: params["permalink_pattern"] = fts_pattern conditions.append("permalink MATCH :permalink_pattern") diff --git a/src/basic_memory/schemas/search.py b/src/basic_memory/schemas/search.py index f564689c..11d604d5 100644 --- a/src/basic_memory/schemas/search.py +++ b/src/basic_memory/schemas/search.py @@ -15,8 +15,8 @@ class SearchItemType(str, Enum): class SearchQuery(BaseModel): """Search query parameters.""" - text: Optional[str] = None # Made optional to allow permalink-only search - permalink_pattern: Optional[str] = None # Added for pattern matching + text: Optional[str] = None + permalink: Optional[str] = None types: Optional[List[SearchItemType]] = None entity_types: Optional[List[str]] = None after_date: Optional[Union[datetime, str]] = None diff --git a/src/basic_memory/services/context_service.py b/src/basic_memory/services/context_service.py index fc6f0d01..705f0183 100644 --- a/src/basic_memory/services/context_service.py +++ b/src/basic_memory/services/context_service.py @@ -66,12 +66,9 @@ class ContextService: async def find_by_pattern(self, pattern: str): """Find entities matching a glob pattern.""" # Convert glob pattern to SQL LIKE pattern - sql_pattern = pattern.replace('*', '%') - # Use search with permalink pattern query = SearchQuery( - permalink_pattern=sql_pattern, - types=[SearchItemType.ENTITY] # Only match entities + permalink=pattern, ) return await self.search_repository.search(query) @@ -80,14 +77,13 @@ class ContextService: """Find entities using fuzzy text search.""" query = SearchQuery( text=search_terms, - types=[SearchItemType.ENTITY] # Only match entities ) return await self.search_repository.search(query) async def find_related(self, permalink: str): """Find entities related to a given permalink.""" # First find the target entity - query = SearchQuery(permalink_pattern=permalink) + query = SearchQuery(permalink=permalink) results = await self.search_repository.search(query) if not results: @@ -102,7 +98,7 @@ class ContextService: async def find_by_permalink(self, permalink: str): """Find an entity by exact permalink.""" - query = SearchQuery(permalink_pattern=permalink) + query = SearchQuery(permalink=permalink) return await self.search_repository.search(query) async def find_connected( diff --git a/tests/services/test_search_service.py b/tests/services/test_search_service.py index 472f6710..9fd30382 100644 --- a/tests/services/test_search_service.py +++ b/tests/services/test_search_service.py @@ -150,14 +150,14 @@ async def test_path_pattern_search(indexed_search): """Test path pattern matching in permalinks.""" # Test exact path match results = await indexed_search.search( - SearchQuery(permalink_pattern="components/core-service") + SearchQuery(permalink="components/core-service") ) assert len(results) == 1 assert results[0].permalink == "components/core-service" # Test prefix matching with * results = await indexed_search.search( - SearchQuery(permalink_pattern="components/*") + SearchQuery(permalink="components/*") ) assert len(results) == 2 # Should match both core-service and auth/service permalinks = {r.permalink for r in results} @@ -166,7 +166,7 @@ async def test_path_pattern_search(indexed_search): # Test nested path matching results = await indexed_search.search( - SearchQuery(permalink_pattern="components/*/service") + SearchQuery(permalink="components/*/service") ) permalinks = [r.permalink for r in results] assert len(permalinks) == 2 @@ -175,7 +175,7 @@ async def test_path_pattern_search(indexed_search): # Test top-level pattern results = await indexed_search.search( - SearchQuery(permalink_pattern="*/service") + SearchQuery(permalink="*/service") ) permalinks = [r.permalink for r in results] assert len(permalinks) == 3