From 490e86b0606b0b90255809a29e56de68aa59141b Mon Sep 17 00:00:00 2001 From: codrin-ch Date: Sat, 29 Apr 2023 14:23:24 +0300 Subject: [PATCH 1/6] Support ZRANK and ZREVRANK: Added the optional WITHSCORE argument --- packages/client/lib/commands/ZRANK.spec.ts | 5 +++++ packages/client/lib/commands/ZRANK.ts | 14 +++++++++++--- packages/client/lib/commands/ZREVRANK.spec.ts | 5 +++++ packages/client/lib/commands/ZREVRANK.ts | 12 ++++++++++-- .../client/lib/commands/generic-transformers.ts | 4 ++++ 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/packages/client/lib/commands/ZRANK.spec.ts b/packages/client/lib/commands/ZRANK.spec.ts index 0c81517a7d6..1908633c940 100644 --- a/packages/client/lib/commands/ZRANK.spec.ts +++ b/packages/client/lib/commands/ZRANK.spec.ts @@ -8,6 +8,11 @@ describe('ZRANK', () => { transformArguments('key', 'member'), ['ZRANK', 'key', 'member'] ); + + assert.deepEqual( + transformArguments('key', 'member', { WITHSCORE: true }), + ['ZRANK', 'key', 'member', 'WITHSCORE'] + ); }); testUtils.testWithClient('client.zRank', async client => { diff --git a/packages/client/lib/commands/ZRANK.ts b/packages/client/lib/commands/ZRANK.ts index 33439ea4b55..6d9798a8130 100644 --- a/packages/client/lib/commands/ZRANK.ts +++ b/packages/client/lib/commands/ZRANK.ts @@ -1,4 +1,5 @@ import { RedisCommandArgument, RedisCommandArguments } from '.'; +import { RankOptions } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -6,9 +7,16 @@ export const IS_READ_ONLY = true; export function transformArguments( key: RedisCommandArgument, - member: RedisCommandArgument + member: RedisCommandArgument, + options?: RankOptions ): RedisCommandArguments { - return ['ZRANK', key, member]; + const args = ['ZRANK', key, member]; + + if (options?.WITHSCORE) { + args.push('WITHSCORE'); + } + + return args; } -export declare function transformReply(): number | null; +export declare function transformReply(): number | Array | null; diff --git a/packages/client/lib/commands/ZREVRANK.spec.ts b/packages/client/lib/commands/ZREVRANK.spec.ts index d9fef0d70a4..cb2044be2e3 100644 --- a/packages/client/lib/commands/ZREVRANK.spec.ts +++ b/packages/client/lib/commands/ZREVRANK.spec.ts @@ -8,6 +8,11 @@ describe('ZREVRANK', () => { transformArguments('key', 'member'), ['ZREVRANK', 'key', 'member'] ); + + assert.deepEqual( + transformArguments('key', 'member', { WITHSCORE: true }), + ['ZREVRANK', 'key', 'member', 'WITHSCORE'] + ); }); testUtils.testWithClient('client.zRevRank', async client => { diff --git a/packages/client/lib/commands/ZREVRANK.ts b/packages/client/lib/commands/ZREVRANK.ts index b88936c0c92..a9835a3b6b5 100644 --- a/packages/client/lib/commands/ZREVRANK.ts +++ b/packages/client/lib/commands/ZREVRANK.ts @@ -1,4 +1,5 @@ import { RedisCommandArgument, RedisCommandArguments } from '.'; +import { RankOptions } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -6,9 +7,16 @@ export const IS_READ_ONLY = true; export function transformArguments( key: RedisCommandArgument, - member: RedisCommandArgument + member: RedisCommandArgument, + options?: RankOptions ): RedisCommandArguments { - return ['ZREVRANK', key, member]; + const args = ['ZREVRANK', key, member]; + + if (options?.WITHSCORE) { + args.push('WITHSCORE'); + } + + return args; } export declare function transformReply(): number | null; diff --git a/packages/client/lib/commands/generic-transformers.ts b/packages/client/lib/commands/generic-transformers.ts index 5048de9399a..885a53be847 100644 --- a/packages/client/lib/commands/generic-transformers.ts +++ b/packages/client/lib/commands/generic-transformers.ts @@ -687,3 +687,7 @@ export function transformRangeReply([start, end]: RawRangeReply): RangeReply { end }; } + +export interface RankOptions { + WITHSCORE?: true; +} From 434e541b6c88e0e17c3aee8dd4bde6d3fd0411f8 Mon Sep 17 00:00:00 2001 From: codrin-ch Date: Sun, 30 Apr 2023 10:20:26 +0300 Subject: [PATCH 2/6] revert previous changes and implement dedicated commands for the optional WITHSCORE argument --- packages/client/lib/cluster/commands.ts | 6 +++ packages/client/lib/commands/ZRANK.spec.ts | 5 -- packages/client/lib/commands/ZRANK.ts | 14 ++---- .../lib/commands/ZRANK_WITHSCORE.spec.ts | 49 +++++++++++++++++++ .../client/lib/commands/ZRANK_WITHSCORE.ts | 13 +++++ packages/client/lib/commands/ZREVRANK.spec.ts | 5 -- packages/client/lib/commands/ZREVRANK.ts | 12 +---- .../lib/commands/ZREVRANK_WITHSCORE.spec.ts | 49 +++++++++++++++++++ .../client/lib/commands/ZREVRANK_WITHSCORE.ts | 13 +++++ .../lib/commands/generic-transformers.ts | 4 -- 10 files changed, 135 insertions(+), 35 deletions(-) create mode 100644 packages/client/lib/commands/ZRANK_WITHSCORE.spec.ts create mode 100644 packages/client/lib/commands/ZRANK_WITHSCORE.ts create mode 100644 packages/client/lib/commands/ZREVRANK_WITHSCORE.spec.ts create mode 100644 packages/client/lib/commands/ZREVRANK_WITHSCORE.ts diff --git a/packages/client/lib/cluster/commands.ts b/packages/client/lib/cluster/commands.ts index 58fa651be1b..9961b7fc0da 100644 --- a/packages/client/lib/cluster/commands.ts +++ b/packages/client/lib/cluster/commands.ts @@ -200,11 +200,13 @@ import * as ZRANGEBYSCORE_WITHSCORES from '../commands/ZRANGEBYSCORE_WITHSCORES' import * as ZRANGEBYSCORE from '../commands/ZRANGEBYSCORE'; import * as ZRANGESTORE from '../commands/ZRANGESTORE'; import * as ZRANK from '../commands/ZRANK'; +import * as ZRANK_WITHSCORE from '../commands/ZRANK_WITHSCORE'; import * as ZREM from '../commands/ZREM'; import * as ZREMRANGEBYLEX from '../commands/ZREMRANGEBYLEX'; import * as ZREMRANGEBYRANK from '../commands/ZREMRANGEBYRANK'; import * as ZREMRANGEBYSCORE from '../commands/ZREMRANGEBYSCORE'; import * as ZREVRANK from '../commands/ZREVRANK'; +import * as ZREVRANK_WITHSCORE from '../commands/ZREVRANK_WITHSCORE'; import * as ZSCAN from '../commands/ZSCAN'; import * as ZSCORE from '../commands/ZSCORE'; import * as ZUNION_WITHSCORES from '../commands/ZUNION_WITHSCORES'; @@ -614,6 +616,8 @@ export default { zRangeStore: ZRANGESTORE, ZRANK, zRank: ZRANK, + ZRANK_WITHSCORE, + zRankWithScore: ZRANK_WITHSCORE, ZREM, zRem: ZREM, ZREMRANGEBYLEX, @@ -624,6 +628,8 @@ export default { zRemRangeByScore: ZREMRANGEBYSCORE, ZREVRANK, zRevRank: ZREVRANK, + ZREVRANK_WITHSCORE, + zRevRankWithScore: ZREVRANK_WITHSCORE, ZSCAN, zScan: ZSCAN, ZSCORE, diff --git a/packages/client/lib/commands/ZRANK.spec.ts b/packages/client/lib/commands/ZRANK.spec.ts index 1908633c940..0c81517a7d6 100644 --- a/packages/client/lib/commands/ZRANK.spec.ts +++ b/packages/client/lib/commands/ZRANK.spec.ts @@ -8,11 +8,6 @@ describe('ZRANK', () => { transformArguments('key', 'member'), ['ZRANK', 'key', 'member'] ); - - assert.deepEqual( - transformArguments('key', 'member', { WITHSCORE: true }), - ['ZRANK', 'key', 'member', 'WITHSCORE'] - ); }); testUtils.testWithClient('client.zRank', async client => { diff --git a/packages/client/lib/commands/ZRANK.ts b/packages/client/lib/commands/ZRANK.ts index 6d9798a8130..33439ea4b55 100644 --- a/packages/client/lib/commands/ZRANK.ts +++ b/packages/client/lib/commands/ZRANK.ts @@ -1,5 +1,4 @@ import { RedisCommandArgument, RedisCommandArguments } from '.'; -import { RankOptions } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,16 +6,9 @@ export const IS_READ_ONLY = true; export function transformArguments( key: RedisCommandArgument, - member: RedisCommandArgument, - options?: RankOptions + member: RedisCommandArgument ): RedisCommandArguments { - const args = ['ZRANK', key, member]; - - if (options?.WITHSCORE) { - args.push('WITHSCORE'); - } - - return args; + return ['ZRANK', key, member]; } -export declare function transformReply(): number | Array | null; +export declare function transformReply(): number | null; diff --git a/packages/client/lib/commands/ZRANK_WITHSCORE.spec.ts b/packages/client/lib/commands/ZRANK_WITHSCORE.spec.ts new file mode 100644 index 00000000000..2ff905d40ac --- /dev/null +++ b/packages/client/lib/commands/ZRANK_WITHSCORE.spec.ts @@ -0,0 +1,49 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments, transformReply } from './ZRANK_WITHSCORE'; + +describe('ZRANK WITHSCORES', () => { + testUtils.isVersionGreaterThanHook([7, 2]); + + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key', 'member'), + ['ZRANK', 'key', 'member', 'WITHSCORE'] + ); + }); + + it('transformReply', () => { + assert.deepEqual( + transformReply([]), + null + ); + assert.deepEqual( + transformReply(['test', '1']), + { + value: 'test', + score: 1 + } + ); + }); + + testUtils.testWithClient('client.zRankWithScore empty response', async client => { + assert.deepEqual( + await client.zRankWithScore('key', 'member'), + null + ); + }, GLOBAL.SERVERS.OPEN); + + testUtils.testWithClient('client.zRankWithScore', async client => { + await Promise.all([ + client.zAdd('zRankWithScoreSet', 1, 'one'), + client.zAdd('zRankWithScoreSet', 2, 'two') + ]); + assert.deepEqual( + await client.zRankWithScore('zRankWithScoreSet', 'one'), + { + value: 'one', + score: 0 + } + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/ZRANK_WITHSCORE.ts b/packages/client/lib/commands/ZRANK_WITHSCORE.ts new file mode 100644 index 00000000000..178a55fcd39 --- /dev/null +++ b/packages/client/lib/commands/ZRANK_WITHSCORE.ts @@ -0,0 +1,13 @@ +import { RedisCommandArguments } from '.'; +import { transformArguments as transformZRankArguments } from './ZRANK'; + +export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZRANK'; + +export function transformArguments(...args: Parameters): RedisCommandArguments { + return [ + ...transformZRankArguments(...args), + 'WITHSCORE' + ]; +} + +export { transformSortedSetMemberNullReply as transformReply } from './generic-transformers'; diff --git a/packages/client/lib/commands/ZREVRANK.spec.ts b/packages/client/lib/commands/ZREVRANK.spec.ts index cb2044be2e3..d9fef0d70a4 100644 --- a/packages/client/lib/commands/ZREVRANK.spec.ts +++ b/packages/client/lib/commands/ZREVRANK.spec.ts @@ -8,11 +8,6 @@ describe('ZREVRANK', () => { transformArguments('key', 'member'), ['ZREVRANK', 'key', 'member'] ); - - assert.deepEqual( - transformArguments('key', 'member', { WITHSCORE: true }), - ['ZREVRANK', 'key', 'member', 'WITHSCORE'] - ); }); testUtils.testWithClient('client.zRevRank', async client => { diff --git a/packages/client/lib/commands/ZREVRANK.ts b/packages/client/lib/commands/ZREVRANK.ts index a9835a3b6b5..b88936c0c92 100644 --- a/packages/client/lib/commands/ZREVRANK.ts +++ b/packages/client/lib/commands/ZREVRANK.ts @@ -1,5 +1,4 @@ import { RedisCommandArgument, RedisCommandArguments } from '.'; -import { RankOptions } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,16 +6,9 @@ export const IS_READ_ONLY = true; export function transformArguments( key: RedisCommandArgument, - member: RedisCommandArgument, - options?: RankOptions + member: RedisCommandArgument ): RedisCommandArguments { - const args = ['ZREVRANK', key, member]; - - if (options?.WITHSCORE) { - args.push('WITHSCORE'); - } - - return args; + return ['ZREVRANK', key, member]; } export declare function transformReply(): number | null; diff --git a/packages/client/lib/commands/ZREVRANK_WITHSCORE.spec.ts b/packages/client/lib/commands/ZREVRANK_WITHSCORE.spec.ts new file mode 100644 index 00000000000..67013485a66 --- /dev/null +++ b/packages/client/lib/commands/ZREVRANK_WITHSCORE.spec.ts @@ -0,0 +1,49 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments, transformReply } from './ZREVRANK_WITHSCORE'; + +describe('ZREVRANK WITHSCORE', () => { + testUtils.isVersionGreaterThanHook([7, 2]); + + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key', 'member'), + ['ZREVRANK', 'key', 'member', 'WITHSCORE'] + ); + }); + + it('transformReply', () => { + assert.deepEqual( + transformReply([]), + null + ); + assert.deepEqual( + transformReply(['test', '1']), + { + value: 'test', + score: 1 + } + ); + }); + + testUtils.testWithClient('client.zRevRankWithScore empty response', async client => { + assert.deepEqual( + await client.zRevRankWithScore('key', 'member'), + null + ); + }, GLOBAL.SERVERS.OPEN); + + testUtils.testWithClient('client.zRevRankWithScore', async client => { + await Promise.all([ + client.zAdd('zRevRankWithScoreSet', 1, 'one'), + client.zAdd('zRevRankWithScoreSet', 2, 'two') + ]); + assert.deepEqual( + await client.zRevRankWithScore('zRevRankWithScoreSet', 'one'), + { + value: 'one', + score: 1 + } + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/ZREVRANK_WITHSCORE.ts b/packages/client/lib/commands/ZREVRANK_WITHSCORE.ts new file mode 100644 index 00000000000..5f8736460a3 --- /dev/null +++ b/packages/client/lib/commands/ZREVRANK_WITHSCORE.ts @@ -0,0 +1,13 @@ +import { RedisCommandArguments } from '.'; +import { transformArguments as transformZRevRankArguments } from './ZREVRANK'; + +export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZREVRANK'; + +export function transformArguments(...args: Parameters): RedisCommandArguments { + return [ + ...transformZRevRankArguments(...args), + 'WITHSCORE' + ]; +} + +export { transformSortedSetMemberNullReply as transformReply } from './generic-transformers'; diff --git a/packages/client/lib/commands/generic-transformers.ts b/packages/client/lib/commands/generic-transformers.ts index 885a53be847..5048de9399a 100644 --- a/packages/client/lib/commands/generic-transformers.ts +++ b/packages/client/lib/commands/generic-transformers.ts @@ -687,7 +687,3 @@ export function transformRangeReply([start, end]: RawRangeReply): RangeReply { end }; } - -export interface RankOptions { - WITHSCORE?: true; -} From c8f9215727b981b7110b4bcfeb06d393532fd723 Mon Sep 17 00:00:00 2001 From: codrin-ch Date: Mon, 1 May 2023 10:14:56 +0300 Subject: [PATCH 3/6] fix typo WITHSCORES --- packages/client/lib/commands/ZRANK_WITHSCORE.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/lib/commands/ZRANK_WITHSCORE.spec.ts b/packages/client/lib/commands/ZRANK_WITHSCORE.spec.ts index 2ff905d40ac..2a6e264289c 100644 --- a/packages/client/lib/commands/ZRANK_WITHSCORE.spec.ts +++ b/packages/client/lib/commands/ZRANK_WITHSCORE.spec.ts @@ -2,7 +2,7 @@ import { strict as assert } from 'assert'; import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './ZRANK_WITHSCORE'; -describe('ZRANK WITHSCORES', () => { +describe('ZRANK WITHSCORE', () => { testUtils.isVersionGreaterThanHook([7, 2]); it('transformArguments', () => { From a826f71f15c31109d70a545d00d8717fd80e2707 Mon Sep 17 00:00:00 2001 From: Leibale Eidelman Date: Sun, 21 May 2023 08:04:33 -0400 Subject: [PATCH 4/6] add 7.2-rc to the tests matrix --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 365e9f31d3c..721ea2f6a3a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -17,7 +17,7 @@ jobs: fail-fast: false matrix: node-version: ['14', '16', '18', '19'] - redis-version: ['5', '6.0', '6.2', '7.0'] + redis-version: ['5', '6.0', '6.2', '7.0', '7.2-rc'] steps: - uses: actions/checkout@v2.3.4 with: From ce82c6cf3edad46d10a9a498b465676d6a7abbbf Mon Sep 17 00:00:00 2001 From: Leibale Eidelman Date: Mon, 18 Sep 2023 17:51:01 -0400 Subject: [PATCH 5/6] Update tests.yml --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 721ea2f6a3a..a95a8787d63 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -17,7 +17,7 @@ jobs: fail-fast: false matrix: node-version: ['14', '16', '18', '19'] - redis-version: ['5', '6.0', '6.2', '7.0', '7.2-rc'] + redis-version: ['5', '6.0', '6.2', '7.0', '7.2'] steps: - uses: actions/checkout@v2.3.4 with: From 231c62e2525bb4115474f63cd842b909b654089e Mon Sep 17 00:00:00 2001 From: Leibale Eidelman Date: Mon, 18 Sep 2023 17:58:38 -0400 Subject: [PATCH 6/6] Update tests.yml --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a95a8787d63..365e9f31d3c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -17,7 +17,7 @@ jobs: fail-fast: false matrix: node-version: ['14', '16', '18', '19'] - redis-version: ['5', '6.0', '6.2', '7.0', '7.2'] + redis-version: ['5', '6.0', '6.2', '7.0'] steps: - uses: actions/checkout@v2.3.4 with: