From 5a108265dacf8e03734cad79b4e4df64eda28959 Mon Sep 17 00:00:00 2001 From: Rowan Trollope Date: Mon, 18 Sep 2023 14:39:23 -0700 Subject: [PATCH] Add support for `JSON.MSET` (#2605) * Added MSET command MSET command added. Requires all keys to have the same JSON Path, which might fit most use cases, but is a limitation. Optionally we could make the path an array as well to support all use cases. * change JSON.MSET signature, add to json command object, fix tests * its `item.value`, not `item.json`.. * Update MSET.ts Removed unused RedisCommandArguments --------- Co-authored-by: Leibale Eidelman --- packages/json/lib/commands/MSET.spec.ts | 35 +++++++++++++++++++++++++ packages/json/lib/commands/MSET.ts | 28 ++++++++++++++++++++ packages/json/lib/commands/index.ts | 3 +++ 3 files changed, 66 insertions(+) create mode 100644 packages/json/lib/commands/MSET.spec.ts create mode 100644 packages/json/lib/commands/MSET.ts diff --git a/packages/json/lib/commands/MSET.spec.ts b/packages/json/lib/commands/MSET.spec.ts new file mode 100644 index 0000000000..53d4d82250 --- /dev/null +++ b/packages/json/lib/commands/MSET.spec.ts @@ -0,0 +1,35 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './MSET'; + +describe('MSET', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments([{ + key: '1', + path: '$', + value: 1 + }, { + key: '2', + path: '$', + value: '2' + }]), + ['JSON.MSET', '1', '$', '1', '2', '$', '"2"'] + ); + }); + + testUtils.testWithClient('client.json.mSet', async client => { + assert.deepEqual( + await client.json.mSet([{ + key: '1', + path: '$', + value: 1 + }, { + key: '2', + path: '$', + value: '2' + }]), + 'OK' + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/MSET.ts b/packages/json/lib/commands/MSET.ts new file mode 100644 index 0000000000..67228f264d --- /dev/null +++ b/packages/json/lib/commands/MSET.ts @@ -0,0 +1,28 @@ +import { RedisJSON, transformRedisJsonArgument } from '.'; +import { RedisCommandArgument } from '@redis/client/dist/lib/commands'; + +export const FIRST_KEY_INDEX = 1; + +interface JsonMSetItem { + key: RedisCommandArgument; + path: RedisCommandArgument; + value: RedisJSON; +} + +export function transformArguments(items: Array): Array { + + const args = new Array(1 + items.length * 3); + args[0] = 'JSON.MSET'; + + let argsIndex = 1; + for (let i = 0; i < items.length; i++) { + const item = items[i]; + args[argsIndex++] = item.key; + args[argsIndex++] = item.path; + args[argsIndex++] = transformRedisJsonArgument(item.value); + } + + return args; +} + +export declare function transformReply(): 'OK'; diff --git a/packages/json/lib/commands/index.ts b/packages/json/lib/commands/index.ts index efcf156b84..a42ece5f27 100644 --- a/packages/json/lib/commands/index.ts +++ b/packages/json/lib/commands/index.ts @@ -9,6 +9,7 @@ import * as DEL from './DEL'; import * as FORGET from './FORGET'; import * as GET from './GET'; import * as MGET from './MGET'; +import * as MSET from './MSET'; import * as NUMINCRBY from './NUMINCRBY'; import * as NUMMULTBY from './NUMMULTBY'; import * as OBJKEYS from './OBJKEYS'; @@ -42,6 +43,8 @@ export default { get: GET, MGET, mGet: MGET, + MSET, + mSet: MSET, NUMINCRBY, numIncrBy: NUMINCRBY, NUMMULTBY,