Skip to content

Commit 8ec3167

Browse files
committed
HSCAN VALUES support
1 parent dbf8f59 commit 8ec3167

File tree

3 files changed

+118
-0
lines changed

3 files changed

+118
-0
lines changed

packages/client/lib/cluster/commands.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ import * as HRANDFIELD_COUNT_WITHVALUES from '../commands/HRANDFIELD_COUNT_WITHV
6464
import * as HRANDFIELD_COUNT from '../commands/HRANDFIELD_COUNT';
6565
import * as HRANDFIELD from '../commands/HRANDFIELD';
6666
import * as HSCAN from '../commands/HSCAN';
67+
import * as HSCAN_VALUES from '../commands/HSCAN_VALUES';
6768
import * as HSET from '../commands/HSET';
6869
import * as HSETNX from '../commands/HSETNX';
6970
import * as HSTRLEN from '../commands/HSTRLEN';
@@ -343,6 +344,8 @@ export default {
343344
hRandField: HRANDFIELD,
344345
HSCAN,
345346
hScan: HSCAN,
347+
HSCAN_VALUES,
348+
hScanValues: HSCAN_VALUES,
346349
HSET,
347350
hSet: HSET,
348351
HSETNX,
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import { strict as assert } from 'assert';
2+
import testUtils, { GLOBAL } from '../test-utils';
3+
import { transformArguments, transformReply } from './HSCAN_VALUES';
4+
5+
describe('HSCAN_VALUES', () => {
6+
describe('transformArguments', () => {
7+
it('cusror only', () => {
8+
assert.deepEqual(
9+
transformArguments('key', 0),
10+
['HSCAN', 'key', '0', 'VALUES']
11+
);
12+
});
13+
14+
it('with MATCH', () => {
15+
assert.deepEqual(
16+
transformArguments('key', 0, {
17+
MATCH: 'pattern'
18+
}),
19+
['HSCAN', 'key', '0', 'MATCH', 'pattern', 'VALUES']
20+
);
21+
});
22+
23+
it('with COUNT', () => {
24+
assert.deepEqual(
25+
transformArguments('key', 0, {
26+
COUNT: 1
27+
}),
28+
['HSCAN', 'key', '0', 'COUNT', '1', 'VALUES']
29+
);
30+
});
31+
32+
it('with MATCH & COUNT', () => {
33+
assert.deepEqual(
34+
transformArguments('key', 0, {
35+
MATCH: 'pattern',
36+
COUNT: 1
37+
}),
38+
['HSCAN', 'key', '0', 'MATCH', 'pattern', 'COUNT', '1', 'VALUES']
39+
);
40+
});
41+
});
42+
43+
describe('transformReply', () => {
44+
it('without tuples', () => {
45+
assert.deepEqual(
46+
transformReply(['0', []]),
47+
{
48+
cursor: 0,
49+
fields: []
50+
}
51+
);
52+
});
53+
54+
it('with tuples', () => {
55+
assert.deepEqual(
56+
transformReply(['0', ['field']]),
57+
{
58+
cursor: 0,
59+
fields: [
60+
'field',
61+
]
62+
}
63+
);
64+
});
65+
});
66+
67+
testUtils.testWithClient('client.hScan', async client => {
68+
assert.deepEqual(
69+
await client.hScanValues('key', 0),
70+
{
71+
cursor: 0,
72+
fields: []
73+
}
74+
);
75+
}, GLOBAL.SERVERS.OPEN);
76+
});
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { RedisCommandArgument, RedisCommandArguments } from '.';
2+
import { ScanOptions, pushScanArguments } from './generic-transformers';
3+
4+
export const FIRST_KEY_INDEX = 1;
5+
6+
export const IS_READ_ONLY = true;
7+
8+
export function transformArguments(
9+
key: RedisCommandArgument,
10+
cursor: number,
11+
options?: ScanOptions
12+
): RedisCommandArguments {
13+
const args = pushScanArguments([
14+
'HSCAN',
15+
key
16+
], cursor, options);
17+
args.push('VALUES');
18+
19+
return args;
20+
}
21+
22+
type HScanRawReply = [RedisCommandArgument, Array<RedisCommandArgument>];
23+
24+
export interface HScanTuple {
25+
field: RedisCommandArgument;
26+
value: RedisCommandArgument;
27+
}
28+
29+
interface HScanValueReply {
30+
cursor: number;
31+
fields: Array<RedisCommandArgument>;
32+
}
33+
34+
export function transformReply([cursor, fields]: HScanRawReply): HScanValueReply {
35+
return {
36+
cursor: Number(cursor),
37+
fields: fields
38+
};
39+
}

0 commit comments

Comments
 (0)