Skip to content

Commit 2b318d4

Browse files
committed
WIP
1 parent b46f082 commit 2b318d4

27 files changed

+602
-585
lines changed

docs/v4-to-v5.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ Some command arguments/replies have changed to align more closely to data types
168168
- `CLUSTER FAILOVER`: `enum FailoverModes` -> `const FAILOVER_MODES` [^enum-to-constants], the second argument is `{ mode: string; }` instead of `string` [^future-proofing]
169169
- `CLUSTER LINKS`: `createTime` -> `create-time`, `sendBufferAllocated` -> `send-buffer-allocated`, `sendBufferUsed` -> `send-buffer-used` [^map-keys]
170170
- `TIME`: `Date` -> `[unixTimestamp: string, microseconds: string]`
171+
- `ZMPOP`: `{ elements: Array<{ member: string; score: number; }>; }` -> `{ members: Array<{ value: string; score: number; }>; }` to match other sorted set commands (e.g. `ZRANGE`, `ZSCAN`)
171172

172173
[^enum-to-constants]: TODO
173174

packages/client/lib/RESP/types.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -308,11 +308,7 @@ export type Resp2Reply<RESP3REPLY> = (
308308
RESP_TYPES['ARRAY'],
309309
Resp2Array<Extract<TYPES, Array<any>>>
310310
> :
311-
RespType<
312-
RESP_TYPE,
313-
DEFAULT,
314-
TYPES
315-
> :
311+
RESP3REPLY :
316312
RESP3REPLY
317313
);
318314

packages/client/lib/commands/BLMPOP.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Command } from '../RESP/types';
2-
import { transformLMPopArguments, LMPopOptions, ListSide, RedisVariadicArgument } from './generic-transformers';
3-
import LMPOP from './LMPOP';
2+
import { ListSide, RedisVariadicArgument } from './generic-transformers';
3+
import LMPOP, { LMPopOptions, transformLMPopArguments } from './LMPOP';
44

55
export default {
66
FIRST_KEY_INDEX: 3,

packages/client/lib/commands/LMPOP.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
1-
import { NullReply, TuplesReply, BlobStringReply, Command } from '../RESP/types';
2-
import { transformLMPopArguments, LMPopOptions, ListSide, RedisVariadicArgument } from './generic-transformers';
1+
import { CommandArguments, NullReply, TuplesReply, BlobStringReply, Command } from '../RESP/types';
2+
import { ListSide, RedisVariadicArgument, pushVariadicArgument } from './generic-transformers';
3+
4+
export interface LMPopOptions {
5+
COUNT?: number;
6+
}
7+
8+
export function transformLMPopArguments(
9+
args: CommandArguments,
10+
keys: RedisVariadicArgument,
11+
side: ListSide,
12+
options?: LMPopOptions
13+
): CommandArguments {
14+
pushVariadicArgument(args, keys);
15+
16+
args.push(side);
17+
18+
if (options?.COUNT) {
19+
args.push('COUNT', options.COUNT.toString());
20+
}
21+
22+
return args;
23+
}
324

425
export default {
526
FIRST_KEY_INDEX: 2,

packages/client/lib/commands/ZADD.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { RedisArgument, NumberReply, DoubleReply, Command, CommandArguments } from '../RESP/types';
2-
import { ZMember, transformDoubleArgument, transformDoubleReply } from './generic-transformers';
1+
import { RedisArgument, Command } from '../RESP/types';
2+
import { SortedSetMember, transformDoubleArgument, transformDoubleReply } from './generic-transformers';
33

44
export interface ZAddOptions {
55
condition?: 'NX' | 'XX';
@@ -27,7 +27,7 @@ export default {
2727
FIRST_KEY_INDEX: 1,
2828
transformArguments(
2929
key: RedisArgument,
30-
members: ZMember | Array<ZMember>,
30+
members: SortedSetMember | Array<SortedSetMember>,
3131
options?: ZAddOptions
3232
) {
3333
const args = ['ZADD', key];
@@ -56,16 +56,12 @@ export default {
5656

5757
return args;
5858
},
59-
transformReply: {
60-
2: transformDoubleReply,
61-
3: undefined as unknown as () => NumberReply
62-
}
59+
transformReply: transformDoubleReply
6360
} as const satisfies Command;
6461

6562
export function pushMembers(
66-
args: CommandArguments,
67-
members: ZMember | Array<ZMember>
68-
) {
63+
args: Array<RedisArgument>,
64+
members: SortedSetMember | Array<SortedSetMember>) {
6965
if (Array.isArray(members)) {
7066
for (const member of members) {
7167
pushMember(args, member);
@@ -75,7 +71,10 @@ export function pushMembers(
7571
}
7672
}
7773

78-
function pushMember(args: Array<RedisArgument>, member: ZMember) {
74+
function pushMember(
75+
args: Array<RedisArgument>,
76+
member: SortedSetMember
77+
) {
7978
args.push(
8079
transformDoubleArgument(member.score),
8180
member.value

packages/client/lib/commands/ZADD_INCR.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { RedisArgument, DoubleReply, NullReply, Command } from '../RESP/types';
1+
import { RedisArgument, Command } from '../RESP/types';
22
import { pushMembers } from './ZADD';
3-
import { ZMember, transformDoubleArgument, transformNullableDoubleReply } from './generic-transformers';
3+
import { SortedSetMember, transformNullableDoubleReply } from './generic-transformers';
44

55
export interface ZAddOptions {
66
condition?: 'NX' | 'XX';
@@ -12,7 +12,7 @@ export default {
1212
FIRST_KEY_INDEX: 1,
1313
transformArguments(
1414
key: RedisArgument,
15-
members: ZMember | Array<ZMember>,
15+
members: SortedSetMember | Array<SortedSetMember>,
1616
options?: ZAddOptions
1717
) {
1818
const args = ['ZADD', key];
@@ -35,8 +35,5 @@ export default {
3535

3636
return args;
3737
},
38-
transformReply: {
39-
2: transformNullableDoubleReply,
40-
3: undefined as unknown as () => DoubleReply | NullReply
41-
}
38+
transformReply: transformNullableDoubleReply
4239
} as const satisfies Command;

packages/client/lib/commands/ZINCRBY.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,5 @@ export default {
1515
member
1616
];
1717
},
18-
transformReply: {
19-
2: transformDoubleReply,
20-
3: undefined as unknown as () => DoubleReply
21-
}
18+
transformReply: transformDoubleReply
2219
} as const satisfies Command;

packages/client/lib/commands/ZINTERSTORE.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ZKeys } from './generic-transformers';
55

66
export default {
77
FIRST_KEY_INDEX: 1,
8+
IS_READ_ONLY: false,
89
transformArguments(
910
destination: RedisArgument,
1011
keys: ZKeys,
Lines changed: 51 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,55 @@
1-
// import { strict as assert } from 'assert';
2-
// import testUtils, { GLOBAL } from '../test-utils';
3-
// import { transformArguments } from './ZMPOP';
1+
import { strict as assert } from 'assert';
2+
import testUtils, { GLOBAL } from '../test-utils';
3+
import ZMPOP from './ZMPOP';
44

5-
// describe('ZMPOP', () => {
6-
// testUtils.isVersionGreaterThanHook([7]);
5+
describe('ZMPOP', () => {
6+
testUtils.isVersionGreaterThanHook([7]);
77

8-
// describe('transformArguments', () => {
9-
// it('simple', () => {
10-
// assert.deepEqual(
11-
// transformArguments('key', 'MIN'),
12-
// ['ZMPOP', '1', 'key', 'MIN']
13-
// );
14-
// });
8+
describe('transformArguments', () => {
9+
it('simple', () => {
10+
assert.deepEqual(
11+
ZMPOP.transformArguments('key', 'MIN'),
12+
['ZMPOP', '1', 'key', 'MIN']
13+
);
14+
});
1515

16-
// it('with score and count', () => {
17-
// assert.deepEqual(
18-
// transformArguments('key', 'MIN', {
19-
// COUNT: 2
20-
// }),
21-
// ['ZMPOP', '1', 'key', 'MIN', 'COUNT', '2']
22-
// );
23-
// });
24-
// });
16+
it('with count', () => {
17+
assert.deepEqual(
18+
ZMPOP.transformArguments('key', 'MIN', {
19+
COUNT: 2
20+
}),
21+
['ZMPOP', '1', 'key', 'MIN', 'COUNT', '2']
22+
);
23+
});
24+
});
2525

26-
// testUtils.testWithClient('client.zmPop', async client => {
27-
// assert.deepEqual(
28-
// await client.zmPop('key', 'MIN'),
29-
// null
30-
// );
31-
// }, GLOBAL.SERVERS.OPEN);
32-
// });
26+
testUtils.testAll('zmPop - null', async client => {
27+
assert.equal(
28+
await client.zmPop('key', 'MIN'),
29+
null
30+
);
31+
}, {
32+
client: GLOBAL.SERVERS.OPEN,
33+
cluster: GLOBAL.CLUSTERS.OPEN
34+
});
35+
36+
testUtils.testAll('zmPop - with members', async client => {
37+
const members = [{
38+
value: '1',
39+
score: 1
40+
}];
41+
42+
const [, reply] = await Promise.all([
43+
client.zAdd('key', members),
44+
client.zmPop('key', 'MIN')
45+
]);
46+
47+
assert.deepEqual(reply, {
48+
key: 'key',
49+
members
50+
});
51+
}, {
52+
client: GLOBAL.SERVERS.OPEN,
53+
cluster: GLOBAL.CLUSTERS.OPEN
54+
});
55+
});

packages/client/lib/commands/ZMPOP.ts

Lines changed: 45 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,51 @@
1-
// import { NullReply, TuplesReply, BlobStringReply, DoubleReply, ArrayReply, Resp2Reply, Command, RedisArgument } from '../RESP/types';
2-
// import { pushVariadicArgument, RedisVariadicArgument, SortedSetSide } from './generic-transformers';
1+
import { NullReply, TuplesReply, BlobStringReply, DoubleReply, ArrayReply, Resp2Reply, Command } from '../RESP/types';
2+
import { pushVariadicArgument, RedisVariadicArgument, SortedSetSide, transformSortedSetReply } from './generic-transformers';
33

4-
// export interface ZMPopOptions {
5-
// COUNT?: number;
6-
// }
4+
export interface ZMPopOptions {
5+
COUNT?: number;
6+
}
77

8-
// export type ZMPopRawReply = NullReply | TuplesReply<[
9-
// key: BlobStringReply,
10-
// elements: ArrayReply<TuplesReply<[
11-
// member: BlobStringReply,
12-
// score: DoubleReply
13-
// ]>>
14-
// ]>;
8+
export type ZMPopRawReply = NullReply | TuplesReply<[
9+
key: BlobStringReply,
10+
members: ArrayReply<TuplesReply<[
11+
value: BlobStringReply,
12+
score: DoubleReply
13+
]>>
14+
]>;
1515

16-
// export function pushZMPopArguments(
17-
// args: Array<RedisArgument>,
18-
// keys: RedisVariadicArgument,
19-
// side: SortedSetSide,
20-
// options: ZMPopOptions
21-
// )
16+
export default {
17+
FIRST_KEY_INDEX: 2,
18+
IS_READ_ONLY: false,
19+
transformArguments(
20+
keys: RedisVariadicArgument,
21+
side: SortedSetSide,
22+
options?: ZMPopOptions
23+
) {
24+
const args = pushVariadicArgument(['ZMPOP'], keys);
2225

23-
// export default {
24-
// FIRST_KEY_INDEX: 2,
25-
// IS_READ_ONLY: false,
26-
// transformArguments(
27-
// keys: RedisVariadicArgument,
28-
// side: SortedSetSide,
29-
// options?: ZMPopOptions
30-
// ) {
31-
// const args = pushVariadicArgument(['ZMPOP'], keys);
26+
args.push(side);
3227

33-
// args.push(side);
28+
if (options?.COUNT) {
29+
args.push('COUNT', options.COUNT.toString());
30+
}
3431

35-
// if (options?.COUNT) {
36-
// args.push('COUNT', options.COUNT.toString());
37-
// }
38-
39-
// return args;
40-
// },
41-
// transformReply: {
42-
// 2: (reply: Resp2Reply<ZMPopRawReply>) => {
43-
// return reply === null ? null : {
44-
// key: reply[0],
45-
// elements: reply[1].map(([member, score]) => ({
46-
// member,
47-
// score: Number(score)
48-
// }))
49-
// };
50-
// },
51-
// 3: (reply: ZMPopRawReply) => {
52-
// return reply === null ? null : {
53-
// key: reply[0],
54-
// elements: reply[1].map(([member, score]) => ({
55-
// member,
56-
// score
57-
// }))
58-
// };
59-
// },
60-
// }
61-
// } as const satisfies Command;
32+
return args;
33+
},
34+
transformReply: {
35+
2: (reply: Resp2Reply<ZMPopRawReply>) => {
36+
return reply === null ? null : {
37+
key: reply[0],
38+
members: reply[1].map(([value, score]) => ({
39+
value,
40+
score: Number(score)
41+
}))
42+
};
43+
},
44+
3: (reply: ZMPopRawReply) => {
45+
return reply === null ? null : {
46+
key: reply[0],
47+
members: transformSortedSetReply[3](reply[1])
48+
};
49+
},
50+
}
51+
} as const satisfies Command;

0 commit comments

Comments
 (0)