74 lines
2.2 KiB
Python
74 lines
2.2 KiB
Python
"""记忆数据访问。"""
|
|
|
|
from sqlalchemy import func, select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.models.memory import Memory
|
|
|
|
|
|
async def get_memory(session: AsyncSession, memory_id: str) -> Memory | None:
|
|
return await session.get(Memory, memory_id)
|
|
|
|
|
|
async def list_memories(
|
|
session: AsyncSession,
|
|
character_id: str,
|
|
*,
|
|
memory_type: str | None = None,
|
|
source: str | None = None,
|
|
page: int,
|
|
page_size: int,
|
|
active_only: bool = True,
|
|
) -> tuple[list[Memory], int]:
|
|
conditions = [Memory.character_id == character_id]
|
|
if active_only:
|
|
conditions.append(Memory.status == "active")
|
|
conditions.append(Memory.deleted_at.is_(None))
|
|
if memory_type is not None:
|
|
conditions.append(Memory.type == memory_type)
|
|
if source is not None:
|
|
conditions.append(Memory.source == source)
|
|
total_result = await session.execute(
|
|
select(func.count()).select_from(Memory).where(*conditions)
|
|
)
|
|
total = int(total_result.scalar_one())
|
|
result = await session.execute(
|
|
select(Memory)
|
|
.where(*conditions)
|
|
.order_by(Memory.importance.desc(), Memory.updated_at.desc())
|
|
.offset((page - 1) * page_size)
|
|
.limit(page_size)
|
|
)
|
|
return list(result.scalars().all()), total
|
|
|
|
|
|
async def list_injectable_memories(
|
|
session: AsyncSession, character_id: str, *, limit: int
|
|
) -> list[Memory]:
|
|
result = await session.execute(
|
|
select(Memory)
|
|
.where(
|
|
Memory.character_id == character_id,
|
|
Memory.status == "active",
|
|
Memory.deleted_at.is_(None),
|
|
)
|
|
.order_by(Memory.importance.desc(), Memory.updated_at.desc())
|
|
.limit(limit)
|
|
)
|
|
return list(result.scalars().all())
|
|
|
|
|
|
async def get_memories_by_ids(
|
|
session: AsyncSession, memory_ids: list[str]
|
|
) -> list[Memory]:
|
|
"""按 ID 列表批量获取记忆(按重要性降序排序,而非 ID 传入顺序)。"""
|
|
result = await session.execute(
|
|
select(Memory).where(
|
|
Memory.id.in_(memory_ids),
|
|
Memory.status == "active",
|
|
Memory.deleted_at.is_(None),
|
|
)
|
|
.order_by(Memory.importance.desc(), Memory.updated_at.desc())
|
|
)
|
|
return list(result.scalars().all())
|