From e7380865d86e3744622f777b6c26fade704ece82 Mon Sep 17 00:00:00 2001 From: WH-2099 Date: Sat, 1 Aug 2026 01:39:40 +0000 Subject: [PATCH] fix(api): scope segment batch deletes (#38217) --- api/services/dataset_service.py | 9 ++++++++- .../unit_tests/services/test_dataset_service_segment.py | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/api/services/dataset_service.py b/api/services/dataset_service.py index 27650e68101..2ac58e15911 100644 --- a/api/services/dataset_service.py +++ b/api/services/dataset_service.py @@ -3900,7 +3900,14 @@ class SegmentService: session.add(document) # Delete database records - session.execute(delete(DocumentSegment).where(DocumentSegment.id.in_(segment_ids))) + session.execute( + delete(DocumentSegment).where( + DocumentSegment.id.in_(segment_db_ids), + DocumentSegment.dataset_id == dataset.id, + DocumentSegment.document_id == document.id, + DocumentSegment.tenant_id == current_user.current_tenant_id, + ) + ) session.commit() @classmethod diff --git a/api/tests/unit_tests/services/test_dataset_service_segment.py b/api/tests/unit_tests/services/test_dataset_service_segment.py index 3e229d9a787..2e2ad0aa774 100644 --- a/api/tests/unit_tests/services/test_dataset_service_segment.py +++ b/api/tests/unit_tests/services/test_dataset_service_segment.py @@ -858,7 +858,7 @@ class TestSegmentServiceMutations: # scalars() for child_node_ids session.scalars.return_value.all.return_value = ["child-1"] - SegmentService.delete_segments(["segment-1", "segment-2"], document, dataset, session) + SegmentService.delete_segments(["segment-1", "segment-2", "foreign-segment"], document, dataset, session) assert document.word_count == 0 session.add.assert_called_once_with(document) @@ -869,6 +869,13 @@ class TestSegmentServiceMutations: ["segment-1", "segment-2"], ["child-1"], ) + delete_stmt = session.execute.call_args_list[1].args[0] + delete_sql = str(delete_stmt.compile(compile_kwargs={"literal_binds": True})) + assert "document_segments.id IN ('segment-1', 'segment-2')" in delete_sql + assert "document_segments.dataset_id = 'dataset-1'" in delete_sql + assert "document_segments.document_id = 'doc-1'" in delete_sql + assert "document_segments.tenant_id = 'tenant-1'" in delete_sql + assert "foreign-segment" not in delete_sql session.commit.assert_called() def test_update_segments_status_enables_only_segments_without_indexing_cache(self):