Skip to content

Commit 03acaa3

Browse files
committed
Merge branch 'v5-search-broken' into cmd-parser-with-commands
2 parents 0b7bac6 + 3d0485b commit 03acaa3

File tree

110 files changed

+2145
-1233
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+2145
-1233
lines changed

.github/workflows/tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
fail-fast: false
1818
matrix:
1919
node-version: ['18', '20']
20-
redis-version: ['5', '6.0', '6.2', '7.0', '7.2']
20+
redis-version: ['5', '6.0', '6.2', '7.0', '7.2', '7.4']
2121
steps:
2222
- uses: actions/checkout@v4
2323
with:

packages/bloom/lib/commands/bloom/INFO.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ describe('BF.INFO', () => {
1818
]);
1919

2020
assert.equal(typeof reply, 'object');
21-
assert.equal(reply.capacity, 100);
22-
assert.equal(typeof reply.size, 'number');
23-
assert.equal(typeof reply.numberOfFilters, 'number');
24-
assert.equal(typeof reply.numberOfInsertedItems, 'number');
25-
assert.equal(typeof reply.expansionRate, 'number');
21+
assert.equal(reply['Capacity'], 100);
22+
assert.equal(typeof reply['Size'], 'number');
23+
assert.equal(typeof reply['Number of filters'], 'number');
24+
assert.equal(typeof reply['Number of items inserted'], 'number');
25+
assert.equal(typeof reply['Expansion rate'], 'number');
2626
}, GLOBAL.SERVERS.OPEN);
2727
});
Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
import { CommandParser } from '@redis/client/dist/lib/client/parser';
2-
import { RedisArgument, Command } from '@redis/client/dist/lib/RESP/types';
2+
import { RedisArgument, Command, UnwrapReply, NullReply, NumberReply, TuplesToMapReply, Resp2Reply, SimpleStringReply, TypeMapping } from '@redis/client/dist/lib/RESP/types';
3+
import { transformInfoV2Reply } from '.';
4+
5+
export type BfInfoReplyMap = TuplesToMapReply<[
6+
[SimpleStringReply<'Capacity'>, NumberReply],
7+
[SimpleStringReply<'Size'>, NumberReply],
8+
[SimpleStringReply<'Number of filters'>, NumberReply],
9+
[SimpleStringReply<'Number of items inserted'>, NumberReply],
10+
[SimpleStringReply<'Expansion rate'>, NullReply | NumberReply]
11+
]>;
312

413
export default {
514
FIRST_KEY_INDEX: 1,
@@ -8,6 +17,10 @@ export default {
817
parser.push('BF.INFO');
918
parser.pushKey(key);
1019
},
11-
// TODO
12-
transformReply: undefined as unknown as () => any
20+
transformReply: {
21+
2: (reply: UnwrapReply<Resp2Reply<BfInfoReplyMap>>, _, typeMapping?: TypeMapping): BfInfoReplyMap => {
22+
return transformInfoV2Reply<BfInfoReplyMap>(reply, typeMapping);
23+
},
24+
3: undefined as unknown as () => BfInfoReplyMap
25+
}
1326
} as const satisfies Command;

packages/bloom/lib/commands/bloom/index.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import type { RedisCommands } from '@redis/client/dist/lib/RESP/types';
1+
import type { RedisCommands, TypeMapping } from '@redis/client/dist/lib/RESP/types';
2+
23
import ADD from './ADD';
34
import CARD from './CARD';
45
import EXISTS from './EXISTS';
@@ -9,6 +10,7 @@ import MADD from './MADD';
910
import MEXISTS from './MEXISTS';
1011
import RESERVE from './RESERVE';
1112
import SCANDUMP from './SCANDUMP';
13+
import { RESP_TYPES } from '@redis/client';
1214

1315
export default {
1416
ADD,
@@ -32,3 +34,31 @@ export default {
3234
SCANDUMP,
3335
scanDump: SCANDUMP
3436
} as const satisfies RedisCommands;
37+
38+
export function transformInfoV2Reply<T>(reply: Array<any>, typeMapping?: TypeMapping): T {
39+
const mapType = typeMapping ? typeMapping[RESP_TYPES.MAP] : undefined;
40+
41+
switch (mapType) {
42+
case Array: {
43+
return reply as unknown as T;
44+
}
45+
case Map: {
46+
const ret = new Map<string, any>();
47+
48+
for (let i = 0; i < reply.length; i += 2) {
49+
ret.set(reply[i].toString(), reply[i + 1]);
50+
}
51+
52+
return ret as unknown as T;
53+
}
54+
default: {
55+
const ret = Object.create(null);
56+
57+
for (let i = 0; i < reply.length; i += 2) {
58+
ret[reply[i].toString()] = reply[i + 1];
59+
}
60+
61+
return ret as unknown as T;
62+
}
63+
}
64+
}

packages/bloom/lib/commands/count-min-sketch/INFO.spec.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ describe('CMS.INFO', () => {
1919
client.cms.info('key')
2020
]);
2121

22-
assert.deepEqual(reply, {
23-
width,
24-
depth,
25-
count: 0
26-
});
22+
const expected = Object.create(null);
23+
expected['width'] = width;
24+
expected['depth'] = depth;
25+
expected['count'] = 0;
26+
27+
assert.deepEqual(reply, expected);
2728
}, GLOBAL.SERVERS.OPEN);
2829
});
Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
import { CommandParser } from '@redis/client/dist/lib/client/parser';
2-
import { RedisArgument, TuplesToMapReply, BlobStringReply, NumberReply, UnwrapReply, Resp2Reply, Command } from '@redis/client/dist/lib/RESP/types';
2+
import { RedisArgument, TuplesToMapReply, NumberReply, UnwrapReply, Resp2Reply, Command, SimpleStringReply, TypeMapping } from '@redis/client/dist/lib/RESP/types';
3+
import { transformInfoV2Reply } from '../bloom';
34

4-
export type BfInfoReply = TuplesToMapReply<[
5-
[BlobStringReply<'width'>, NumberReply],
6-
[BlobStringReply<'depth'>, NumberReply],
7-
[BlobStringReply<'count'>, NumberReply]
5+
export type CmsInfoReplyMap = TuplesToMapReply<[
6+
[SimpleStringReply<'width'>, NumberReply],
7+
[SimpleStringReply<'depth'>, NumberReply],
8+
[SimpleStringReply<'count'>, NumberReply]
89
]>;
10+
11+
export interface CmsInfoReply {
12+
width: NumberReply;
13+
depth: NumberReply;
14+
count: NumberReply;
15+
}
916

1017
export default {
1118
FIRST_KEY_INDEX: 1,
@@ -15,11 +22,9 @@ export default {
1522
parser.pushKey(key);
1623
},
1724
transformReply: {
18-
2: (reply: UnwrapReply<Resp2Reply<BfInfoReply>>) => ({
19-
width: reply[1],
20-
depth: reply[3],
21-
count: reply[5]
22-
}),
23-
3: undefined as unknown as () => BfInfoReply
25+
2: (reply: UnwrapReply<Resp2Reply<CmsInfoReplyMap>>, _, typeMapping?: TypeMapping): CmsInfoReply => {
26+
return transformInfoV2Reply<CmsInfoReply>(reply, typeMapping);
27+
},
28+
3: undefined as unknown as () => CmsInfoReply
2429
}
2530
} as const satisfies Command;

packages/bloom/lib/commands/cuckoo/INFO.spec.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ describe('CF.INFO', () => {
1818
]);
1919

2020
assert.equal(typeof reply, 'object');
21-
assert.equal(typeof reply.size, 'number');
22-
assert.equal(typeof reply.numberOfBuckets, 'number');
23-
assert.equal(typeof reply.numberOfFilters, 'number');
24-
assert.equal(typeof reply.numberOfInsertedItems, 'number');
25-
assert.equal(typeof reply.numberOfDeletedItems, 'number');
26-
assert.equal(typeof reply.bucketSize, 'number');
27-
assert.equal(typeof reply.expansionRate, 'number');
28-
assert.equal(typeof reply.maxIteration, 'number');
21+
assert.equal(typeof reply['Size'], 'number');
22+
assert.equal(typeof reply['Number of buckets'], 'number');
23+
assert.equal(typeof reply['Number of filters'], 'number');
24+
assert.equal(typeof reply['Number of items inserted'], 'number');
25+
assert.equal(typeof reply['Number of items deleted'], 'number');
26+
assert.equal(typeof reply['Bucket size'], 'number');
27+
assert.equal(typeof reply['Expansion rate'], 'number');
28+
assert.equal(typeof reply['Max iterations'], 'number');
2929
}, GLOBAL.SERVERS.OPEN);
3030
});
Lines changed: 19 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
import { CommandParser } from '@redis/client/dist/lib/client/parser';
2-
import { RedisArgument, Command } from '@redis/client/dist/lib/RESP/types';
2+
import { RedisArgument, Command, NumberReply, TuplesToMapReply, UnwrapReply, Resp2Reply, SimpleStringReply, TypeMapping } from '@redis/client/dist/lib/RESP/types';
3+
import { transformInfoV2Reply } from '../bloom';
4+
5+
export type CfInfoReplyMap = TuplesToMapReply<[
6+
[SimpleStringReply<'Size'>, NumberReply],
7+
[SimpleStringReply<'Number of buckets'>, NumberReply],
8+
[SimpleStringReply<'Number of filters'>, NumberReply],
9+
[SimpleStringReply<'Number of items inserted'>, NumberReply],
10+
[SimpleStringReply<'Number of items deleted'>, NumberReply],
11+
[SimpleStringReply<'Bucket size'>, NumberReply],
12+
[SimpleStringReply<'Expansion rate'>, NumberReply],
13+
[SimpleStringReply<'Max iterations'>, NumberReply]
14+
]>;
315

416
export default {
517
FIRST_KEY_INDEX: 1,
@@ -8,48 +20,10 @@ export default {
820
parser.push('CF.INFO');
921
parser.pushKey(key);
1022
},
11-
// TODO
12-
// export type InfoRawReply = [
13-
// _: string,
14-
// size: number,
15-
// _: string,
16-
// numberOfBuckets: number,
17-
// _: string,
18-
// numberOfFilters: number,
19-
// _: string,
20-
// numberOfInsertedItems: number,
21-
// _: string,
22-
// numberOfDeletedItems: number,
23-
// _: string,
24-
// bucketSize: number,
25-
// _: string,
26-
// expansionRate: number,
27-
// _: string,
28-
// maxIteration: number
29-
// ];
30-
31-
// export interface InfoReply {
32-
// size: number;
33-
// numberOfBuckets: number;
34-
// numberOfFilters: number;
35-
// numberOfInsertedItems: number;
36-
// numberOfDeletedItems: number;
37-
// bucketSize: number;
38-
// expansionRate: number;
39-
// maxIteration: number;
40-
// }
41-
42-
// export function transformReply(reply: InfoRawReply): InfoReply {
43-
// return {
44-
// size: reply[1],
45-
// numberOfBuckets: reply[3],
46-
// numberOfFilters: reply[5],
47-
// numberOfInsertedItems: reply[7],
48-
// numberOfDeletedItems: reply[9],
49-
// bucketSize: reply[11],
50-
// expansionRate: reply[13],
51-
// maxIteration: reply[15]
52-
// };
53-
// }
54-
transformReply: undefined as unknown as () => any
23+
transformReply: {
24+
2: (reply: UnwrapReply<Resp2Reply<CfInfoReplyMap>>, _, typeMapping?: TypeMapping): CfInfoReplyMap => {
25+
return transformInfoV2Reply<CfInfoReplyMap>(reply, typeMapping);
26+
},
27+
3: undefined as unknown as () => CfInfoReplyMap
28+
}
5529
} as const satisfies Command;

packages/bloom/lib/commands/t-digest/INFO.spec.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@ describe('TDIGEST.INFO', () => {
1717
client.tDigest.info('key')
1818
]);
1919

20-
assert(typeof reply.capacity, 'number');
21-
assert(typeof reply.mergedNodes, 'number');
22-
assert(typeof reply.unmergedNodes, 'number');
23-
assert(typeof reply.mergedWeight, 'number');
24-
assert(typeof reply.unmergedWeight, 'number');
25-
assert(typeof reply.totalCompression, 'number');
26-
assert(typeof reply.totalCompression, 'number');
20+
assert(typeof reply, 'object');
21+
assert(typeof reply['Compression'], 'number');
22+
assert(typeof reply['Capacity'], 'number');
23+
assert(typeof reply['Merged nodes'], 'number');
24+
assert(typeof reply['Unmerged nodes'], 'number');
25+
assert(typeof reply['Merged weight'], 'number');
26+
assert(typeof reply['Unmerged weight'], 'number');
27+
assert(typeof reply['Observations'], 'number');
28+
assert(typeof reply['Total compressions'], 'number');
29+
assert(typeof reply['Memory usage'], 'number');
2730
}, GLOBAL.SERVERS.OPEN);
2831
});
Lines changed: 20 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
import { CommandParser } from '@redis/client/dist/lib/client/parser';
2-
import { RedisArgument, Command } from '@redis/client/dist/lib/RESP/types';
2+
import { RedisArgument, Command, NumberReply, TuplesToMapReply, UnwrapReply, Resp2Reply, SimpleStringReply, TypeMapping } from '@redis/client/dist/lib/RESP/types';
3+
import { transformInfoV2Reply } from '../bloom';
4+
5+
export type TdInfoReplyMap = TuplesToMapReply<[
6+
[SimpleStringReply<'Compression'>, NumberReply],
7+
[SimpleStringReply<'Capacity'>, NumberReply],
8+
[SimpleStringReply<'Merged nodes'>, NumberReply],
9+
[SimpleStringReply<'Unmerged nodes'>, NumberReply],
10+
[SimpleStringReply<'Merged weight'>, NumberReply],
11+
[SimpleStringReply<'Unmerged weight'>, NumberReply],
12+
[SimpleStringReply<'Observations'>, NumberReply],
13+
[SimpleStringReply<'Total compressions'>, NumberReply],
14+
[SimpleStringReply<'Memory usage'>, NumberReply]
15+
]>;
316

417
export default {
518
FIRST_KEY_INDEX: 1,
@@ -8,44 +21,10 @@ export default {
821
parser.push('TDIGEST.INFO');
922
parser.pushKey(key);
1023
},
11-
// TODO
12-
// type InfoRawReply = [
13-
// 'Compression',
14-
// number,
15-
// 'Capacity',
16-
// number,
17-
// 'Merged nodes',
18-
// number,
19-
// 'Unmerged nodes',
20-
// number,
21-
// 'Merged weight',
22-
// string,
23-
// 'Unmerged weight',
24-
// string,
25-
// 'Total compressions',
26-
// number
27-
// ];
28-
29-
// interface InfoReply {
30-
// comperssion: number;
31-
// capacity: number;
32-
// mergedNodes: number;
33-
// unmergedNodes: number;
34-
// mergedWeight: number;
35-
// unmergedWeight: number;
36-
// totalCompression: number;
37-
// }
38-
39-
// export function transformReply(reply: InfoRawReply): InfoReply {
40-
// return {
41-
// comperssion: reply[1],
42-
// capacity: reply[3],
43-
// mergedNodes: reply[5],
44-
// unmergedNodes: reply[7],
45-
// mergedWeight: Number(reply[9]),
46-
// unmergedWeight: Number(reply[11]),
47-
// totalCompression: reply[13]
48-
// };
49-
// }
50-
transformReply: undefined as unknown as () => any
24+
transformReply: {
25+
2: (reply: UnwrapReply<Resp2Reply<TdInfoReplyMap>>, _, typeMapping?: TypeMapping): TdInfoReplyMap => {
26+
return transformInfoV2Reply<TdInfoReplyMap>(reply, typeMapping);
27+
},
28+
3: undefined as unknown as () => TdInfoReplyMap
29+
}
5130
} as const satisfies Command;

0 commit comments

Comments
 (0)