From 45957225cdac2422daec79e20dc65d688c00457e Mon Sep 17 00:00:00 2001 From: Asuka Minato Date: Thu, 9 Jul 2026 18:14:52 +0900 Subject: [PATCH] chore: batch example #38419 (#38474) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- api/services/summary_index_service.py | 13 ++-- .../services/test_summary_index_service.py | 65 ++++++++++++------- 2 files changed, 48 insertions(+), 30 deletions(-) diff --git a/api/services/summary_index_service.py b/api/services/summary_index_service.py index a960b219334..3e8c0ae8340 100644 --- a/api/services/summary_index_service.py +++ b/api/services/summary_index_service.py @@ -6,7 +6,7 @@ import uuid from datetime import UTC, datetime from typing import TypedDict, cast -from sqlalchemy import select +from sqlalchemy import select, update from sqlalchemy.orm import Session from core.db.session_factory import session_factory @@ -912,12 +912,11 @@ class SummaryIndexService: # Disable summary records (don't delete) now = naive_utc_now() - for summary in summaries: - summary.enabled = False - summary.disabled_at = now - summary.disabled_by = disabled_by - session.add(summary) - + session.execute( + update(DocumentSegmentSummary) + .where(DocumentSegmentSummary.id.in_(s.id for s in summaries)) + .values(enabled=False, disabled_at=now, disabled_by=disabled_by) + ) session.commit() logger.info("Disabled %s summary records for dataset %s", len(summaries), dataset.id) diff --git a/api/tests/unit_tests/services/test_summary_index_service.py b/api/tests/unit_tests/services/test_summary_index_service.py index 7ece6204ce3..d9482fdbe42 100644 --- a/api/tests/unit_tests/services/test_summary_index_service.py +++ b/api/tests/unit_tests/services/test_summary_index_service.py @@ -10,9 +10,12 @@ from types import SimpleNamespace from unittest.mock import MagicMock import pytest +from sqlalchemy import create_engine, select +from sqlalchemy.orm import sessionmaker import services.summary_index_service as summary_module from core.rag.index_processor.constant.index_type import IndexStructureType, IndexTechniqueType +from models.dataset import DocumentSegmentSummary from models.enums import SegmentStatus, SummaryStatus from services.summary_index_service import SummaryIndexService @@ -653,32 +656,48 @@ def test_generate_summaries_for_document_applies_segment_ids_and_only_parent_chu session.scalars.assert_called() -def test_disable_summaries_for_segments_handles_vector_delete_error(monkeypatch: pytest.MonkeyPatch) -> None: - dataset = _dataset() - summary1 = _summary_record(summary_content="s", node_id="n1") - summary2 = _summary_record(summary_content="s", node_id=None) +def test_disable_summaries_for_segments_updates_sqlite_records() -> None: + dataset = SimpleNamespace(id="dataset-1", indexing_technique=IndexTechniqueType.ECONOMY) + engine = create_engine("sqlite+pysqlite:///:memory:") + DocumentSegmentSummary.__table__.create(engine) + summary_rows = [ + { + "id": "sum-1", + "dataset_id": dataset.id, + "document_id": "doc-1", + "chunk_id": "seg-1", + "summary_content": "s", + "summary_index_node_id": "n1", + "status": SummaryStatus.COMPLETED, + "enabled": True, + }, + { + "id": "sum-2", + "dataset_id": dataset.id, + "document_id": "doc-1", + "chunk_id": "seg-1", + "summary_content": "s", + "summary_index_node_id": None, + "status": SummaryStatus.COMPLETED, + "enabled": True, + }, + ] + with engine.begin() as connection: + connection.execute(DocumentSegmentSummary.__table__.insert(), summary_rows) - session = MagicMock() - session.scalars.return_value.all.return_value = [summary1, summary2] - - monkeypatch.setattr( - summary_module, - "session_factory", - SimpleNamespace(create_session=MagicMock(return_value=_SessionContext(session))), - ) - monkeypatch.setattr( - summary_module, - "Vector", - MagicMock(return_value=MagicMock(delete_by_ids=MagicMock(side_effect=RuntimeError("boom")))), - ) - monkeypatch.setitem( - sys.modules, "libs.datetime_utils", SimpleNamespace(naive_utc_now=MagicMock(return_value=datetime(2024, 1, 1))) - ) + session_maker = sessionmaker(bind=engine, expire_on_commit=False) + summary_module.session_factory.configure(engine, expire_on_commit=False) SummaryIndexService.disable_summaries_for_segments(dataset, segment_ids=["seg-1"], disabled_by="u") - assert summary1.enabled is False - assert summary1.disabled_by == "u" - session.commit.assert_called_once() + + with session_maker() as session: + summaries = session.scalars(select(DocumentSegmentSummary).order_by(DocumentSegmentSummary.id)).all() + + assert [(summary.id, summary.enabled, summary.disabled_by) for summary in summaries] == [ + ("sum-1", False, "u"), + ("sum-2", False, "u"), + ] + assert all(summary.disabled_at is not None for summary in summaries) def test_disable_summaries_for_segments_no_summaries_noop(monkeypatch: pytest.MonkeyPatch) -> None: