You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-19 07:02:06 +03:00
lots of todo commends
This commit is contained in:
@@ -6,9 +6,8 @@ import RedisMultiCommand, { MultiQueuedCommand, RedisMultiCommandType } from './
|
|||||||
import EventEmitter from 'events';
|
import EventEmitter from 'events';
|
||||||
import { CommandOptions, commandOptions, isCommandOptions } from './command-options';
|
import { CommandOptions, commandOptions, isCommandOptions } from './command-options';
|
||||||
import { RedisLuaScript, RedisLuaScripts } from './lua-script';
|
import { RedisLuaScript, RedisLuaScripts } from './lua-script';
|
||||||
import { ScanOptions } from './commands/generic-transformers';
|
import { ScanOptions, ZMember } from './commands/generic-transformers';
|
||||||
import { ScanCommandOptions } from './commands/SCAN';
|
import { ScanCommandOptions } from './commands/SCAN';
|
||||||
import { ZMember } from './commands/ZADD';
|
|
||||||
|
|
||||||
export interface RedisClientOptions<M = RedisModules, S = RedisLuaScripts> {
|
export interface RedisClientOptions<M = RedisModules, S = RedisLuaScripts> {
|
||||||
socket?: RedisSocketOptions;
|
socket?: RedisSocketOptions;
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
import { transformReplyNumberInfinity } from './generic-transformers';
|
import { transformReplyNumberInfinity, ZMember } from './generic-transformers';
|
||||||
import { ZMember } from './ZADD';
|
|
||||||
|
|
||||||
export const FIRST_KEY_INDEX = 1;
|
export const FIRST_KEY_INDEX = 1;
|
||||||
|
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
import { transformReplyNumberInfinity } from './generic-transformers';
|
import { transformReplyNumberInfinity, ZMember } from './generic-transformers';
|
||||||
import { ZMember } from './ZADD';
|
|
||||||
|
|
||||||
export const FIRST_KEY_INDEX = 1;
|
export const FIRST_KEY_INDEX = 1;
|
||||||
|
|
||||||
|
@@ -3,29 +3,13 @@ import { TestRedisServers, itWithClient } from '../test-utils';
|
|||||||
import { transformArguments } from './HRANDFIELD';
|
import { transformArguments } from './HRANDFIELD';
|
||||||
|
|
||||||
describe('HRANDFIELD', () => {
|
describe('HRANDFIELD', () => {
|
||||||
describe('transformArguments', () => {
|
it('transformArguments', () => {
|
||||||
it('simple', () => {
|
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
transformArguments('key'),
|
transformArguments('key'),
|
||||||
['HRANDFIELD', 'key']
|
['HRANDFIELD', 'key']
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('with count', () => {
|
|
||||||
assert.deepEqual(
|
|
||||||
transformArguments('key', 1),
|
|
||||||
['HRANDFIELD', 'key', '1']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('with count & values', () => {
|
|
||||||
assert.deepEqual(
|
|
||||||
transformArguments('key', 1, true),
|
|
||||||
['HRANDFIELD', 'key', '1', 'WITHVALUES']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
itWithClient(TestRedisServers.OPEN, 'client.hRandField', async client => {
|
itWithClient(TestRedisServers.OPEN, 'client.hRandField', async client => {
|
||||||
assert.equal(
|
assert.equal(
|
||||||
await client.hRandField('key'),
|
await client.hRandField('key'),
|
||||||
|
@@ -1,21 +1,9 @@
|
|||||||
import { transformReplyStringArray } from './generic-transformers';
|
import { transformReplyString } from './generic-transformers';
|
||||||
|
|
||||||
export const FIRST_KEY_INDEX = 1;
|
export const FIRST_KEY_INDEX = 1;
|
||||||
|
|
||||||
export function transformArguments(key: string, count?: number, withValues?: boolean): Array<string> {
|
export function transformArguments(key: string): Array<string> {
|
||||||
const args = ['HRANDFIELD', key];
|
return ['HRANDFIELD', key];
|
||||||
if (count) {
|
|
||||||
args.push(count.toString());
|
|
||||||
|
|
||||||
if (withValues) {
|
|
||||||
args.push('WITHVALUES');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return args;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function transformReply(reply: null | string | Array<string>): null | string | Array<string> {
|
export const transformReply = transformReplyString;
|
||||||
// TODO: convert to object when `withValues`?
|
|
||||||
return reply;
|
|
||||||
};
|
|
19
lib/commands/HRANDFIELD_COUNT.spec.ts
Normal file
19
lib/commands/HRANDFIELD_COUNT.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './HRANDFIELD_COUNT';
|
||||||
|
|
||||||
|
describe('HRANDFIELD COUNT', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 1),
|
||||||
|
['HRANDFIELD', 'key', '1']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.hRandFieldCount', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.hRandFieldCount('key', 1),
|
||||||
|
null
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
14
lib/commands/HRANDFIELD_COUNT.ts
Normal file
14
lib/commands/HRANDFIELD_COUNT.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { transformArguments as transformHRandFieldArguments } from './HRANDFIELD';
|
||||||
|
|
||||||
|
export { FIRST_KEY_INDEX } from './HRANDFIELD';
|
||||||
|
|
||||||
|
export function transformArguments(key: string, count: number): Array<string> {
|
||||||
|
return [
|
||||||
|
...transformHRandFieldArguments(key),
|
||||||
|
count.toString()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function transformReply(reply: Array<string> | null): Array<string> | null {
|
||||||
|
return reply;
|
||||||
|
}
|
19
lib/commands/HRANDFIELD_COUNT_WITHVALUES.spec.ts
Normal file
19
lib/commands/HRANDFIELD_COUNT_WITHVALUES.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './HRANDFIELD_COUNT_WITHVALUES';
|
||||||
|
|
||||||
|
describe('HRANDFIELD COUNT WITHVALUES', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 1),
|
||||||
|
['HRANDFIELD', 'key', '1', 'WITHVALUES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.hRandFieldCountWithValues', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.hRandFieldCountWithValues('key', 1),
|
||||||
|
null
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
17
lib/commands/HRANDFIELD_COUNT_WITHVALUES.ts
Normal file
17
lib/commands/HRANDFIELD_COUNT_WITHVALUES.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import { transformReplyTupels, TupelsObject } from './generic-transformers';
|
||||||
|
import { transformArguments as transformHRandFieldCountArguments } from './HRANDFIELD_COUNT';
|
||||||
|
|
||||||
|
export { FIRST_KEY_INDEX } from './HRANDFIELD_COUNT';
|
||||||
|
|
||||||
|
export function transformArguments(key: string, count: number): Array<string> {
|
||||||
|
return [
|
||||||
|
...transformHRandFieldCountArguments(key, count),
|
||||||
|
'WITHVALUES'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function transformReply(reply: Array<string> | null): TupelsObject | null {
|
||||||
|
if (reply === null) return null;
|
||||||
|
|
||||||
|
return transformReplyTupels(reply);
|
||||||
|
}
|
@@ -3,22 +3,13 @@ import { TestRedisServers, itWithClient } from '../test-utils';
|
|||||||
import { transformArguments } from './SRANDMEMBER';
|
import { transformArguments } from './SRANDMEMBER';
|
||||||
|
|
||||||
describe('SRANDMEMBER', () => {
|
describe('SRANDMEMBER', () => {
|
||||||
describe('transformArguments', () => {
|
it('transformArguments', () => {
|
||||||
it('simple', () => {
|
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
transformArguments('key'),
|
transformArguments('key'),
|
||||||
['SRANDMEMBER', 'key']
|
['SRANDMEMBER', 'key']
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('with count', () => {
|
|
||||||
assert.deepEqual(
|
|
||||||
transformArguments('key', 2),
|
|
||||||
['SRANDMEMBER', 'key', '2']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
itWithClient(TestRedisServers.OPEN, 'client.sRandMember', async client => {
|
itWithClient(TestRedisServers.OPEN, 'client.sRandMember', async client => {
|
||||||
assert.equal(
|
assert.equal(
|
||||||
await client.sRandMember('key'),
|
await client.sRandMember('key'),
|
||||||
|
@@ -1,16 +1,9 @@
|
|||||||
import { transformReplyStringArray } from './generic-transformers';
|
import { transformReplyStringNull } from './generic-transformers';
|
||||||
|
|
||||||
export const FIRST_KEY_INDEX = 1;
|
export const FIRST_KEY_INDEX = 1;
|
||||||
|
|
||||||
export function transformArguments(key: string, count?: number): Array<string> {
|
export function transformArguments(key: string): Array<string> {
|
||||||
const args = ['SRANDMEMBER', key];
|
return ['SRANDMEMBER', key];
|
||||||
|
|
||||||
if (typeof count === 'number') {
|
|
||||||
args.push(count.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
return args;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: without `count` it'll return "bulk string" and not "array"
|
export const transformReply = transformReplyStringNull;
|
||||||
export const transformReply = transformReplyStringArray;
|
|
||||||
|
19
lib/commands/SRANDMEMBER_COUNT.spec.ts
Normal file
19
lib/commands/SRANDMEMBER_COUNT.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './SRANDMEMBER_COUNT';
|
||||||
|
|
||||||
|
describe('SRANDMEMBER COUNT', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 1),
|
||||||
|
['SRANDMEMBER', 'key', '1']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.sRandMemberCount', async client => {
|
||||||
|
assert.deepEqual(
|
||||||
|
await client.sRandMemberCount('key', 1),
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
13
lib/commands/SRANDMEMBER_COUNT.ts
Normal file
13
lib/commands/SRANDMEMBER_COUNT.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import { transformReplyStringArray } from './generic-transformers';
|
||||||
|
import { transformArguments as transformSRandMemberArguments } from './SRANDMEMBER';
|
||||||
|
|
||||||
|
export { FIRST_KEY_INDEX } from './SRANDMEMBER';
|
||||||
|
|
||||||
|
export function transformArguments(key: string, count: number): Array<string> {
|
||||||
|
return [
|
||||||
|
...transformSRandMemberArguments(key),
|
||||||
|
count.toString()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const transformReply = transformReplyStringArray;
|
@@ -1,4 +1,4 @@
|
|||||||
import { StreamMessage, transformReplyString } from './generic-transformers';
|
import { TupelsObject, transformReplyString } from './generic-transformers';
|
||||||
|
|
||||||
export const FIRST_KEY_INDEX = 1;
|
export const FIRST_KEY_INDEX = 1;
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@ interface XAddOptions {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function transformArguments(key: string, id: string, message: StreamMessage, options?: XAddOptions): Array<string> {
|
export function transformArguments(key: string, id: string, message: TupelsObject, options?: XAddOptions): Array<string> {
|
||||||
const args = ['XADD', key];
|
const args = ['XADD', key];
|
||||||
|
|
||||||
if (options?.NOMKSTREAM) {
|
if (options?.NOMKSTREAM) {
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { StreamMessageReply, transformReplyStreamMessage } from './generic-transformers';
|
import { StreamMessageReply, transformReplyTupels } from './generic-transformers';
|
||||||
|
|
||||||
export const FIRST_KEY_INDEX = 2;
|
export const FIRST_KEY_INDEX = 2;
|
||||||
|
|
||||||
@@ -27,11 +27,11 @@ export function transformReply(reply: Array<any>): XInfoStreamReply {
|
|||||||
groups: reply[9],
|
groups: reply[9],
|
||||||
firstEntry: reply[11] ? {
|
firstEntry: reply[11] ? {
|
||||||
id: reply[11][0] ?? null,
|
id: reply[11][0] ?? null,
|
||||||
message: transformReplyStreamMessage(reply[11][1])
|
message: transformReplyTupels(reply[11][1])
|
||||||
} : null,
|
} : null,
|
||||||
lastEntry: reply[13] ? {
|
lastEntry: reply[13] ? {
|
||||||
id: reply[13][0],
|
id: reply[13][0],
|
||||||
message: transformReplyStreamMessage(reply[13][1])
|
message: transformReplyTupels(reply[13][1])
|
||||||
} : null
|
} : null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { transformArgumentNumberInfinity, transformReplyNumberInfinity } from './generic-transformers';
|
import { transformArgumentNumberInfinity, transformReplyNumberInfinity, ZMember } from './generic-transformers';
|
||||||
|
|
||||||
export const FIRST_KEY_INDEX = 1;
|
export const FIRST_KEY_INDEX = 1;
|
||||||
|
|
||||||
@@ -28,11 +28,6 @@ interface INCR {
|
|||||||
|
|
||||||
type ZAddOptions = (NX | (XX & LT & GT)) & CH & INCR;
|
type ZAddOptions = (NX | (XX & LT & GT)) & CH & INCR;
|
||||||
|
|
||||||
export interface ZMember {
|
|
||||||
score: number;
|
|
||||||
value: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function transformArguments(key: string, members: ZMember | Array<ZMember>, options?: ZAddOptions): Array<string> {
|
export function transformArguments(key: string, members: ZMember | Array<ZMember>, options?: ZAddOptions): Array<string> {
|
||||||
const args = ['ZADD', key];
|
const args = ['ZADD', key];
|
||||||
|
|
||||||
|
@@ -17,15 +17,6 @@ describe('ZDIFF', () => {
|
|||||||
['ZDIFF', '2', '1', '2']
|
['ZDIFF', '2', '1', '2']
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('WITHSCORES', () => {
|
|
||||||
assert.deepEqual(
|
|
||||||
transformArguments('key', {
|
|
||||||
WITHSCORES: true
|
|
||||||
}),
|
|
||||||
['ZDIFF', '1', 'key', 'WITHSCORES']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
itWithClient(TestRedisServers.OPEN, 'client.zDiff', async client => {
|
itWithClient(TestRedisServers.OPEN, 'client.zDiff', async client => {
|
||||||
|
@@ -4,11 +4,7 @@ export const FIRST_KEY_INDEX = 2;
|
|||||||
|
|
||||||
export const IS_READ_ONLY = true;
|
export const IS_READ_ONLY = true;
|
||||||
|
|
||||||
interface ZDiffOptions {
|
export function transformArguments(keys: Array<string> | string): Array<string> {
|
||||||
WITHSCORES?: true;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function transformArguments(keys: Array<string> | string, options?: ZDiffOptions): Array<string> {
|
|
||||||
const args = ['ZDIFF'];
|
const args = ['ZDIFF'];
|
||||||
|
|
||||||
if (typeof keys === 'string') {
|
if (typeof keys === 'string') {
|
||||||
@@ -17,12 +13,7 @@ export function transformArguments(keys: Array<string> | string, options?: ZDiff
|
|||||||
args.push(keys.length.toString(), ...keys);
|
args.push(keys.length.toString(), ...keys);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options?.WITHSCORES) {
|
|
||||||
args.push('WITHSCORES');
|
|
||||||
}
|
|
||||||
|
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: convert to `Array<ZMember>` when "WITHSCORES"
|
|
||||||
export const transformReply = transformReplyStringArray;
|
export const transformReply = transformReplyStringArray;
|
||||||
|
28
lib/commands/ZDIFF_WITHSCORES.spec.ts
Normal file
28
lib/commands/ZDIFF_WITHSCORES.spec.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './ZDIFF_WITHSCORES';
|
||||||
|
|
||||||
|
describe('ZDIFF WITHSCORES', () => {
|
||||||
|
describe('transformArguments', () => {
|
||||||
|
it('string', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key'),
|
||||||
|
['ZDIFF', '1', 'key', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('array', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments(['1', '2']),
|
||||||
|
['ZDIFF', '2', '1', '2', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.zDiffWithScores', async client => {
|
||||||
|
assert.deepEqual(
|
||||||
|
await client.zDiffWithScores('key'),
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
13
lib/commands/ZDIFF_WITHSCORES.ts
Normal file
13
lib/commands/ZDIFF_WITHSCORES.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import { transformReplySortedSetWithScores } from './generic-transformers';
|
||||||
|
import { transformArguments as transformZDiffArguments } from './ZDIFF';
|
||||||
|
|
||||||
|
export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZDIFF';
|
||||||
|
|
||||||
|
export function transformArguments(...args: Parameters<typeof transformZDiffArguments>): Array<string> {
|
||||||
|
return [
|
||||||
|
...transformZDiffArguments(...args),
|
||||||
|
'WITHSCORES'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const transformReply = transformReplySortedSetWithScores;
|
@@ -36,23 +36,13 @@ describe('ZINTER', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('with WITHSCORES', () => {
|
it('with WEIGHTS, AGGREGATE', () => {
|
||||||
assert.deepEqual(
|
|
||||||
transformArguments('key', {
|
|
||||||
WITHSCORES: true
|
|
||||||
}),
|
|
||||||
['ZINTER', '1', 'key', 'WITHSCORES']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('with WEIGHTS, AGGREGATE, WITHSCORES', () => {
|
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
transformArguments('key', {
|
transformArguments('key', {
|
||||||
WEIGHTS: [1],
|
WEIGHTS: [1],
|
||||||
AGGREGATE: 'SUM',
|
AGGREGATE: 'SUM'
|
||||||
WITHSCORES: true
|
|
||||||
}),
|
}),
|
||||||
['ZINTER', '1', 'key', 'WEIGHTS', '1', 'AGGREGATE', 'SUM', 'WITHSCORES']
|
['ZINTER', '1', 'key', 'WEIGHTS', '1', 'AGGREGATE', 'SUM']
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -7,7 +7,6 @@ export const IS_READ_ONLY = true;
|
|||||||
interface ZInterOptions {
|
interface ZInterOptions {
|
||||||
WEIGHTS?: Array<number>;
|
WEIGHTS?: Array<number>;
|
||||||
AGGREGATE?: 'SUM' | 'MIN' | 'MAX';
|
AGGREGATE?: 'SUM' | 'MIN' | 'MAX';
|
||||||
WITHSCORES?: true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function transformArguments(keys: Array<string> | string, options?: ZInterOptions): Array<string> {
|
export function transformArguments(keys: Array<string> | string, options?: ZInterOptions): Array<string> {
|
||||||
@@ -30,12 +29,7 @@ export function transformArguments(keys: Array<string> | string, options?: ZInte
|
|||||||
args.push('AGGREGATE', options?.AGGREGATE);
|
args.push('AGGREGATE', options?.AGGREGATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options?.WITHSCORES) {
|
|
||||||
args.push('WITHSCORES');
|
|
||||||
}
|
|
||||||
|
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: convert to `Array<ZMember>` when "WITHSCORES"
|
|
||||||
export const transformReply = transformReplyStringArray;
|
export const transformReply = transformReplyStringArray;
|
||||||
|
56
lib/commands/ZINTER_WITHSCORES.spec.ts
Normal file
56
lib/commands/ZINTER_WITHSCORES.spec.ts
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './ZINTER_WITHSCORES';
|
||||||
|
|
||||||
|
describe('ZINTER WITHSCORES', () => {
|
||||||
|
describe('transformArguments', () => {
|
||||||
|
it('key (string)', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key'),
|
||||||
|
['ZINTER', '1', 'key', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('keys (array)', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments(['1', '2']),
|
||||||
|
['ZINTER', '2', '1', '2', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('with WEIGHTS', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', {
|
||||||
|
WEIGHTS: [1]
|
||||||
|
}),
|
||||||
|
['ZINTER', '1', 'key', 'WEIGHTS', '1', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('with AGGREGATE', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', {
|
||||||
|
AGGREGATE: 'SUM'
|
||||||
|
}),
|
||||||
|
['ZINTER', '1', 'key', 'AGGREGATE', 'SUM', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('with WEIGHTS, AGGREGATE', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', {
|
||||||
|
WEIGHTS: [1],
|
||||||
|
AGGREGATE: 'SUM'
|
||||||
|
}),
|
||||||
|
['ZINTER', '1', 'key', 'WEIGHTS', '1', 'AGGREGATE', 'SUM', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.zInterWithScores', async client => {
|
||||||
|
assert.deepEqual(
|
||||||
|
await client.zInterWithScores('key'),
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
13
lib/commands/ZINTER_WITHSCORES.ts
Normal file
13
lib/commands/ZINTER_WITHSCORES.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import { transformReplySortedSetWithScores } from './generic-transformers';
|
||||||
|
import { transformArguments as transformZInterArguments } from './ZINTER';
|
||||||
|
|
||||||
|
export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZINTER';
|
||||||
|
|
||||||
|
export function transformArguments(...args: Parameters<typeof transformZInterArguments>): Array<string> {
|
||||||
|
return [
|
||||||
|
...transformZInterArguments(...args),
|
||||||
|
'WITHSCORES'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const transformReply = transformReplySortedSetWithScores;
|
@@ -3,22 +3,13 @@ import { TestRedisServers, itWithClient } from '../test-utils';
|
|||||||
import { transformArguments } from './ZPOPMAX';
|
import { transformArguments } from './ZPOPMAX';
|
||||||
|
|
||||||
describe('ZPOPMAX', () => {
|
describe('ZPOPMAX', () => {
|
||||||
describe('transformArguments', () => {
|
it('transformArguments', () => {
|
||||||
it('simple', () => {
|
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
transformArguments('key'),
|
transformArguments('key'),
|
||||||
['ZPOPMAX', 'key']
|
['ZPOPMAX', 'key']
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('with count', () => {
|
|
||||||
assert.deepEqual(
|
|
||||||
transformArguments('key', 1),
|
|
||||||
['ZPOPMAX', 'key', '1']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
itWithClient(TestRedisServers.OPEN, 'client.zPopMax', async client => {
|
itWithClient(TestRedisServers.OPEN, 'client.zPopMax', async client => {
|
||||||
assert.equal(
|
assert.equal(
|
||||||
await client.zPopMax('key'),
|
await client.zPopMax('key'),
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
import { transformReplyNumberInfinity } from './generic-transformers';
|
import { transformReplyNumberInfinity, ZMember } from './generic-transformers';
|
||||||
import { ZMember } from './ZADD';
|
|
||||||
|
|
||||||
export const FIRST_KEY_INDEX = 1;
|
export const FIRST_KEY_INDEX = 1;
|
||||||
|
|
||||||
@@ -16,7 +15,6 @@ export function transformArguments(key: string, count?: number): Array<string> {
|
|||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO return type should be `ZMember` when count is 1 or undefined
|
|
||||||
export function transformReply(reply: [string, string] | []): ZMember | null {
|
export function transformReply(reply: [string, string] | []): ZMember | null {
|
||||||
if (!reply.length) return null;
|
if (!reply.length) return null;
|
||||||
|
|
||||||
|
19
lib/commands/ZPOPMAX_COUNT.spec.ts
Normal file
19
lib/commands/ZPOPMAX_COUNT.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './ZPOPMAX_COUNT';
|
||||||
|
|
||||||
|
describe('ZPOPMAX COUNT', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 1),
|
||||||
|
['ZPOPMAX', 'key', '1']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.zPopMaxCount', async client => {
|
||||||
|
assert.deepEqual(
|
||||||
|
await client.zPopMaxCount('key', 1),
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
14
lib/commands/ZPOPMAX_COUNT.ts
Normal file
14
lib/commands/ZPOPMAX_COUNT.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { deepEqual } from 'assert/strict';
|
||||||
|
import { transformReplySortedSetWithScores } from './generic-transformers';
|
||||||
|
import { transformArguments as transformZPopMaxArguments } from './ZPOPMAX';
|
||||||
|
|
||||||
|
export { FIRST_KEY_INDEX } from './ZPOPMAX';
|
||||||
|
|
||||||
|
export function transformArguments(key: string, count: number): Array<string> {
|
||||||
|
return [
|
||||||
|
...transformZPopMaxArguments(key),
|
||||||
|
count.toString()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const transformReply = transformReplySortedSetWithScores;
|
@@ -3,22 +3,13 @@ import { TestRedisServers, itWithClient } from '../test-utils';
|
|||||||
import { transformArguments } from './ZPOPMIN';
|
import { transformArguments } from './ZPOPMIN';
|
||||||
|
|
||||||
describe('ZPOPMIN', () => {
|
describe('ZPOPMIN', () => {
|
||||||
describe('transformArguments', () => {
|
it('transformArguments', () => {
|
||||||
it('simple', () => {
|
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
transformArguments('key'),
|
transformArguments('key'),
|
||||||
['ZPOPMIN', 'key']
|
['ZPOPMIN', 'key']
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('with count', () => {
|
|
||||||
assert.deepEqual(
|
|
||||||
transformArguments('key', 1),
|
|
||||||
['ZPOPMIN', 'key', '1']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
itWithClient(TestRedisServers.OPEN, 'client.zPopMin', async client => {
|
itWithClient(TestRedisServers.OPEN, 'client.zPopMin', async client => {
|
||||||
assert.equal(
|
assert.equal(
|
||||||
await client.zPopMin('key'),
|
await client.zPopMin('key'),
|
||||||
|
@@ -1,22 +1,14 @@
|
|||||||
import { transformReplyNumberInfinity } from './generic-transformers';
|
import { transformReplyNumberInfinity, ZMember } from './generic-transformers';
|
||||||
import { ZMember } from './ZADD';
|
|
||||||
|
|
||||||
export const FIRST_KEY_INDEX = 1;
|
export const FIRST_KEY_INDEX = 1;
|
||||||
|
|
||||||
export function transformArguments(key: string, count?: number): Array<string> {
|
export function transformArguments(key: string): Array<string> {
|
||||||
const args = [
|
return [
|
||||||
'ZPOPMIN',
|
'ZPOPMIN',
|
||||||
key
|
key
|
||||||
];
|
];
|
||||||
|
|
||||||
if (typeof count === 'number') {
|
|
||||||
args.push(count.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
return args;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO return type should be `ZMember` when count is 1 or undefined
|
|
||||||
export function transformReply(reply: [string, string] | []): ZMember | null {
|
export function transformReply(reply: [string, string] | []): ZMember | null {
|
||||||
if (!reply.length) return null;
|
if (!reply.length) return null;
|
||||||
|
|
||||||
|
19
lib/commands/ZPOPMIN_COUNT.spec.ts
Normal file
19
lib/commands/ZPOPMIN_COUNT.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './ZPOPMIN_COUNT';
|
||||||
|
|
||||||
|
describe('ZPOPMIN COUNT', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 1),
|
||||||
|
['ZPOPMIN', 'key', '1']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.zPopMinCount', async client => {
|
||||||
|
assert.deepEqual(
|
||||||
|
await client.zPopMinCount('key', 1),
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
13
lib/commands/ZPOPMIN_COUNT.ts
Normal file
13
lib/commands/ZPOPMIN_COUNT.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import { transformReplySortedSetWithScores } from './generic-transformers';
|
||||||
|
import { transformArguments as transformZPopMinArguments } from './ZPOPMIN';
|
||||||
|
|
||||||
|
export { FIRST_KEY_INDEX } from './ZPOPMIN';
|
||||||
|
|
||||||
|
export function transformArguments(key: string, count: number): Array<string> {
|
||||||
|
return [
|
||||||
|
...transformZPopMinArguments(key),
|
||||||
|
count.toString()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const transformReply = transformReplySortedSetWithScores;
|
@@ -3,29 +3,13 @@ import { TestRedisServers, itWithClient } from '../test-utils';
|
|||||||
import { transformArguments } from './ZRANDMEMBER';
|
import { transformArguments } from './ZRANDMEMBER';
|
||||||
|
|
||||||
describe('ZRANDMEMBER', () => {
|
describe('ZRANDMEMBER', () => {
|
||||||
describe('transformArguments', () => {
|
it('transformArguments', () => {
|
||||||
it('simple', () => {
|
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
transformArguments('key'),
|
transformArguments('key'),
|
||||||
['ZRANDMEMBER', 'key']
|
['ZRANDMEMBER', 'key']
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('with count', () => {
|
|
||||||
assert.deepEqual(
|
|
||||||
transformArguments('key', 1),
|
|
||||||
['ZRANDMEMBER', 'key', '1']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('with count, WITHSCORES', () => {
|
|
||||||
assert.deepEqual(
|
|
||||||
transformArguments('key', 1, true),
|
|
||||||
['ZRANDMEMBER', 'key', '1', 'WITHSCORES']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
itWithClient(TestRedisServers.OPEN, 'client.zRandMember', async client => {
|
itWithClient(TestRedisServers.OPEN, 'client.zRandMember', async client => {
|
||||||
assert.equal(
|
assert.equal(
|
||||||
await client.zRandMember('key'),
|
await client.zRandMember('key'),
|
||||||
|
@@ -1,22 +1,11 @@
|
|||||||
|
import { transformReplyStringNull } from './generic-transformers';
|
||||||
|
|
||||||
|
export const FIRST_KEY_INDEX = 1;
|
||||||
|
|
||||||
export const IS_READ_ONLY = true;
|
export const IS_READ_ONLY = true;
|
||||||
|
|
||||||
export function transformArguments(key: string, count?: number, WITHSCORES?: true): Array<string> {
|
export function transformArguments(key: string): Array<string> {
|
||||||
const args = ['ZRANDMEMBER', key];
|
return ['ZRANDMEMBER', key];
|
||||||
|
|
||||||
if (typeof count === 'number') {
|
|
||||||
args.push(count.toString());
|
|
||||||
|
|
||||||
if (WITHSCORES) {
|
|
||||||
args.push('WITHSCORES');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return args;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: string when count is 1 or undefined, array when count is > 1, object when WITHSCORES
|
export const transformReply = transformReplyStringNull;
|
||||||
type ZRandMemberReply = string | Array<string> | null
|
|
||||||
|
|
||||||
export function transformReply(reply: ZRandMemberReply): ZRandMemberReply {
|
|
||||||
return reply;
|
|
||||||
}
|
|
||||||
|
19
lib/commands/ZRANDMEMBER_COUNT.spec.ts
Normal file
19
lib/commands/ZRANDMEMBER_COUNT.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './ZRANDMEMBER_COUNT';
|
||||||
|
|
||||||
|
describe('ZRANDMEMBER COUNT', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 1),
|
||||||
|
['ZRANDMEMBER', 'key', '1']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.zRandMemberCount', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.zRandMemberCount('key', 1),
|
||||||
|
null
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
14
lib/commands/ZRANDMEMBER_COUNT.ts
Normal file
14
lib/commands/ZRANDMEMBER_COUNT.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { transformArguments as transformZRandMemberArguments } from './ZRANDMEMBER';
|
||||||
|
|
||||||
|
export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZRANDMEMBER';
|
||||||
|
|
||||||
|
export function transformArguments(key: string, count: number): Array<string> {
|
||||||
|
return [
|
||||||
|
...transformZRandMemberArguments(key),
|
||||||
|
count.toString()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function transformReply(reply: Array<string> | null): Array<string> | null {
|
||||||
|
return reply;
|
||||||
|
}
|
19
lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.spec.ts
Normal file
19
lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './ZRANDMEMBER_COUNT_WITHSCORES';
|
||||||
|
|
||||||
|
describe('ZRANDMEMBER COUNT WITHSCORES', () => {
|
||||||
|
it('transformArguments', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', 1),
|
||||||
|
['ZRANDMEMBER', 'key', '1', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.zRandMemberCountWithScores', async client => {
|
||||||
|
assert.equal(
|
||||||
|
await client.zRandMemberCountWithScores('key', 1),
|
||||||
|
null
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
17
lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.ts
Normal file
17
lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import { transformReplySortedSetWithScores, ZMember } from './generic-transformers';
|
||||||
|
import { transformArguments as transformZRandMemberCountArguments } from './ZRANDMEMBER_COUNT';
|
||||||
|
|
||||||
|
export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZRANDMEMBER_COUNT';
|
||||||
|
|
||||||
|
export function transformArguments(...args: Parameters<typeof transformZRandMemberCountArguments>): Array<string> {
|
||||||
|
return [
|
||||||
|
...transformZRandMemberCountArguments(...args),
|
||||||
|
'WITHSCORES'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function transformReply(reply: Array<string> | null): Array<ZMember> | null {
|
||||||
|
if (reply === null) return null;
|
||||||
|
|
||||||
|
return transformReplySortedSetWithScores(reply);
|
||||||
|
}
|
@@ -41,18 +41,6 @@ describe('ZRANGE', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('with WITHSCORES', () => {
|
|
||||||
assert.deepEqual(
|
|
||||||
transformArguments('src', 0, 1, {
|
|
||||||
LIMIT: {
|
|
||||||
offset: 0,
|
|
||||||
count: 1
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
['ZRANGE', 'src', '0', '1', 'LIMIT', '0', '1']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('with BY & REV & LIMIT', () => {
|
it('with BY & REV & LIMIT', () => {
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
transformArguments('src', 0, 1, {
|
transformArguments('src', 0, 1, {
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { transformArgumentNumberInfinity, transformReplyNumber, transformReplyStringArray } from './generic-transformers';
|
import { transformReplyStringArray } from './generic-transformers';
|
||||||
|
|
||||||
export const FIRST_KEY_INDEX = 1;
|
export const FIRST_KEY_INDEX = 1;
|
||||||
|
|
||||||
@@ -11,15 +11,14 @@ interface ZRangeOptions {
|
|||||||
offset: number;
|
offset: number;
|
||||||
count: number;
|
count: number;
|
||||||
};
|
};
|
||||||
WITHSCORES?: true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function transformArguments(src: string, min: number, max: number, options?: ZRangeOptions): Array<string> {
|
export function transformArguments(src: string, min: string | number, max: string | number, options?: ZRangeOptions): Array<string> {
|
||||||
const args = [
|
const args = [
|
||||||
'ZRANGE',
|
'ZRANGE',
|
||||||
src,
|
src,
|
||||||
transformArgumentNumberInfinity(min),
|
typeof min === 'string' ? min : min.toString(),
|
||||||
transformArgumentNumberInfinity(max)
|
typeof max === 'string' ? max : max.toString()
|
||||||
];
|
];
|
||||||
|
|
||||||
switch (options?.BY) {
|
switch (options?.BY) {
|
||||||
@@ -40,12 +39,7 @@ export function transformArguments(src: string, min: number, max: number, option
|
|||||||
args.push('LIMIT', options.LIMIT.offset.toString(), options.LIMIT.count.toString());
|
args.push('LIMIT', options.LIMIT.offset.toString(), options.LIMIT.count.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options?.WITHSCORES) {
|
|
||||||
args.push('WITHSCORES');
|
|
||||||
}
|
|
||||||
|
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: convert to `ZMember` when "WITHSCORES"
|
|
||||||
export const transformReply = transformReplyStringArray;
|
export const transformReply = transformReplyStringArray;
|
||||||
|
65
lib/commands/ZRANGE_WITHSCORES.spec.ts
Normal file
65
lib/commands/ZRANGE_WITHSCORES.spec.ts
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './ZRANGE_WITHSCORES';
|
||||||
|
|
||||||
|
describe('ZRANGE WITHSCORES', () => {
|
||||||
|
describe('transformArguments', () => {
|
||||||
|
it('simple', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('src', 0, 1),
|
||||||
|
['ZRANGE', 'src', '0', '1', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('with BY', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('src', 0, 1, {
|
||||||
|
BY: 'SCORE'
|
||||||
|
}),
|
||||||
|
['ZRANGE', 'src', '0', '1', 'BYSCORE', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('with REV', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('src', 0, 1, {
|
||||||
|
REV: true
|
||||||
|
}),
|
||||||
|
['ZRANGE', 'src', '0', '1', 'REV', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('with LIMIT', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('src', 0, 1, {
|
||||||
|
LIMIT: {
|
||||||
|
offset: 0,
|
||||||
|
count: 1
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
['ZRANGE', 'src', '0', '1', 'LIMIT', '0', '1', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('with BY & REV & LIMIT', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('src', 0, 1, {
|
||||||
|
BY: 'SCORE',
|
||||||
|
REV: true,
|
||||||
|
LIMIT: {
|
||||||
|
offset: 0,
|
||||||
|
count: 1
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
['ZRANGE', 'src', '0', '1', 'BYSCORE', 'REV', 'LIMIT', '0', '1', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.zRangeWithScores', async client => {
|
||||||
|
assert.deepEqual(
|
||||||
|
await client.zRangeWithScores('src', 0, 1),
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
13
lib/commands/ZRANGE_WITHSCORES.ts
Normal file
13
lib/commands/ZRANGE_WITHSCORES.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import { transformReplySortedSetWithScores } from './generic-transformers';
|
||||||
|
import { transformArguments as transformZRangeArguments } from './ZRANGE';
|
||||||
|
|
||||||
|
export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZRANGE';
|
||||||
|
|
||||||
|
export function transformArguments(...args: Parameters<typeof transformZRangeArguments>): Array<string> {
|
||||||
|
return [
|
||||||
|
...transformZRangeArguments(...args),
|
||||||
|
'WITHSCORES'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const transformReply = transformReplySortedSetWithScores;
|
@@ -1,5 +1,4 @@
|
|||||||
import { ScanOptions, transformReplyNumberInfinity, transformScanArguments } from './generic-transformers';
|
import { ScanOptions, transformReplyNumberInfinity, transformScanArguments, ZMember } from './generic-transformers';
|
||||||
import { ZMember } from './ZADD';
|
|
||||||
|
|
||||||
export const FIRST_KEY_INDEX = 1;
|
export const FIRST_KEY_INDEX = 1;
|
||||||
|
|
||||||
|
@@ -35,15 +35,6 @@ describe('ZUNION', () => {
|
|||||||
['ZUNION', '1', 'key', 'AGGREGATE', 'SUM']
|
['ZUNION', '1', 'key', 'AGGREGATE', 'SUM']
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('with WITHSCORES', () => {
|
|
||||||
assert.deepEqual(
|
|
||||||
transformArguments('key', {
|
|
||||||
WITHSCORES: true
|
|
||||||
}),
|
|
||||||
['ZUNION', '1', 'key', 'WITHSCORES']
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
itWithClient(TestRedisServers.OPEN, 'client.zUnion', async client => {
|
itWithClient(TestRedisServers.OPEN, 'client.zUnion', async client => {
|
||||||
|
@@ -7,7 +7,6 @@ export const IS_READ_ONLY = true;
|
|||||||
interface ZUnionOptions {
|
interface ZUnionOptions {
|
||||||
WEIGHTS?: Array<number>;
|
WEIGHTS?: Array<number>;
|
||||||
AGGREGATE?: 'SUM' | 'MIN' | 'MAX';
|
AGGREGATE?: 'SUM' | 'MIN' | 'MAX';
|
||||||
WITHSCORES?: true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function transformArguments(keys: Array<string> | string, options?: ZUnionOptions): Array<string> {
|
export function transformArguments(keys: Array<string> | string, options?: ZUnionOptions): Array<string> {
|
||||||
@@ -27,12 +26,7 @@ export function transformArguments(keys: Array<string> | string, options?: ZUnio
|
|||||||
args.push('AGGREGATE', options.AGGREGATE);
|
args.push('AGGREGATE', options.AGGREGATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options?.WITHSCORES) {
|
|
||||||
args.push('WITHSCORES');
|
|
||||||
}
|
|
||||||
|
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: convert to `Array<ZMember>` when "WITHSCORES"
|
|
||||||
export const transformReply = transformReplyStringArray;
|
export const transformReply = transformReplyStringArray;
|
||||||
|
46
lib/commands/ZUNION_WITHSCORES.spec.ts
Normal file
46
lib/commands/ZUNION_WITHSCORES.spec.ts
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
import { strict as assert } from 'assert';
|
||||||
|
import { TestRedisServers, itWithClient } from '../test-utils';
|
||||||
|
import { transformArguments } from './ZUNION_WITHSCORES';
|
||||||
|
|
||||||
|
describe('ZUNION WITHSCORES', () => {
|
||||||
|
describe('transformArguments', () => {
|
||||||
|
it('key (string)', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key'),
|
||||||
|
['ZUNION', '1', 'key', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('keys (array)', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments(['1', '2']),
|
||||||
|
['ZUNION', '2', '1', '2', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('with WEIGHTS', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', {
|
||||||
|
WEIGHTS: [1]
|
||||||
|
}),
|
||||||
|
['ZUNION', '1', 'key', 'WEIGHTS', '1', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('with AGGREGATE', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
transformArguments('key', {
|
||||||
|
AGGREGATE: 'SUM'
|
||||||
|
}),
|
||||||
|
['ZUNION', '1', 'key', 'AGGREGATE', 'SUM', 'WITHSCORES']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
itWithClient(TestRedisServers.OPEN, 'client.zUnionWithScores', async client => {
|
||||||
|
assert.deepEqual(
|
||||||
|
await client.zUnionWithScores('key'),
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
13
lib/commands/ZUNION_WITHSCORES.ts
Normal file
13
lib/commands/ZUNION_WITHSCORES.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import { transformReplySortedSetWithScores } from './generic-transformers';
|
||||||
|
import { transformArguments as transformZUnionArguments } from './ZUNION';
|
||||||
|
|
||||||
|
export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZUNION';
|
||||||
|
|
||||||
|
export function transformArguments(...args: Parameters<typeof transformZUnionArguments>): Array<string> {
|
||||||
|
return [
|
||||||
|
...transformZUnionArguments(...args),
|
||||||
|
'WITHSCORES'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const transformReply = transformReplySortedSetWithScores;
|
@@ -6,6 +6,10 @@ export function transformReplyString(reply: string): string {
|
|||||||
return reply;
|
return reply;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function transformReplyStringNull(reply: string | null): string | null {
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
|
|
||||||
export function transformReplyStringArray(reply: Array<string>): Array<string> {
|
export function transformReplyStringArray(reply: Array<string>): Array<string> {
|
||||||
return reply;
|
return reply;
|
||||||
}
|
}
|
||||||
@@ -89,11 +93,11 @@ export function transformArgumentNumberInfinity(num: number): string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface StreamMessage {
|
export interface TupelsObject {
|
||||||
[field: string]: string;
|
[field: string]: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function transformReplyStreamMessage(reply: Array<string>): StreamMessage {
|
export function transformReplyTupels(reply: Array<string>): TupelsObject {
|
||||||
const message = Object.create(null);
|
const message = Object.create(null);
|
||||||
|
|
||||||
for (let i = 0; i < reply.length; i += 2) {
|
for (let i = 0; i < reply.length; i += 2) {
|
||||||
@@ -105,7 +109,7 @@ export function transformReplyStreamMessage(reply: Array<string>): StreamMessage
|
|||||||
|
|
||||||
export interface StreamMessageReply {
|
export interface StreamMessageReply {
|
||||||
id: string;
|
id: string;
|
||||||
message: StreamMessage;
|
message: TupelsObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type StreamMessagesReply = Array<StreamMessageReply>;
|
export type StreamMessagesReply = Array<StreamMessageReply>;
|
||||||
@@ -116,7 +120,7 @@ export function transformReplyStreamMessages(reply: Array<any>): StreamMessagesR
|
|||||||
for (let i = 0; i < reply.length; i += 2) {
|
for (let i = 0; i < reply.length; i += 2) {
|
||||||
messages.push({
|
messages.push({
|
||||||
id: reply[i],
|
id: reply[i],
|
||||||
message: transformReplyStreamMessage(reply[i + 1])
|
message: transformReplyTupels(reply[i + 1])
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,7 +142,7 @@ export function transformReplyStreamsMessages(reply: Array<any>): StreamsMessage
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return streams
|
return streams;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function transformReplyStreamsMessagesNull(reply: Array<any> | null): StreamsMessagesReply | null {
|
export function transformReplyStreamsMessagesNull(reply: Array<any> | null): StreamsMessagesReply | null {
|
||||||
@@ -146,3 +150,21 @@ export function transformReplyStreamsMessagesNull(reply: Array<any> | null): Str
|
|||||||
|
|
||||||
return transformReplyStreamsMessages(reply);
|
return transformReplyStreamsMessages(reply);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ZMember {
|
||||||
|
score: number;
|
||||||
|
value: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function transformReplySortedSetWithScores(reply: Array<string>): Array<ZMember> {
|
||||||
|
const members = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < reply.length; i += 2) {
|
||||||
|
members.push({
|
||||||
|
value: reply[i],
|
||||||
|
score: transformReplyNumberInfinity(reply[i + 1])
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return members;
|
||||||
|
}
|
||||||
|
@@ -26,6 +26,8 @@ import * as HINCRBYFLOAT from './HINCRBYFLOAT';
|
|||||||
import * as HKEYS from './HKEYS';
|
import * as HKEYS from './HKEYS';
|
||||||
import * as HLEN from './HLEN';
|
import * as HLEN from './HLEN';
|
||||||
import * as HMGET from './HMGET';
|
import * as HMGET from './HMGET';
|
||||||
|
import * as HRANDFIELD_COUNT_WITHVALUES from './HRANDFIELD_COUNT_WITHVALUES';
|
||||||
|
import * as HRANDFIELD_COUNT from './HRANDFIELD_COUNT';
|
||||||
import * as HRANDFIELD from './HRANDFIELD';
|
import * as HRANDFIELD from './HRANDFIELD';
|
||||||
import * as HSET from './HSET';
|
import * as HSET from './HSET';
|
||||||
import * as HSETNX from './HSETNX';
|
import * as HSETNX from './HSETNX';
|
||||||
@@ -63,6 +65,7 @@ import * as SMISMEMBER from './SMISMEMBER';
|
|||||||
import * as SMOVE from './SMOVE';
|
import * as SMOVE from './SMOVE';
|
||||||
import * as SORT from './SORT';
|
import * as SORT from './SORT';
|
||||||
import * as SPOP from './SPOP';
|
import * as SPOP from './SPOP';
|
||||||
|
import * as SRANDMEMBER_COUNT from './SRANDMEMBER_COUNT';
|
||||||
import * as SRANDMEMBER from './SRANDMEMBER';
|
import * as SRANDMEMBER from './SRANDMEMBER';
|
||||||
import * as SREM from './SREM';
|
import * as SREM from './SREM';
|
||||||
import * as SSCAN from './SSCAN';
|
import * as SSCAN from './SSCAN';
|
||||||
@@ -97,16 +100,23 @@ import * as XTRIM from './XTRIM';
|
|||||||
import * as ZADD from './ZADD';
|
import * as ZADD from './ZADD';
|
||||||
import * as ZCARD from './ZCARD';
|
import * as ZCARD from './ZCARD';
|
||||||
import * as ZCOUNT from './ZCOUNT';
|
import * as ZCOUNT from './ZCOUNT';
|
||||||
|
import * as ZDIFF_WITHSCORES from './ZDIFF_WITHSCORES';
|
||||||
import * as ZDIFF from './ZDIFF';
|
import * as ZDIFF from './ZDIFF';
|
||||||
import * as ZDIFFSTORE from './ZDIFFSTORE';
|
import * as ZDIFFSTORE from './ZDIFFSTORE';
|
||||||
import * as ZINCRBY from './ZINCRBY';
|
import * as ZINCRBY from './ZINCRBY';
|
||||||
|
import * as ZINTER_WITHSCORES from './ZINTER_WITHSCORES';
|
||||||
import * as ZINTER from './ZINTER';
|
import * as ZINTER from './ZINTER';
|
||||||
import * as ZINTERSTORE from './ZINTERSTORE';
|
import * as ZINTERSTORE from './ZINTERSTORE';
|
||||||
import * as ZLEXCOUNT from './ZLEXCOUNT';
|
import * as ZLEXCOUNT from './ZLEXCOUNT';
|
||||||
import * as ZMSCORE from './ZMSCORE';
|
import * as ZMSCORE from './ZMSCORE';
|
||||||
|
import * as ZPOPMAX_COUNT from './ZPOPMAX_COUNT';
|
||||||
import * as ZPOPMAX from './ZPOPMAX';
|
import * as ZPOPMAX from './ZPOPMAX';
|
||||||
|
import * as ZPOPMIN_COUNT from './ZPOPMIN_COUNT';
|
||||||
import * as ZPOPMIN from './ZPOPMIN';
|
import * as ZPOPMIN from './ZPOPMIN';
|
||||||
|
import * as ZRANDMEMBER_COUNT_WITHSCORES from './ZRANDMEMBER_COUNT_WITHSCORES';
|
||||||
|
import * as ZRANDMEMBER_COUNT from './ZRANDMEMBER_COUNT';
|
||||||
import * as ZRANDMEMBER from './ZRANDMEMBER';
|
import * as ZRANDMEMBER from './ZRANDMEMBER';
|
||||||
|
import * as ZRANGE_WITHSCORES from './ZRANGE_WITHSCORES';
|
||||||
import * as ZRANGE from './ZRANGE';
|
import * as ZRANGE from './ZRANGE';
|
||||||
import * as ZRANGESTORE from './ZRANGESTORE';
|
import * as ZRANGESTORE from './ZRANGESTORE';
|
||||||
import * as ZRANK from './ZRANK';
|
import * as ZRANK from './ZRANK';
|
||||||
@@ -117,6 +127,7 @@ import * as ZREMRANGEBYSCORE from './ZREMRANGEBYSCORE';
|
|||||||
import * as ZREVRANK from './ZREVRANK';
|
import * as ZREVRANK from './ZREVRANK';
|
||||||
import * as ZSCAN from './ZSCAN';
|
import * as ZSCAN from './ZSCAN';
|
||||||
import * as ZSCORE from './ZSCORE';
|
import * as ZSCORE from './ZSCORE';
|
||||||
|
import * as ZUNION_WITHSCORES from './ZUNION_WITHSCORES';
|
||||||
import * as ZUNION from './ZUNION';
|
import * as ZUNION from './ZUNION';
|
||||||
import * as ZUNIONSTORE from './ZUNIONSTORE';
|
import * as ZUNIONSTORE from './ZUNIONSTORE';
|
||||||
|
|
||||||
@@ -177,6 +188,10 @@ export default {
|
|||||||
hLen: HLEN,
|
hLen: HLEN,
|
||||||
HMGET,
|
HMGET,
|
||||||
hmGet: HMGET,
|
hmGet: HMGET,
|
||||||
|
HRANDFIELD_COUNT_WITHVALUES,
|
||||||
|
hRandFieldCountWithValues: HRANDFIELD_COUNT_WITHVALUES,
|
||||||
|
HRANDFIELD_COUNT,
|
||||||
|
hRandFieldCount: HRANDFIELD_COUNT,
|
||||||
HRANDFIELD,
|
HRANDFIELD,
|
||||||
hRandField: HRANDFIELD,
|
hRandField: HRANDFIELD,
|
||||||
HSET,
|
HSET,
|
||||||
@@ -251,6 +266,8 @@ export default {
|
|||||||
sort: SORT,
|
sort: SORT,
|
||||||
SPOP,
|
SPOP,
|
||||||
sPop: SPOP,
|
sPop: SPOP,
|
||||||
|
SRANDMEMBER_COUNT,
|
||||||
|
sRandMemberCount: SRANDMEMBER_COUNT,
|
||||||
SRANDMEMBER,
|
SRANDMEMBER,
|
||||||
sRandMember: SRANDMEMBER,
|
sRandMember: SRANDMEMBER,
|
||||||
SREM,
|
SREM,
|
||||||
@@ -319,12 +336,16 @@ export default {
|
|||||||
zCard: ZCARD,
|
zCard: ZCARD,
|
||||||
ZCOUNT,
|
ZCOUNT,
|
||||||
zCount: ZCOUNT,
|
zCount: ZCOUNT,
|
||||||
|
ZDIFF_WITHSCORES,
|
||||||
|
zDiffWithScores: ZDIFF_WITHSCORES,
|
||||||
ZDIFF,
|
ZDIFF,
|
||||||
zDiff: ZDIFF,
|
zDiff: ZDIFF,
|
||||||
ZDIFFSTORE,
|
ZDIFFSTORE,
|
||||||
zDiffStore: ZDIFFSTORE,
|
zDiffStore: ZDIFFSTORE,
|
||||||
ZINCRBY,
|
ZINCRBY,
|
||||||
zIncrBy: ZINCRBY,
|
zIncrBy: ZINCRBY,
|
||||||
|
ZINTER_WITHSCORES,
|
||||||
|
zInterWithScores: ZINTER_WITHSCORES,
|
||||||
ZINTER,
|
ZINTER,
|
||||||
zInter: ZINTER,
|
zInter: ZINTER,
|
||||||
ZINTERSTORE,
|
ZINTERSTORE,
|
||||||
@@ -333,12 +354,22 @@ export default {
|
|||||||
zLexCount: ZLEXCOUNT,
|
zLexCount: ZLEXCOUNT,
|
||||||
ZMSCORE,
|
ZMSCORE,
|
||||||
zmScore: ZMSCORE,
|
zmScore: ZMSCORE,
|
||||||
|
ZPOPMAX_COUNT,
|
||||||
|
zPopMaxCount: ZPOPMAX_COUNT,
|
||||||
ZPOPMAX,
|
ZPOPMAX,
|
||||||
zPopMax: ZPOPMAX,
|
zPopMax: ZPOPMAX,
|
||||||
|
ZPOPMIN_COUNT,
|
||||||
|
zPopMinCount: ZPOPMIN_COUNT,
|
||||||
ZPOPMIN,
|
ZPOPMIN,
|
||||||
zPopMin: ZPOPMIN,
|
zPopMin: ZPOPMIN,
|
||||||
|
ZRANDMEMBER_COUNT_WITHSCORES,
|
||||||
|
zRandMemberCountWithScores: ZRANDMEMBER_COUNT_WITHSCORES,
|
||||||
|
ZRANDMEMBER_COUNT,
|
||||||
|
zRandMemberCount: ZRANDMEMBER_COUNT,
|
||||||
ZRANDMEMBER,
|
ZRANDMEMBER,
|
||||||
zRandMember: ZRANDMEMBER,
|
zRandMember: ZRANDMEMBER,
|
||||||
|
ZRANGE_WITHSCORES,
|
||||||
|
zRangeWithScores: ZRANGE_WITHSCORES,
|
||||||
ZRANGE,
|
ZRANGE,
|
||||||
zRange: ZRANGE,
|
zRange: ZRANGE,
|
||||||
ZRANGESTORE,
|
ZRANGESTORE,
|
||||||
@@ -359,6 +390,8 @@ export default {
|
|||||||
zScan: ZSCAN,
|
zScan: ZSCAN,
|
||||||
ZSCORE,
|
ZSCORE,
|
||||||
zScore: ZSCORE,
|
zScore: ZSCORE,
|
||||||
|
ZUNION_WITHSCORES,
|
||||||
|
zUnionWithScores: ZUNION_WITHSCORES,
|
||||||
ZUNION,
|
ZUNION,
|
||||||
zUnion: ZUNION,
|
zUnion: ZUNION,
|
||||||
ZUNIONSTORE,
|
ZUNIONSTORE,
|
||||||
|
Reference in New Issue
Block a user