lablup / lablup/backend.ai

Split Purger into single-row and batch patterns

Open
#7,281 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.