Split Purger into single-row and batch patterns
- Dominant language
- Python
- Stars
- 670
- Forks
- 183
- Avg merge
- 17h 7m
- Merged PRs (30d)
- 358
Description
## Overview
Refactor Purger pattern to separate single-row and batch deletion operations for consistency with Updater/BatchUpdater pattern.
## Changes
### Current State
- `Purger`: Batch delete with subquery and batch_size
- `PurgeTarget`: Defines pk_column and build_subquery
- `execute_purger`: Executes batched deletion
### Target State
**Single-row deletion (Purger)**:
```python
class PurgerSpec(ABC, Generic[TRow]):
@property
def row_class(self) -> type[TRow]: ...
@dataclass
class Purger(Generic[TRow]):
spec: PurgerSpec[TRow]
pk_value: UUID | str | int
@dataclass
class PurgerResult(Generic[TRow]):
row: TRow # Deleted row via RETURNING
async def execute_purger(...) -> PurgerResult[TRow] | None
```
**Batch deletion (BatchPurger)**:
```python
class BatchPurgerSpec(ABC): # Current PurgeTarget
@property
def pk_column(self) -> sa.Column: ...
def build_subquery(self) -> sa.sql.Select: ...
@dataclass
class BatchPurger: # Current Purger
spec: BatchPurgerSpec
batch_size: int = 1000
@dataclass
class BatchPurgerResult:
deleted_count: int
async def execute_batch_purger(...) -> BatchPurgerResult
```
## Tasks
- [ ] Create PurgerSpec and Purger for single-row delete by PK
- [ ] Create PurgerResult that returns deleted row
- [ ] Implement execute_purger for single-row deletion
- [ ] Rename current PurgeTarget to BatchPurgerSpec
- [ ] Rename current Purger to BatchPurger
- [ ] Rename current PurgerResult to BatchPurgerResult
- [ ] Rename execute_purger to execute_batch_purger
- [ ] Update **init**.py exports
- [ ] Add/update tests
JIRA Issue: BA-3350
Contributor guide
Assessment
This issue has not been assessed yet.