Skip to content

Commit e374a08

Browse files
committed
add field expiration commands to parser set
1 parent e53da7e commit e374a08

19 files changed

+601
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { strict as assert } from 'node:assert';
2+
import testUtils, { GLOBAL } from '../test-utils';
3+
import HEXPIRE from './HEXPIRE';
4+
import { HASH_EXPIRATION } from '.';
5+
6+
describe('HEXPIRE', () => {
7+
testUtils.isVersionGreaterThanHook([7, 4]);
8+
9+
describe('transformArguments', () => {
10+
it('string', () => {
11+
assert.deepEqual(
12+
HEXPIRE.transformArguments('key', 'field', 1),
13+
['HEXPIRE', 'key', '1', 'FIELDS', '1', 'field']
14+
);
15+
});
16+
17+
it('array', () => {
18+
assert.deepEqual(
19+
HEXPIRE.transformArguments('key', ['field1', 'field2'], 1),
20+
['HEXPIRE', 'key', '1', 'FIELDS', '2', 'field1', 'field2']
21+
);
22+
});
23+
24+
it('with set option', () => {
25+
assert.deepEqual(
26+
HEXPIRE.transformArguments('key', ['field1'], 1, 'NX'),
27+
['HEXPIRE', 'key', '1', 'NX', 'FIELDS', '1', 'field1']
28+
);
29+
});
30+
});
31+
32+
testUtils.testWithClient('hexpire', async client => {
33+
assert.deepEqual(
34+
await client.hExpire('key', ['field1'], 0),
35+
[ HASH_EXPIRATION.FieldNotExists ]
36+
);
37+
}, {
38+
...GLOBAL.SERVERS.OPEN
39+
});
40+
});
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { HashExpiration } from '.';
2+
import { CommandParser } from '../client/parser';
3+
import { ArrayReply, Command, RedisArgument } from '../RESP/types';
4+
5+
export default {
6+
FIRST_KEY_INDEX: 1,
7+
parseCommand(
8+
parser: CommandParser,
9+
key: RedisArgument,
10+
fields: RedisArgument | Array<RedisArgument>,
11+
seconds: number,
12+
mode?: 'NX' | 'XX' | 'GT' | 'LT'
13+
) {
14+
parser.pushVariadic(['HEXPIRE', key, seconds.toString()]);
15+
16+
if (mode) {
17+
parser.push(mode);
18+
}
19+
20+
parser.push('FIELDS');
21+
22+
parser.pushVariadic(fields);
23+
},
24+
transformArguments(
25+
key: RedisArgument,
26+
field: RedisArgument | Array<RedisArgument>,
27+
seconds: number,
28+
mode?: 'NX' | 'XX' | 'GT' | 'LT'
29+
) { return [] },
30+
transformReply: undefined as unknown as () => ArrayReply<HashExpiration>
31+
} as const satisfies Command;
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { strict as assert } from 'node:assert';
2+
import testUtils, { GLOBAL } from '../test-utils';
3+
import HEXPIREAT from './HEXPIREAT';
4+
import { HASH_EXPIRATION_TIME } from '.';
5+
6+
describe('HEXPIREAT', () => {
7+
testUtils.isVersionGreaterThanHook([7, 4]);
8+
9+
describe('transformArguments', () => {
10+
it('string + number', () => {
11+
assert.deepEqual(
12+
HEXPIREAT.transformArguments('key', 'field', 1),
13+
['HEXPIREAT', 'key', '1', 'FIELDS', '1', 'field']
14+
);
15+
});
16+
17+
it('array + number', () => {
18+
assert.deepEqual(
19+
HEXPIREAT.transformArguments('key', ['field1', 'field2'], 1),
20+
['HEXPIREAT', 'key', '1', 'FIELDS', '2', 'field1', 'field2']
21+
);
22+
});
23+
24+
it('date', () => {
25+
const d = new Date();
26+
27+
assert.deepEqual(
28+
HEXPIREAT.transformArguments('key', ['field1'], d),
29+
['HEXPIREAT', 'key', Math.floor(d.getTime() / 1000).toString(), 'FIELDS', '1', 'field1']
30+
);
31+
});
32+
33+
it('with set option', () => {
34+
assert.deepEqual(
35+
HEXPIREAT.transformArguments('key', 'field1', 1, 'GT'),
36+
['HEXPIREAT', 'key', '1', 'GT', 'FIELDS', '1', 'field1']
37+
);
38+
});
39+
});
40+
41+
testUtils.testWithClient('expireAt', async client => {
42+
assert.deepEqual(
43+
await client.hExpireAt('key', 'field1', 1),
44+
[ HASH_EXPIRATION_TIME.FieldNotExists ]
45+
);
46+
}, {
47+
...GLOBAL.SERVERS.OPEN,
48+
});
49+
});
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { transformEXAT } from './generic-transformers';
2+
import { HashExpiration } from '.';
3+
import { ArrayReply, Command, RedisArgument } from '../RESP/types';
4+
import { CommandParser } from '../client/parser';
5+
6+
export default {
7+
FIRST_KEY_INDEX: 1,
8+
parseCommand(
9+
parser: CommandParser,
10+
key: RedisArgument,
11+
fields: RedisArgument | Array<RedisArgument>,
12+
timestamp: number | Date,
13+
mode?: 'NX' | 'XX' | 'GT' | 'LT'
14+
) {
15+
parser.pushVariadic([
16+
'HEXPIREAT',
17+
key,
18+
transformEXAT(timestamp)
19+
]);
20+
21+
if (mode) {
22+
parser.push(mode);
23+
}
24+
25+
parser.push('FIELDS')
26+
27+
parser.pushVariadic(fields);
28+
},
29+
transformArguments(
30+
key: RedisArgument,
31+
fields: RedisArgument | Array<RedisArgument>,
32+
timestamp: number | Date,
33+
mode?: 'NX' | 'XX' | 'GT' | 'LT'
34+
) { return [] },
35+
transformReply: undefined as unknown as () => ArrayReply<HashExpiration>
36+
} as const satisfies Command;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { strict as assert } from 'node:assert';
2+
import testUtils, { GLOBAL } from '../test-utils';
3+
import HEXPIRETIME from './HEXPIRETIME';
4+
import { HASH_EXPIRATION_TIME } from '.';
5+
6+
describe('HEXPIRETIME', () => {
7+
testUtils.isVersionGreaterThanHook([7, 4]);
8+
9+
describe('transformArguments', () => {
10+
it('string', () => {
11+
assert.deepEqual(
12+
HEXPIRETIME.transformArguments('key', 'field'),
13+
['HEXPIRETIME', 'key', 'FIELDS', '1', 'field']
14+
);
15+
});
16+
17+
it('array', () => {
18+
assert.deepEqual(
19+
HEXPIRETIME.transformArguments('key', ['field1', 'field2']),
20+
['HEXPIRETIME', 'key', 'FIELDS', '2', 'field1', 'field2']
21+
);
22+
});
23+
})
24+
25+
testUtils.testWithClient('hExpireTime', async client => {
26+
assert.deepEqual(
27+
await client.hExpireTime('key', 'field1'),
28+
[ HASH_EXPIRATION_TIME.FieldNotExists ]
29+
);
30+
}, {
31+
...GLOBAL.SERVERS.OPEN,
32+
});
33+
});
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { CommandParser } from '../client/parser';
2+
import { ArrayReply, Command, NumberReply, RedisArgument } from '../RESP/types';
3+
4+
export default {
5+
FIRST_KEY_INDEX: 1,
6+
IS_READ_ONLY: true,
7+
parseCommand(
8+
parser: CommandParser,
9+
key: RedisArgument,
10+
fields: RedisArgument | Array<RedisArgument>
11+
) {
12+
parser.pushVariadic(['HEXPIRETIME', key, 'FIELDS'])
13+
parser.pushVariadic(fields);
14+
},
15+
transformArguments(
16+
key: RedisArgument,
17+
fields: RedisArgument | Array<RedisArgument>
18+
) { return [] },
19+
transformReply: undefined as unknown as () => ArrayReply<NumberReply>
20+
} as const satisfies Command;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { strict as assert } from 'node:assert';
2+
import testUtils, { GLOBAL } from '../test-utils';
3+
import HPERSIST from './HPERSIST';
4+
import { HASH_EXPIRATION_TIME } from '.';
5+
6+
describe('HPERSIST', () => {
7+
testUtils.isVersionGreaterThanHook([7, 4]);
8+
9+
describe('transformArguments', () => {
10+
it('string', () => {
11+
assert.deepEqual(
12+
HPERSIST.transformArguments('key', 'field'),
13+
['HPERSIST', 'key', 'FIELDS', '1', 'field']
14+
);
15+
});
16+
17+
it('array', () => {
18+
assert.deepEqual(
19+
HPERSIST.transformArguments('key', ['field1', 'field2']),
20+
['HPERSIST', 'key', 'FIELDS', '2', 'field1', 'field2']
21+
);
22+
});
23+
})
24+
25+
testUtils.testWithClient('hPersist', async client => {
26+
assert.deepEqual(
27+
await client.hPersist('key', 'field1'),
28+
[ HASH_EXPIRATION_TIME.FieldNotExists ]
29+
);
30+
}, {
31+
...GLOBAL.SERVERS.OPEN,
32+
});
33+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { CommandParser } from '../client/parser';
2+
import { ArrayReply, Command, NullReply, NumberReply, RedisArgument } from '../RESP/types';
3+
4+
export default {
5+
FIRST_KEY_INDEX: 1,
6+
parseCommand(
7+
parser: CommandParser,
8+
key: RedisArgument,
9+
fields: RedisArgument | Array<RedisArgument>
10+
) {
11+
parser.pushVariadic(['HPERSIST', key, 'FIELDS']);
12+
parser.pushVariadic(fields);
13+
},
14+
transformArguments(
15+
key: RedisArgument,
16+
fields: RedisArgument | Array<RedisArgument>
17+
) { return [] },
18+
transformReply: undefined as unknown as () => ArrayReply<NumberReply> | NullReply
19+
} as const satisfies Command;
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { strict as assert } from 'node:assert';
2+
import testUtils, { GLOBAL } from '../test-utils';
3+
import HEXPIRE from './HPEXPIRE';
4+
import { HASH_EXPIRATION_TIME } from '.';
5+
6+
describe('HEXPIRE', () => {
7+
testUtils.isVersionGreaterThanHook([7, 4]);
8+
9+
describe('transformArguments', () => {
10+
it('string', () => {
11+
assert.deepEqual(
12+
HEXPIRE.transformArguments('key', 'field', 1),
13+
['HPEXPIRE', 'key', '1', 'FIELDS', '1', 'field']
14+
);
15+
});
16+
17+
it('array', () => {
18+
assert.deepEqual(
19+
HEXPIRE.transformArguments('key', ['field1', 'field2'], 1),
20+
['HPEXPIRE', 'key', '1', 'FIELDS', '2', 'field1', 'field2']
21+
);
22+
});
23+
24+
it('with set option', () => {
25+
assert.deepEqual(
26+
HEXPIRE.transformArguments('key', ['field1'], 1, 'NX'),
27+
['HPEXPIRE', 'key', '1', 'NX', 'FIELDS', '1', 'field1']
28+
);
29+
});
30+
});
31+
32+
testUtils.testWithClient('hexpire', async client => {
33+
assert.deepEqual(
34+
await client.hpExpire('key', ['field1'], 0),
35+
[ HASH_EXPIRATION_TIME.FieldNotExists ]
36+
);
37+
}, {
38+
...GLOBAL.SERVERS.OPEN
39+
});
40+
});
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { HashExpiration } from '.';
2+
import { CommandParser } from '../client/parser';
3+
import { ArrayReply, Command, NullReply, RedisArgument } from '../RESP/types';
4+
5+
export default {
6+
FIRST_KEY_INDEX: 1,
7+
parseCommand(
8+
parser: CommandParser,
9+
key: RedisArgument,
10+
fields: RedisArgument | Array<RedisArgument>,
11+
ms: number,
12+
mode?: 'NX' | 'XX' | 'GT' | 'LT',
13+
) {
14+
parser.pushVariadic(['HPEXPIRE', key, ms.toString()]);
15+
16+
if (mode) {
17+
parser.push(mode);
18+
}
19+
20+
parser.push('FIELDS')
21+
22+
parser.pushVariadic(fields);
23+
},
24+
transformArguments(
25+
key: RedisArgument,
26+
fields: RedisArgument | Array<RedisArgument>,
27+
ms: number,
28+
mode?: 'NX' | 'XX' | 'GT' | 'LT',
29+
) { return [] },
30+
transformReply: undefined as unknown as () => ArrayReply<HashExpiration> | NullReply
31+
} as const satisfies Command;
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { strict as assert } from 'node:assert';
2+
import testUtils, { GLOBAL } from '../test-utils';
3+
import HPEXPIREAT from './HPEXPIREAT';
4+
import { HASH_EXPIRATION_TIME } from '.';
5+
6+
describe('HPEXPIREAT', () => {
7+
testUtils.isVersionGreaterThanHook([7, 4]);
8+
9+
describe('transformArguments', () => {
10+
it('string + number', () => {
11+
assert.deepEqual(
12+
HPEXPIREAT.transformArguments('key', 'field', 1),
13+
['HPEXPIREAT', 'key', '1', 'FIELDS', '1', 'field']
14+
);
15+
});
16+
17+
it('array + number', () => {
18+
assert.deepEqual(
19+
HPEXPIREAT.transformArguments('key', ['field1', 'field2'], 1),
20+
['HPEXPIREAT', 'key', '1', 'FIELDS', '2', 'field1', 'field2']
21+
);
22+
});
23+
24+
it('date', () => {
25+
const d = new Date();
26+
assert.deepEqual(
27+
HPEXPIREAT.transformArguments('key', ['field1'], d),
28+
['HPEXPIREAT', 'key', d.getTime().toString(), 'FIELDS', '1', 'field1']
29+
);
30+
});
31+
32+
it('with set option', () => {
33+
assert.deepEqual(
34+
HPEXPIREAT.transformArguments('key', ['field1'], 1, 'XX'),
35+
['HPEXPIREAT', 'key', '1', 'XX', 'FIELDS', '1', 'field1']
36+
);
37+
});
38+
});
39+
40+
testUtils.testWithClient('hpExpireAt', async client => {
41+
assert.deepEqual(
42+
await client.hpExpireAt('key', ['field1'], 1),
43+
[ HASH_EXPIRATION_TIME.FieldNotExists ]
44+
);
45+
}, {
46+
...GLOBAL.SERVERS.OPEN,
47+
});
48+
});

0 commit comments

Comments
 (0)