Skip to content

Commit 52a0bf4

Browse files
authored
RI-7452: use unlink instead of delete for bulk delete (#5064)
* RI-7452: use unlink instead of delete for bulk delete * add unlink runner
1 parent 6c10f4a commit 52a0bf4

File tree

8 files changed

+80
-2
lines changed

8 files changed

+80
-2
lines changed

redisinsight/api/src/modules/bulk-actions/constants/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export enum BulkActionsServerEvents {
77
export enum BulkActionType {
88
Delete = 'delete',
99
Upload = 'upload',
10+
Unlink = 'unlink',
1011
}
1112

1213
export enum BulkActionStatus {
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import {
2+
mockSocket,
3+
mockBulkActionsAnalytics,
4+
mockCreateBulkActionDto,
5+
mockStandaloneRedisClient,
6+
} from 'src/__mocks__';
7+
import { UnlinkBulkActionSimpleRunner } from 'src/modules/bulk-actions/models/runners/simple/unlink.bulk-action.simple.runner';
8+
import { BulkAction } from 'src/modules/bulk-actions/models/bulk-action';
9+
import { RedisDataType } from 'src/modules/browser/keys/dto';
10+
import { BulkActionFilter } from 'src/modules/bulk-actions/models/bulk-action-filter';
11+
12+
const mockBulkActionFilter = Object.assign(new BulkActionFilter(), {
13+
count: 10_000,
14+
match: '*',
15+
type: RedisDataType.Set,
16+
});
17+
18+
const bulkAction = new BulkAction(
19+
mockCreateBulkActionDto.id,
20+
mockCreateBulkActionDto.databaseId,
21+
mockCreateBulkActionDto.type,
22+
mockBulkActionFilter,
23+
mockSocket,
24+
mockBulkActionsAnalytics as any,
25+
);
26+
27+
const mockKey = 'mockedKey';
28+
const mockKeyBuffer = Buffer.from(mockKey);
29+
30+
describe('UnlinkBulkActionSimpleRunner', () => {
31+
const client = mockStandaloneRedisClient;
32+
let unlinkRunner: UnlinkBulkActionSimpleRunner;
33+
34+
beforeEach(() => {
35+
unlinkRunner = new UnlinkBulkActionSimpleRunner(bulkAction, client);
36+
});
37+
38+
it('prepareCommands 3 commands', () => {
39+
const commands = unlinkRunner.prepareCommands([
40+
mockKeyBuffer,
41+
mockKeyBuffer,
42+
mockKeyBuffer,
43+
]);
44+
expect(commands).toEqual([
45+
['unlink', mockKeyBuffer],
46+
['unlink', mockKeyBuffer],
47+
['unlink', mockKeyBuffer],
48+
]);
49+
});
50+
51+
it('prepareCommands 0 commands', () => {
52+
const commands = unlinkRunner.prepareCommands([]);
53+
expect(commands).toEqual([]);
54+
});
55+
});
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { AbstractBulkActionSimpleRunner } from 'src/modules/bulk-actions/models/runners/simple/abstract.bulk-action.simple.runner';
2+
import { RedisClientCommand } from 'src/modules/redis/client';
3+
4+
export class UnlinkBulkActionSimpleRunner extends AbstractBulkActionSimpleRunner {
5+
prepareCommands(keys: Buffer[]): RedisClientCommand[] {
6+
return keys.map((key) => ['unlink', key]);
7+
}
8+
}

redisinsight/api/src/modules/bulk-actions/providers/bulk-actions.provider.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,16 @@ describe('BulkActionsProvider', () => {
9191

9292
expect(service['bulkActions'].size).toEqual(2);
9393
});
94+
it('should support unlink type', async () => {
95+
const bulkAction = await service.create(
96+
mockSessionMetadata,
97+
{ ...mockCreateBulkActionDto, type: BulkActionType.Unlink },
98+
mockSocket1,
99+
);
100+
101+
expect(bulkAction).toBeInstanceOf(BulkAction);
102+
expect(service['bulkActions'].size).toEqual(1);
103+
});
94104
it('should fail when unsupported runner class', async () => {
95105
try {
96106
await service.create(

redisinsight/api/src/modules/bulk-actions/providers/bulk-actions.provider.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
BulkActionType,
1313
} from 'src/modules/bulk-actions/constants';
1414
import { DeleteBulkActionSimpleRunner } from 'src/modules/bulk-actions/models/runners/simple/delete.bulk-action.simple.runner';
15+
import { UnlinkBulkActionSimpleRunner } from 'src/modules/bulk-actions/models/runners/simple/unlink.bulk-action.simple.runner';
1516
import { BulkActionsAnalytics } from 'src/modules/bulk-actions/bulk-actions.analytics';
1617
import { ClientContext, SessionMetadata } from 'src/common/models';
1718
import { DatabaseClientFactory } from 'src/modules/database/providers/database.client.factory';
@@ -80,6 +81,8 @@ export class BulkActionsProvider {
8081
switch (dto.type) {
8182
case BulkActionType.Delete:
8283
return DeleteBulkActionSimpleRunner;
84+
case BulkActionType.Unlink:
85+
return UnlinkBulkActionSimpleRunner;
8386
default:
8487
throw new BadRequestException(
8588
`Unsupported type: ${dto.type} for Bulk Actions`,

redisinsight/ui/src/components/bulk-actions-config/BulkActionsConfig.spec.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ const deletingMock = [
6767
id: '123',
6868
databaseId: '1',
6969
db: 1,
70-
type: BulkActionsType.Delete,
70+
type: BulkActionsType.Unlink,
7171
filter: {
7272
type: null,
7373
match: '*',

redisinsight/ui/src/components/bulk-actions-config/BulkActionsConfig.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ const BulkActionsConfig = () => {
9696
id,
9797
databaseId: instanceId,
9898
db: db || 0,
99-
type: BulkActionsType.Delete,
99+
type: BulkActionsType.Unlink,
100100
filter: {
101101
type: filter,
102102
match: search || '*',

redisinsight/ui/src/constants/bulkActions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export enum BulkActionsServerEvent {
99
export enum BulkActionsType {
1010
Delete = 'delete',
1111
Upload = 'upload',
12+
Unlink = 'unlink',
1213
}
1314

1415
export enum BulkActionsStatus {

0 commit comments

Comments
 (0)