Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
5cf123d
RI-3710 create redisearch index + list indexes (initial implementation)
Oct 24, 2022
9934410
#RI-3710 fix enums
Oct 24, 2022
6e1c530
#RI-3708 change scanned calculation
Oct 24, 2022
ae2609f
Merge pull request #1318 from RedisInsight/be/feature/RI-3710_create_…
Oct 24, 2022
1251dcb
#RI-3707 - created redisearch slice in the store
egor-zalenski Oct 25, 2022
60f563d
Merge pull request #1325 from RedisInsight/fe/feature/RI-3707_Redisea…
egor-zalenski Oct 25, 2022
ce436c2
#RI-3682 resolved FE team comments
Oct 25, 2022
428deff
Merge pull request #1327 from RedisInsight/be/feature/RI-3710_create_…
Oct 25, 2022
a9c8a5a
#RI-3709 - add initial implementation of create redisearch index
rsergeenko Oct 25, 2022
e4290e6
Merge remote-tracking branch 'origin/feature/RI-3698_create-redisearc…
egor-zalenski Oct 26, 2022
fa2b959
Merge branch 'main' into fe/feature/RI-3707_Redisearch_in_Browser
egor-zalenski Oct 27, 2022
1211f35
fix duplication in the indexes list + ignore "MOVED" errors for OSS C…
Oct 28, 2022
79825b8
Merge pull request #1340 from RedisInsight/be/feature/RI-2831_browser…
Oct 28, 2022
fa86a1a
Merge branch 'feature/RI-2831_browser-redisearch' into feature/RI-369…
rsergeenko Oct 31, 2022
536a44b
Merge pull request #1329 from RedisInsight/feature/RI-3698_create-red…
rsergeenko Oct 31, 2022
9ea14ba
#2831 - BE redisearch for browser (final with all tests)
Oct 31, 2022
d36f4f3
Merge pull request #1341 from RedisInsight/be/feature/RI-2831_browser…
Oct 31, 2022
20a2e87
Merge branch 'feature/RI-2831_browser-redisearch' into fe/feature/RI-…
egor-zalenski Oct 31, 2022
6d17520
Merge branch 'main' into fe/feature/RI-3707_Redisearch_in_Browser
egor-zalenski Oct 31, 2022
7ee9ebb
#RI-3707 - Redisearch in Browser
egor-zalenski Oct 31, 2022
6c51ee5
Merge branch 'main' into feature/RI-2831_browser-redisearch
egor-zalenski Oct 31, 2022
8e9e71a
Merge branch 'feature/RI-2831_browser-redisearch' into fe/feature/RI-…
egor-zalenski Oct 31, 2022
c22ecd7
Merge pull request #1345 from RedisInsight/fe/feature/RI-3707_Redisea…
egor-zalenski Nov 1, 2022
2c9f581
#RI-3698 - create index functionality
rsergeenko Nov 1, 2022
793ca67
Merge branch 'feature/RI-2831_browser-redisearch' into feature/RI-369…
rsergeenko Nov 1, 2022
94ac533
#RI-3698 - fix some issues, add tests
rsergeenko Nov 1, 2022
f028ea0
Merge pull request #1346 from RedisInsight/feature/RI-3698_create-red…
rsergeenko Nov 1, 2022
683f437
#RI-3755 - fix heights
rsergeenko Nov 2, 2022
b42edc3
#RI-3753 - Keys are not displayed correctly in Tree View
egor-zalenski Nov 2, 2022
9833223
Merge pull request #1349 from RedisInsight/fe/bugfix/RI-3753_Wrong_ke…
egor-zalenski Nov 2, 2022
99119f9
#RI-3698 - add loading state
rsergeenko Nov 2, 2022
43a7af9
Merge pull request #1348 from RedisInsight/feature/RI-3698_create-red…
rsergeenko Nov 2, 2022
a59952e
#RI-3756 - Scan more button is displayed after switching from Browser
egor-zalenski Nov 2, 2022
ab912c1
#RI-3756 - rename state
egor-zalenski Nov 2, 2022
16be7c4
Merge pull request #1352 from RedisInsight/fe/feature/bugfix
egor-zalenski Nov 2, 2022
3556bba
add tests for redisearch
vlad-dargel Nov 2, 2022
7a285f8
added test for scanned keys value
vlad-dargel Nov 3, 2022
40e94c0
add last tests
vlad-dargel Nov 3, 2022
647f61b
#RI-3756 - Scan more button is displayed after switching from Browser
egor-zalenski Nov 3, 2022
0a46e7d
Merge pull request #1358 from RedisInsight/fe/feature/bugfix
egor-zalenski Nov 3, 2022
9e48616
added check for multiple search parameters
vlad-dargel Nov 3, 2022
a7cc891
update for failed test
vlad-dargel Nov 3, 2022
4fd3d84
#RI-3764 - List of keys not refreshed after deleting key in redisearc…
egor-zalenski Nov 3, 2022
01865ad
#RI-3764 - fix tests
egor-zalenski Nov 3, 2022
8e19e62
#RI-3764 - fix tests
egor-zalenski Nov 3, 2022
b322a95
#RI-3764 - fix tests
egor-zalenski Nov 3, 2022
bfc71b8
Merge pull request #1361 from RedisInsight/fe/feature/bugfix
egor-zalenski Nov 3, 2022
07e0c70
Merge pull request #1356 from RedisInsight/e2e/feature/RI-3596-add-se…
vlad-dargel Nov 4, 2022
374f3b0
#RI-3771 - Incorrect message
egor-zalenski Nov 4, 2022
1cec28a
Merge pull request #1363 from RedisInsight/fe/feature/bugfix
egor-zalenski Nov 4, 2022
746736a
#RI-3716 - add telemetry for search
rsergeenko Nov 4, 2022
2a0f17c
Merge pull request #1364 from RedisInsight/fe/feature/RI-3716_telemet…
rsergeenko Nov 4, 2022
2a048fd
create index in Search Mode tests added
Nov 4, 2022
35562ca
fix comments
Nov 4, 2022
110d706
Merge pull request #1367 from RedisInsight/e2e/feature/RI-3760_create…
AlenaSY Nov 4, 2022
a1023df
Merge branch 'main' into feature/RI-2831_browser-redisearch
egor-zalenski Nov 4, 2022
fe49bb7
fix merge conflict
egor-zalenski Nov 4, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions redisinsight/api/src/__mocks__/errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ export const mockRedisNoPermError: ReplyError = {
message: 'NOPERM this user has no permissions.',
};

export const mockRedisUnknownIndexName: ReplyError = {
name: 'ReplyError',
command: 'FT.INFO',
message: 'Unknown Index name',
};

export const mockRedisWrongNumberOfArgumentsError: ReplyError = {
name: 'ReplyError',
command: 'GET',
Expand Down
1 change: 1 addition & 0 deletions redisinsight/api/src/constants/error-messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export default {
MASTER_GROUP_NOT_EXIST: "Master group with this name doesn't exist",

KEY_NAME_EXIST: 'This key name is already in use.',
REDISEARCH_INDEX_EXIST: 'This index name is already in use.',
KEY_NOT_EXIST: 'Key with this name does not exist.',
PATH_NOT_EXISTS: () => 'There is no such path.',
INDEX_OUT_OF_RANGE: () => 'Index is out of range.',
Expand Down
4 changes: 4 additions & 0 deletions redisinsight/api/src/modules/browser/browser.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import { ConsumerGroupController } from 'src/modules/browser/controllers/stream/
import { ConsumerGroupService } from 'src/modules/browser/services/stream/consumer-group.service';
import { ConsumerController } from 'src/modules/browser/controllers/stream/consumer.controller';
import { ConsumerService } from 'src/modules/browser/services/stream/consumer.service';
import { RedisearchController } from 'src/modules/browser/controllers/redisearch/redisearch.controller';
import { RedisearchService } from 'src/modules/browser/services/redisearch/redisearch.service';
import { HashController } from './controllers/hash/hash.controller';
import { KeysController } from './controllers/keys/keys.controller';
import { KeysBusinessService } from './services/keys-business/keys-business.service';
Expand All @@ -34,6 +36,7 @@ import { BrowserToolClusterService } from './services/browser-tool-cluster/brows
SetController,
ZSetController,
RejsonRlController,
RedisearchController,
HashController,
StreamController,
ConsumerGroupController,
Expand All @@ -46,6 +49,7 @@ import { BrowserToolClusterService } from './services/browser-tool-cluster/brows
SetBusinessService,
ZSetBusinessService,
RejsonRlBusinessService,
RedisearchService,
HashBusinessService,
StreamService,
ConsumerGroupService,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import {
Body,
Controller,
Get, HttpCode,
Param,
Post,
} from '@nestjs/common';
import {
ApiBody,
ApiOkResponse,
ApiOperation,
ApiTags,
} from '@nestjs/swagger';
import { ApiRedisParams } from 'src/decorators/api-redis-params.decorator';
import { ApiQueryRedisStringEncoding } from 'src/common/decorators';
import { BaseController } from 'src/modules/browser/controllers/base.controller';
import {
CreateRedisearchIndexDto,
ListRedisearchIndexesResponse,
SearchRedisearchDto,
} from 'src/modules/browser/dto/redisearch';
import { RedisearchService } from 'src/modules/browser/services/redisearch/redisearch.service';
import { GetKeysWithDetailsResponse } from 'src/modules/browser/dto';

@ApiTags('RediSearch')
@Controller('redisearch')
export class RedisearchController extends BaseController {
constructor(private service: RedisearchService) {
super();
}

@Get('')
@ApiOperation({ description: 'Get list of available indexes' })
@ApiOkResponse({ type: ListRedisearchIndexesResponse })
@ApiRedisParams()
@ApiQueryRedisStringEncoding()
async list(
@Param('dbInstance') dbInstance: string,
): Promise<ListRedisearchIndexesResponse> {
return this.service.list(
{
instanceId: dbInstance,
},
);
}

@Post('')
@ApiOperation({ description: 'Create redisearch index' })
@ApiRedisParams()
@HttpCode(201)
@ApiBody({ type: CreateRedisearchIndexDto })
async createIndex(
@Param('dbInstance') dbInstance: string,
@Body() dto: CreateRedisearchIndexDto,
): Promise<void> {
return await this.service.createIndex(
{
instanceId: dbInstance,
},
dto,
);
}

@Post('search')
@HttpCode(200)
@ApiOperation({ description: 'Search for keys in index' })
@ApiOkResponse({ type: GetKeysWithDetailsResponse })
@ApiRedisParams()
@ApiQueryRedisStringEncoding()
async search(
@Param('dbInstance') dbInstance: string,
@Body() dto: SearchRedisearchDto,
): Promise<GetKeysWithDetailsResponse> {
return await this.service.search(
{
instanceId: dbInstance,
},
dto,
);
}
}
122 changes: 122 additions & 0 deletions redisinsight/api/src/modules/browser/dto/redisearch.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import {
ArrayMinSize, IsDefined, IsEnum, IsInt, IsOptional, IsString, ValidateNested
} from 'class-validator';
import { Type } from 'class-transformer';
import { RedisString } from 'src/common/constants';
import { IsRedisString, RedisStringType } from 'src/common/decorators';

export enum RedisearchIndexKeyType {
HASH = 'hash',
JSON = 'json',
}

export enum RedisearchIndexDataType {
TEXT = 'text',
TAG = 'tag',
NUMERIC = 'numeric',
GEO = 'geo',
VECTOR = 'vector',
}

export class ListRedisearchIndexesResponse {
@ApiProperty({
description: 'Indexes names',
type: String,
})
@RedisStringType({ each: true })
indexes: RedisString[];
}

export class CreateRedisearchIndexFieldDto {
@ApiProperty({
description: 'Name of field to be indexed',
type: String,
})
@IsDefined()
@RedisStringType()
@IsRedisString()
name: RedisString;

@ApiProperty({
description: 'Type of how data must be indexed',
enum: RedisearchIndexDataType,
})
@IsDefined()
@IsEnum(RedisearchIndexDataType)
type: RedisearchIndexDataType;
}

export class CreateRedisearchIndexDto {
@ApiProperty({
description: 'Index Name',
type: String,
})
@IsDefined()
@RedisStringType()
@IsRedisString()
index: RedisString;

@ApiProperty({
description: 'Type of keys to index',
enum: RedisearchIndexKeyType,
})
@IsDefined()
@IsEnum(RedisearchIndexKeyType)
type: RedisearchIndexKeyType;

@ApiPropertyOptional({
description: 'Keys prefixes to find keys for index',
isArray: true,
type: String,
})
@IsOptional()
@RedisStringType({ each: true })
@IsRedisString({ each: true })
prefixes?: RedisString[];

@ApiProperty({
description: 'Fields to index',
isArray: true,
type: CreateRedisearchIndexFieldDto,
})
@Type(() => CreateRedisearchIndexFieldDto)
@ValidateNested()
@ArrayMinSize(1)
fields: CreateRedisearchIndexFieldDto[];
}

export class SearchRedisearchDto {
@ApiProperty({
description: 'Index Name',
type: String,
})
@IsDefined()
@RedisStringType()
@IsRedisString()
index: RedisString;

@ApiProperty({
description: 'Query to search inside data fields',
type: String,
})
@IsDefined()
@IsString()
query: string;

@ApiProperty({
description: 'Limit number of results to be returned',
type: Number,
})
@IsDefined()
@IsInt()
limit: number = 500; // todo use @Default from another PR

@ApiProperty({
description: 'Offset position to start searching',
type: Number,
})
@IsDefined()
@IsInt()
offset: number = 0; // todo use @Default from another PR
}
Loading