Class: HotwireClub::MCP::Database::Adapter
- Inherits:
-
Object
- Object
- HotwireClub::MCP::Database::Adapter
- Defined in:
- lib/hotwire_club/mcp/database/adapter.rb
Overview
Database Adapter providing MCP-facing API
This adapter wraps the ROM repositories and provides a clean interface for searching chunks, listing documents, categories, and tags.
Instance Method Summary collapse
-
#get_chunk(chunk_id:) ⇒ Hash?
Get a single chunk by ID.
-
#initialize(*args, **kwargs) ⇒ Adapter
constructor
Initialize the adapter with a ROM container or database path.
-
#list_categories ⇒ Array<String>
List all unique categories from documents.
-
#list_docs(category: nil, tags: nil, limit: 20, offset: 0) ⇒ Array
List documents with optional filters.
-
#list_tags ⇒ Array<String>
List all tags.
-
#related_docs(doc_id: nil, chunk_id: nil, limit: 5) ⇒ Array
Find related documents based on category and tag overlap.
-
#search(query:, category: nil, tags: nil, limit: 8) ⇒ Array<Hash>
Search chunks using full-text search with optional filters.
Constructor Details
#initialize(*args, **kwargs) ⇒ Adapter
Initialize the adapter with a ROM container or database path
Supports both positional and keyword arguments for backward compatibility:
- Adapter.new(container) - positional container
- Adapter.new(container: container) - keyword container
- Adapter.new(db_path: "path") - keyword db_path
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/hotwire_club/mcp/database/adapter.rb', line 23 def initialize(*args, **kwargs) # Support both positional and keyword arguments for backward compatibility if args.first.respond_to?(:relations) # Positional container argument (backward compatible) @container = args.first elsif kwargs[:container] # Keyword container argument @container = kwargs[:container] elsif kwargs[:db_path] # Keyword db_path argument @container = HotwireClub::MCP::Database.container(kwargs[:db_path]) else raise ArgumentError, "Either container or db_path: must be provided" end @chunks_repo = ChunksRepo.new(@container) @docs_repo = DocsRepo.new(@container) = TagsRepo.new(@container) end |
Instance Method Details
#get_chunk(chunk_id:) ⇒ Hash?
Get a single chunk by ID
73 74 75 76 77 78 79 80 |
# File 'lib/hotwire_club/mcp/database/adapter.rb', line 73 def get_chunk(chunk_id:) return nil if chunk_id.nil? || chunk_id.to_s.empty? chunk = @chunks_repo.by_id(chunk_id) return nil unless chunk format_chunk_result(chunk) end |
#list_categories ⇒ Array<String>
List all unique categories from documents
85 86 87 |
# File 'lib/hotwire_club/mcp/database/adapter.rb', line 85 def list_categories @docs_repo.categories end |
#list_docs(category: nil, tags: nil, limit: 20, offset: 0) ⇒ Array
List documents with optional filters
103 104 105 106 |
# File 'lib/hotwire_club/mcp/database/adapter.rb', line 103 def list_docs(category: nil, tags: nil, limit: 20, offset: 0) = Array().compact.reject(&:empty?) @docs_repo.list(category: category, tags: , limit: limit, offset: offset) end |
#list_tags ⇒ Array<String>
List all tags
92 93 94 |
# File 'lib/hotwire_club/mcp/database/adapter.rb', line 92 def @container.relations[:tags].select(:name).map { |row| row[:name] || row.name } end |
#related_docs(doc_id: nil, chunk_id: nil, limit: 5) ⇒ Array
Find related documents based on category and tag overlap
114 115 116 117 118 |
# File 'lib/hotwire_club/mcp/database/adapter.rb', line 114 def (doc_id: nil, chunk_id: nil, limit: 5) # Prioritize doc_id over chunk_id if both are provided effective_chunk_id = doc_id ? nil : chunk_id @docs_repo.(doc_id: doc_id, chunk_id: effective_chunk_id, limit: limit) end |
#search(query:, category: nil, tags: nil, limit: 8) ⇒ Array<Hash>
Search chunks using full-text search with optional filters
58 59 60 61 62 63 64 65 66 67 |
# File 'lib/hotwire_club/mcp/database/adapter.rb', line 58 def search(query:, category: nil, tags: nil, limit: 8) query = query.to_s.strip return [] if query.empty? = Array().compact.reject(&:empty?) escaped_query = escape_fts5_query(query) dataset = build_search_dataset(escaped_query, category, , limit) dataset.to_a.map { |row| format_search_result(row) } end |