Skip to main content
Glama
search_v2.py6.38 kB
"""Search functions for PrestaShop documentation (v2 - all doc types).""" import json import sqlite3 from typing import Dict, List, Optional from .config import DB_PATH def search_documentation( query: str, doc_type: Optional[str] = None, category: Optional[str] = None, limit: int = 10 ) -> List[Dict]: """Search all PrestaShop documentation using FTS5. Args: query: Search query doc_type: Filter by document type (hook, guide, tutorial, api, etc.) category: Filter by category (basics, development, modules, etc.) limit: Maximum number of results Returns: List of matching documents with metadata """ conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() # Build FTS5 query fts_query = query.replace("'", "''") # Escape quotes # Build WHERE clause for filters filters = [] params = [fts_query] if doc_type: filters.append("d.doc_type = ?") params.append(doc_type) if category: filters.append("d.category = ?") params.append(category) where_clause = "" if filters: where_clause = f" AND {' AND '.join(filters)}" # Search query query_sql = f""" SELECT d.name, d.title, d.category, d.subcategory, d.doc_type, d.path, d.origin, d.location, d.content, d.metadata, d.version, snippet(prestashop_docs_fts, -1, '<mark>', '</mark>', '...', 32) as snippet FROM prestashop_docs d JOIN prestashop_docs_fts fts ON d.id = fts.rowid WHERE prestashop_docs_fts MATCH ?{where_clause} ORDER BY rank LIMIT ? """ params.append(limit) try: cursor.execute(query_sql, params) results = [] for row in cursor.fetchall(): results.append({ "name": row[0], "title": row[1], "category": row[2], "subcategory": row[3], "doc_type": row[4], "path": row[5], "origin": row[6], "location": row[7], "content": row[8], "metadata": json.loads(row[9]) if row[9] else {}, "version": row[10], "snippet": row[11] }) return results finally: conn.close() def get_document(path: str) -> Optional[Dict]: """Get a specific document by path. Args: path: Document path (e.g., 'basics/installation/system-requirements.md') Returns: Document data or None if not found """ conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() try: cursor.execute(""" SELECT name, title, category, subcategory, doc_type, path, origin, location, content, metadata, version FROM prestashop_docs WHERE path = ? """, (path,)) row = cursor.fetchone() if not row: return None return { "name": row[0], "title": row[1], "category": row[2], "subcategory": row[3], "doc_type": row[4], "path": row[5], "origin": row[6], "location": row[7], "content": row[8], "metadata": json.loads(row[9]) if row[9] else {}, "version": row[10] } finally: conn.close() def list_documents( doc_type: Optional[str] = None, category: Optional[str] = None, limit: int = 50 ) -> List[Dict]: """List documents with optional filters. Args: doc_type: Filter by document type category: Filter by category limit: Maximum number of results Returns: List of documents (summary only) """ conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() # Build WHERE clause filters = [] params = [] if doc_type: filters.append("doc_type = ?") params.append(doc_type) if category: filters.append("category = ?") params.append(category) where_clause = "" if filters: where_clause = f"WHERE {' AND '.join(filters)}" query_sql = f""" SELECT name, title, category, subcategory, doc_type, path FROM prestashop_docs {where_clause} ORDER BY category, subcategory, title LIMIT ? """ params.append(limit) try: cursor.execute(query_sql, params) results = [] for row in cursor.fetchall(): results.append({ "name": row[0], "title": row[1], "category": row[2], "subcategory": row[3], "doc_type": row[4], "path": row[5] }) return results finally: conn.close() def get_stats() -> Dict: """Get documentation statistics. Returns: Statistics about indexed documentation """ conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() try: # Total documents cursor.execute("SELECT COUNT(*) FROM prestashop_docs") total_docs = cursor.fetchone()[0] # By document type cursor.execute(""" SELECT doc_type, COUNT(*) as count FROM prestashop_docs GROUP BY doc_type ORDER BY count DESC """) by_type = {row[0]: row[1] for row in cursor.fetchall()} # By category cursor.execute(""" SELECT category, COUNT(*) as count FROM prestashop_docs GROUP BY category ORDER BY count DESC """) by_category = {row[0]: row[1] for row in cursor.fetchall()} # Domain references cursor.execute("SELECT COUNT(*) FROM domain_references") domain_refs = cursor.fetchone()[0] # Components cursor.execute("SELECT COUNT(*) FROM components") components = cursor.fetchone()[0] return { "total_documents": total_docs, "by_type": by_type, "by_category": by_category, "domain_references": domain_refs, "components": components } finally: conn.close()

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/florinel-chis/prestashop-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server