search_v2.py•6.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()