File size: 834 Bytes
ba550a5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | """Shared contract for query executors."""
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from sqlalchemy.ext.asyncio import AsyncSession
from src.rag.base import RetrievalResult
@dataclass
class QueryResult:
source_type: str # "database" or "document"
source_id: str # database_client_id or document_id
table_or_file: str
columns: list[str]
rows: list[dict]
row_count: int
metadata: dict = field(default_factory=dict)
# metadata should include "column_types": {"col_name": "dtype"} when available
class BaseExecutor(ABC):
@abstractmethod
async def execute(
self,
results: list[RetrievalResult],
user_id: str,
db: AsyncSession,
question: str,
limit: int = 100,
) -> list[QueryResult]: ...
|