Skip to content

Commit e094714

Browse files
#RI-3972 - resolve comments
1 parent d341e96 commit e094714

File tree

3 files changed

+17
-81
lines changed

3 files changed

+17
-81
lines changed

redisinsight/api/src/constants/redis-modules.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,6 @@ export enum AdditionalRedisModuleName {
88
RedisTimeSeries = 'timeseries',
99
}
1010

11-
enum RediSearchModuleName {
12-
Search = 'search',
13-
SearchLight = 'searchlight',
14-
FT = 'ft',
15-
FTL = 'ftl',
16-
}
17-
18-
export const REDISEARCH_MODULES = [
19-
RediSearchModuleName.Search,
20-
RediSearchModuleName.SearchLight,
21-
RediSearchModuleName.FT,
22-
RediSearchModuleName.FTL,
23-
];
24-
2511
export const SUPPORTED_REDIS_MODULES = Object.freeze({
2612
ai: AdditionalRedisModuleName.RedisAI,
2713
graph: AdditionalRedisModuleName.RedisGraph,

redisinsight/api/src/modules/recommendation/providers/recommendation.provider.spec.ts

Lines changed: 13 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -34,27 +34,6 @@ const mockRedisAclListResponse_2: string[] = [
3434
'user test_2 on nopass ~* &* +@all',
3535
];
3636

37-
const mockRedisModulesResponse_1 = [
38-
{ name: 'ai', ver: 10000 },
39-
{ name: 'graph', ver: 10000 },
40-
{ name: 'rg', ver: 10000 },
41-
{ name: 'bf', ver: 10000 },
42-
{ name: 'ReJSON', ver: 10000 },
43-
{ name: 'search', ver: 10000 },
44-
{ name: 'timeseries', ver: 10000 },
45-
{ name: 'customModule', ver: 10000 },
46-
].map((item) => ([].concat(...Object.entries(item))));
47-
48-
const mockRedisModulesResponse_2 = [
49-
{ name: 'ai', ver: 10000 },
50-
{ name: 'graph', ver: 10000 },
51-
{ name: 'rg', ver: 10000 },
52-
{ name: 'bf', ver: 10000 },
53-
{ name: 'ReJSON', ver: 10000 },
54-
{ name: 'timeseries', ver: 10000 },
55-
{ name: 'customModule', ver: 10000 },
56-
].map((item) => ([].concat(...Object.entries(item))));
57-
5837
const mockFTListResponse_1 = [];
5938
const mockFTListResponse_2 = ['idx'];
6039

@@ -566,25 +545,7 @@ describe('RecommendationProvider', () => {
566545
});
567546

568547
describe('determineRediSearchRecommendation', () => {
569-
it('should not return rediSearch recommendation when rediSearch module was download with indexes', async () => {
570-
when(nodeClient.sendCommand)
571-
.calledWith(jasmine.objectContaining({ name: 'module' }))
572-
.mockResolvedValue(mockRedisModulesResponse_1);
573-
574-
when(nodeClient.sendCommand)
575-
.calledWith(jasmine.objectContaining({ name: 'FT._LIST' }))
576-
.mockResolvedValue(mockFTListResponse_2);
577-
578-
const redisServerRecommendation = await service
579-
.determineRediSearchRecommendation(nodeClient, [mockJSONKey]);
580-
expect(redisServerRecommendation).toEqual(null);
581-
});
582-
583548
it('should return rediSearch recommendation when there is JSON key', async () => {
584-
when(nodeClient.sendCommand)
585-
.calledWith(jasmine.objectContaining({ name: 'module' }))
586-
.mockResolvedValue(mockRedisModulesResponse_1);
587-
588549
when(nodeClient.sendCommand)
589550
.calledWith(jasmine.objectContaining({ name: 'FT._LIST' }))
590551
.mockResolvedValue(mockFTListResponse_1);
@@ -595,10 +556,6 @@ describe('RecommendationProvider', () => {
595556
});
596557

597558
it('should return rediSearch recommendation when there is huge string key', async () => {
598-
when(nodeClient.sendCommand)
599-
.calledWith(jasmine.objectContaining({ name: 'module' }))
600-
.mockResolvedValue(mockRedisModulesResponse_1);
601-
602559
when(nodeClient.sendCommand)
603560
.calledWith(jasmine.objectContaining({ name: 'FT._LIST' }))
604561
.mockResolvedValue(mockFTListResponse_1);
@@ -609,10 +566,6 @@ describe('RecommendationProvider', () => {
609566
});
610567

611568
it('should not return rediSearch recommendation when there is small string key', async () => {
612-
when(nodeClient.sendCommand)
613-
.calledWith(jasmine.objectContaining({ name: 'module' }))
614-
.mockResolvedValue(mockRedisModulesResponse_1);
615-
616569
when(nodeClient.sendCommand)
617570
.calledWith(jasmine.objectContaining({ name: 'FT._LIST' }))
618571
.mockResolvedValue(mockFTListResponse_1);
@@ -622,31 +575,33 @@ describe('RecommendationProvider', () => {
622575
expect(redisServerRecommendation).toEqual(null);
623576
});
624577

625-
it('should not return rediSearch recommendation when ft command execute with error', async () => {
626-
when(nodeClient.sendCommand)
627-
.calledWith(jasmine.objectContaining({ name: 'module' }))
628-
.mockResolvedValue(mockRedisModulesResponse_1);
629-
578+
it('should not return rediSearch recommendation when there are no indexes', async () => {
630579
when(nodeClient.sendCommand)
631580
.calledWith(jasmine.objectContaining({ name: 'FT._LIST' }))
632-
.mockRejectedValue("some error");
581+
.mockResolvedValue(mockFTListResponse_2);
633582

634583
const redisServerRecommendation = await service
635584
.determineRediSearchRecommendation(nodeClient, [mockJSONKey]);
636585
expect(redisServerRecommendation).toEqual(null);
637586
});
638587

639-
it('should not return rediSearch recommendation when module command execute with error', async () => {
588+
it('should ignore errors when ft command execute with error', async () => {
640589
when(nodeClient.sendCommand)
641-
.calledWith(jasmine.objectContaining({ name: 'module' }))
642-
.mockResolvedValue("some error");
590+
.calledWith(jasmine.objectContaining({ name: 'FT._LIST' }))
591+
.mockRejectedValue("some error");
592+
593+
const redisServerRecommendation = await service
594+
.determineRediSearchRecommendation(nodeClient, [mockJSONKey]);
595+
expect(redisServerRecommendation).toEqual({ name: RECOMMENDATION_NAMES.REDIS_SEARCH });
596+
});
643597

598+
it('should ignore errors when ft command execute with error', async () => {
644599
when(nodeClient.sendCommand)
645600
.calledWith(jasmine.objectContaining({ name: 'FT._LIST' }))
646-
.mockResolvedValue(mockFTListResponse_1);
601+
.mockRejectedValue("some error");
647602

648603
const redisServerRecommendation = await service
649-
.determineRediSearchRecommendation(nodeClient, [mockJSONKey]);
604+
.determineRediSearchRecommendation(nodeClient, [mockRediSearchStringKey_2]);
650605
expect(redisServerRecommendation).toEqual(null);
651606
});
652607
});

redisinsight/api/src/modules/recommendation/providers/recommendation.provider.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Redis, Cluster, Command } from 'ioredis';
33
import { get } from 'lodash';
44
import * as semverCompare from 'node-version-compare';
55
import { convertRedisInfoReplyToObject, convertBulkStringsToObject, convertStringsArrayToObject } from 'src/utils';
6-
import { RECOMMENDATION_NAMES, IS_TIMESTAMP, REDISEARCH_MODULES } from 'src/constants';
6+
import { RECOMMENDATION_NAMES, IS_TIMESTAMP } from 'src/constants';
77
import { RedisDataType } from 'src/modules/browser/dto';
88
import { Recommendation } from 'src/modules/database-analysis/models/recommendation';
99
import { Key } from 'src/modules/database-analysis/models';
@@ -338,20 +338,15 @@ export class RecommendationProvider {
338338
keys: Key[],
339339
): Promise<Recommendation> {
340340
try {
341-
const reply = await redisClient.sendCommand(
342-
new Command('module', ['list'], { replyEncoding: 'utf8' }),
343-
) as any[];
344-
const modules = reply.map((module: any[]) => convertStringsArrayToObject(module));
345-
const isRediSearchModule = modules.some(({ name }) => REDISEARCH_MODULES
346-
.some((search: string) => name === search));
347-
348-
if (isRediSearchModule) {
341+
try {
349342
const indexes = await redisClient.sendCommand(
350343
new Command('FT._LIST', [], { replyEncoding: 'utf8' }),
351344
) as any[];
352345
if (indexes.length) {
353346
return null;
354347
}
348+
} catch (err) {
349+
// Ignore errors
355350
}
356351

357352
const isBigStringOrJSON = keys.some((key) => (

0 commit comments

Comments
 (0)