From 678ffd0bfec0ada476aa35d405278c59dc047271 Mon Sep 17 00:00:00 2001 From: Siddhant Sharma Date: Tue, 31 Mar 2026 10:13:16 +0530 Subject: [PATCH] enh: use sqlalchemy offset and limit to fetch messages --- CHANGELOG.md | 2 +- src/memorytext/services/message_service.py | 28 ++++++++++------------ src/memorytext/views/chat_view.py | 6 ++--- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e07e9a3..5a2b576 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ ### Changed - +1. Use SQLAlchemy offset and limit to fetch only required messages. ### Fixed diff --git a/src/memorytext/services/message_service.py b/src/memorytext/services/message_service.py index c7ed925..4fe0ed0 100644 --- a/src/memorytext/services/message_service.py +++ b/src/memorytext/services/message_service.py @@ -1,6 +1,6 @@ from __future__ import annotations from sqlalchemy.orm import Session -from sqlalchemy import select +from sqlalchemy import select, func from memorytext.models.core import Message from memorytext.db import get_db @@ -10,23 +10,19 @@ def get_messages( conversation_id: int | None, limit: int = 10, offset: int = 0 ) -> tuple[list, int]: engine = get_db() - count = limit + offset with Session(engine) as session: - stmt = ( + stmt = select(func.count(Message.id)).where( + Message.conversation_id == conversation_id + ) + total = session.scalar(stmt) or 0 + + stmt_2 = ( select(Message) .where(Message.conversation_id == conversation_id) .order_by(Message.timestamp.asc()) + .limit(limit) + .offset(offset) ) - message_list = list(session.scalars(stmt).fetchall()) - if message_list is not None: - total = len(message_list) - else: - total = 0 - if message_list is not None and offset >= total: - return [], total - elif message_list is not None and count >= total: - return message_list[offset:], total - elif message_list is not None: - return message_list[offset:count], total - else: - return [], total + message_list = list(session.scalars(stmt_2).fetchall()) + session.expunge_all() + return message_list, total diff --git a/src/memorytext/views/chat_view.py b/src/memorytext/views/chat_view.py index 308032b..ca6b448 100644 --- a/src/memorytext/views/chat_view.py +++ b/src/memorytext/views/chat_view.py @@ -6,8 +6,7 @@ from memorytext.models.message_list import MessageList from memorytext.services import message_service -from memorytext.delegates.message_list import MessageDelegate - +import memorytext.delegates.message_list as msg_delegate if TYPE_CHECKING: from collections.abc import Callable @@ -23,7 +22,8 @@ def __init__(self): self.setSpacing(10) self.message_model = MessageList(None, message_service.get_messages) self.setModel(self.message_model) - self.setItemDelegate(MessageDelegate()) + self.delegate = msg_delegate.MessageDelegate(self) + self.setItemDelegate(self.delegate) self.setWordWrap(True) self.setUniformItemSizes(False) self.setFocusPolicy(Qt.NoFocus) # pyright: ignore[reportAttributeAccessIssue]