Skip to content

Commit f3013f1

Browse files
committed
move all 'DoubleReply' in resp2 to new type mapping system
+ fix things I missed in search
1 parent 0337343 commit f3013f1

File tree

12 files changed

+139
-88
lines changed

12 files changed

+139
-88
lines changed

packages/bloom/lib/commands/top-k/INFO.ts

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { RedisArgument, TuplesToMapReply, NumberReply, DoubleReply, UnwrapReply, Resp2Reply, Command, SimpleStringReply } from '@redis/client/dist/lib/RESP/types';
1+
import { transformDoubleReply } from '@redis/client/dist/lib/commands/generic-transformers';
2+
import { RedisArgument, TuplesToMapReply, NumberReply, DoubleReply, UnwrapReply, Resp2Reply, Command, SimpleStringReply, TypeMapping } from '@redis/client/dist/lib/RESP/types';
23

34
export type TopKInfoReplyMap = TuplesToMapReply<[
45
[SimpleStringReply<'k'>, NumberReply],
@@ -7,14 +8,7 @@ export type TopKInfoReplyMap = TuplesToMapReply<[
78
[SimpleStringReply<'decay'>, DoubleReply]
89
]>;
910

10-
export type TkInfoReply2 = {
11-
k: NumberReply;
12-
width: NumberReply;
13-
depth: NumberReply;
14-
decay: number;
15-
}
16-
17-
export type TkInfoReply3 = {
11+
export type TkInfoReply = {
1812
k: NumberReply;
1913
width: NumberReply;
2014
depth: NumberReply;
@@ -28,15 +22,15 @@ export default {
2822
return ['TOPK.INFO', key];
2923
},
3024
transformReply: {
31-
2: (reply: UnwrapReply<Resp2Reply<TopKInfoReplyMap>>): TkInfoReply2 => {
25+
2: (reply: UnwrapReply<Resp2Reply<TopKInfoReplyMap>>, preserve?: any, typeMapping?: TypeMapping): TkInfoReply => {
3226
return {
3327
k: reply[1],
3428
width: reply[3],
3529
depth: reply[5],
36-
decay: Number(reply[7])
30+
decay: transformDoubleReply[2](reply[7], preserve, typeMapping)
3731
};
3832
},
39-
3: (reply: UnwrapReply<TopKInfoReplyMap>): TkInfoReply3 => {
33+
3: (reply: UnwrapReply<TopKInfoReplyMap>): TkInfoReply => {
4034
if (reply instanceof Map) {
4135
return {
4236
k: reply.get('k') as NumberReply,

packages/client/lib/commands/ACL_LOG.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { ArrayReply, TuplesToMapReply, BlobStringReply, NumberReply, DoubleReply, UnwrapReply, Resp2Reply, Command } from '../RESP/types';
1+
import { ArrayReply, TuplesToMapReply, BlobStringReply, NumberReply, DoubleReply, UnwrapReply, Resp2Reply, Command, TypeMapping } from '../RESP/types';
2+
import { transformDoubleReply } from './generic-transformers';
23

34
export type AclLogReply = ArrayReply<TuplesToMapReply<[
45
[BlobStringReply<'count'>, NumberReply],
@@ -29,7 +30,7 @@ export default {
2930
return args;
3031
},
3132
transformReply: {
32-
2: (reply: UnwrapReply<Resp2Reply<AclLogReply>>) => {
33+
2: (reply: UnwrapReply<Resp2Reply<AclLogReply>>, preserve?: any, typeMapping?: TypeMapping) => {
3334
return reply.map(item => {
3435
const inferred = item as unknown as UnwrapReply<typeof item>;
3536
return {
@@ -38,7 +39,7 @@ export default {
3839
context: inferred[5],
3940
object: inferred[7],
4041
username: inferred[9],
41-
'age-seconds': Number(inferred[11]),
42+
'age-seconds': transformDoubleReply[2](inferred[11], preserve, typeMapping),
4243
'client-info': inferred[13],
4344
'entry-id': inferred[15],
4445
'timestamp-created': inferred[17],

packages/client/lib/commands/BZPOPMAX.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { RedisArgument, NullReply, TuplesReply, BlobStringReply, DoubleReply, UnwrapReply, Command } from '../RESP/types';
2-
import { RedisVariadicArgument, pushVariadicArguments } from './generic-transformers';
1+
import { RedisArgument, NullReply, TuplesReply, BlobStringReply, DoubleReply, UnwrapReply, Command, TypeMapping } from '../RESP/types';
2+
import { RedisVariadicArgument, pushVariadicArguments, transformDoubleReply } from './generic-transformers';
33

44
export function transformBZPopArguments(
55
command: RedisArgument,
@@ -20,11 +20,15 @@ export default {
2020
return transformBZPopArguments('BZPOPMAX', ...args);
2121
},
2222
transformReply: {
23-
2(reply: UnwrapReply<NullReply | TuplesReply<[BlobStringReply, BlobStringReply, BlobStringReply]>>) {
23+
2(
24+
reply: UnwrapReply<NullReply | TuplesReply<[BlobStringReply, BlobStringReply, BlobStringReply]>>,
25+
preserve?: any,
26+
typeMapping?: TypeMapping
27+
) {
2428
return reply === null ? null : {
2529
key: reply[0],
2630
value: reply[1],
27-
score: Number(reply[2])
31+
score: transformDoubleReply[2](reply[2], preserve, typeMapping)
2832
};
2933
},
3034
3(reply: UnwrapReply<NullReply | TuplesReply<[BlobStringReply, BlobStringReply, DoubleReply]>>) {

packages/client/lib/commands/MEMORY_STATS.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { TuplesToMapReply, BlobStringReply, NumberReply, DoubleReply, ArrayReply, UnwrapReply, Command } from '../RESP/types';
1+
import { TuplesToMapReply, BlobStringReply, NumberReply, DoubleReply, ArrayReply, UnwrapReply, Command, TypeMapping } from '../RESP/types';
2+
import { transformDoubleReply } from './generic-transformers';
23

34
export type MemoryStatsReply = TuplesToMapReply<[
45
[BlobStringReply<'peak.allocated'>, NumberReply],
@@ -39,12 +40,24 @@ export default {
3940
return ['MEMORY', 'STATS'];
4041
},
4142
transformReply: {
42-
2: (rawReply: UnwrapReply<ArrayReply<BlobStringReply | NumberReply>>) => {
43+
2: (rawReply: UnwrapReply<ArrayReply<BlobStringReply | NumberReply>>, preserve?: any, typeMapping?: TypeMapping) => {
4344
const reply: any = {};
4445

4546
let i = 0;
4647
while (i < rawReply.length) {
47-
reply[rawReply[i++] as any] = rawReply[i++];
48+
switch(i) {
49+
case 28:
50+
case 30:
51+
case 38:
52+
case 42:
53+
case 46:
54+
case 50:
55+
reply[rawReply[i++] as any] = transformDoubleReply[2](rawReply[i++] as unknown as BlobStringReply, preserve, typeMapping);
56+
break;
57+
default:
58+
reply[rawReply[i++] as any] = rawReply[i++];
59+
}
60+
4861
}
4962

5063
return reply as MemoryStatsReply['DEFAULT'];

packages/client/lib/commands/ZMPOP.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { RedisArgument, NullReply, TuplesReply, BlobStringReply, DoubleReply, ArrayReply, UnwrapReply, Resp2Reply, Command } from '../RESP/types';
1+
import { RedisArgument, NullReply, TuplesReply, BlobStringReply, DoubleReply, ArrayReply, UnwrapReply, Resp2Reply, Command, TypeMapping } from '../RESP/types';
22
import { pushVariadicArgument, RedisVariadicArgument, SortedSetSide, transformSortedSetReply, transformDoubleReply } from './generic-transformers';
33

44
export interface ZMPopOptions {
@@ -39,14 +39,14 @@ export default {
3939
return transformZMPopArguments(['ZMPOP'], ...args);
4040
},
4141
transformReply: {
42-
2(reply: UnwrapReply<Resp2Reply<ZMPopRawReply>>) {
42+
2(reply: UnwrapReply<Resp2Reply<ZMPopRawReply>>, preserve?: any, typeMapping?: TypeMapping) {
4343
return reply === null ? null : {
4444
key: reply[0],
4545
members: (reply[1] as unknown as UnwrapReply<typeof reply[1]>).map(member => {
4646
const [value, score] = member as unknown as UnwrapReply<typeof member>;
4747
return {
4848
value,
49-
score: transformDoubleReply[2](score)
49+
score: transformDoubleReply[2](score, preserve, typeMapping)
5050
};
5151
})
5252
};

packages/client/lib/commands/ZMSCORE.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { RedisArgument, ArrayReply, NullReply, BlobStringReply, DoubleReply, UnwrapReply, Command } from '../RESP/types';
2-
import { pushVariadicArguments, RedisVariadicArgument, transformNullableDoubleReply } from './generic-transformers';
1+
import { RedisArgument, ArrayReply, NullReply, BlobStringReply, DoubleReply, UnwrapReply, Command, TypeMapping } from '../RESP/types';
2+
import { createTransformNullableDoubleReplyResp2Func, pushVariadicArguments, RedisVariadicArgument } from './generic-transformers';
33

44
export default {
55
FIRST_KEY_INDEX: 1,
@@ -11,8 +11,8 @@ export default {
1111
return pushVariadicArguments(['ZMSCORE', key], member);
1212
},
1313
transformReply: {
14-
2: (reply: UnwrapReply<ArrayReply<NullReply | BlobStringReply>>) => {
15-
return reply.map(transformNullableDoubleReply[2]);
14+
2: (reply: UnwrapReply<ArrayReply<NullReply | BlobStringReply>>, preserve?: any, typeMapping?: TypeMapping) => {
15+
return reply.map(createTransformNullableDoubleReplyResp2Func(preserve, typeMapping));
1616
},
1717
3: undefined as unknown as () => ArrayReply<NullReply | DoubleReply>
1818
}

packages/client/lib/commands/ZPOPMAX.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { RedisArgument, TuplesReply, BlobStringReply, DoubleReply, UnwrapReply, Command } from '../RESP/types';
1+
import { RedisArgument, TuplesReply, BlobStringReply, DoubleReply, UnwrapReply, Command, TypeMapping } from '../RESP/types';
2+
import { transformDoubleReply } from './generic-transformers';
23

34
export default {
45
FIRST_KEY_INDEX: 1,
@@ -7,12 +8,18 @@ export default {
78
return ['ZPOPMAX', key];
89
},
910
transformReply: {
10-
2: (reply: UnwrapReply<TuplesReply<[] | [BlobStringReply, BlobStringReply]>>) => {
11+
2: (reply: UnwrapReply<TuplesReply<[] | [BlobStringReply, BlobStringReply]>>, preserve?: any, typeMapping?: TypeMapping) => {
1112
if (reply.length === 0) return null;
1213

1314
return {
1415
value: reply[0],
15-
score: Number(reply[1])
16+
_score: transformDoubleReply[2](reply[1], preserve, typeMapping),
17+
get score() {
18+
return this._score;
19+
},
20+
set score(value) {
21+
this._score = value;
22+
},
1623
};
1724
},
1825
3: (reply: UnwrapReply<TuplesReply<[] | [BlobStringReply, DoubleReply]>>) => {

packages/client/lib/commands/generic-transformers.ts

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,39 +43,72 @@ export function transformStringDoubleArgument(num: RedisArgument | number): Redi
4343
}
4444

4545
export const transformDoubleReply = {
46-
2: (reply: BlobStringReply) => {
47-
switch (reply.toString()) {
48-
case 'inf':
49-
case '+inf':
50-
return Infinity;
51-
52-
case '-inf':
53-
return -Infinity;
46+
2: (reply: BlobStringReply, preserve?: any, typeMapping?: TypeMapping): DoubleReply => {
47+
const double = typeMapping ? typeMapping[RESP_TYPES.DOUBLE] : undefined;
48+
49+
switch (double) {
50+
case String: {
51+
return reply as unknown as DoubleReply;
52+
}
53+
default: {
54+
let ret: Number;
55+
56+
switch (reply.toString()) {
57+
case 'inf':
58+
case '+inf':
59+
ret = Infinity;
60+
61+
case '-inf':
62+
ret = -Infinity;
63+
64+
case 'nan':
65+
ret = NaN;
66+
67+
default:
68+
ret = Number(reply);
69+
}
5470

55-
case 'nan':
56-
return NaN;
57-
58-
default:
59-
return Number(reply);
71+
return ret as unknown as DoubleReply;
72+
}
6073
}
6174
},
6275
3: undefined as unknown as () => DoubleReply
6376
};
6477

78+
export function createTransformDoubleReplyResp2Func(preserve?: any, typeMapping?: TypeMapping) {
79+
return (reply: BlobStringReply) => {
80+
return transformDoubleReply[2](reply, preserve, typeMapping);
81+
}
82+
}
83+
6584
export const transformDoubleArrayReply = {
66-
2: (reply: Array<BlobStringReply>) => reply.map(transformDoubleReply[2]),
85+
2: (reply: Array<BlobStringReply>, preserve?: any, typeMapping?: TypeMapping) => {
86+
return reply.map(createTransformDoubleReplyResp2Func(preserve, typeMapping));
87+
},
6788
3: undefined as unknown as () => ArrayReply<DoubleReply>
6889
}
6990

91+
export function createTransformNullableDoubleReplyResp2Func(preserve?: any, typeMapping?: TypeMapping) {
92+
return (reply: BlobStringReply | NullReply) => {
93+
return transformNullableDoubleReply[2](reply, preserve, typeMapping);
94+
}
95+
}
96+
7097
export const transformNullableDoubleReply = {
71-
2: (reply: BlobStringReply | NullReply) => {
98+
2: (reply: BlobStringReply | NullReply, preserve?: any, typeMapping?: TypeMapping) => {
7299
if (reply === null) return null;
73100

74-
return transformDoubleReply[2](reply as BlobStringReply);
101+
return transformDoubleReply[2](reply as BlobStringReply, preserve, typeMapping);
75102
},
76103
3: undefined as unknown as () => DoubleReply | NullReply
77104
};
78105

106+
export function createTransformTuplesReplyFunc(preserve?: any, typeMapping?: TypeMapping) {
107+
return (reply: ArrayReply<BlobStringReply>) => {
108+
return transformTuplesReply(reply, preserve, typeMapping);
109+
};
110+
}
111+
79112
export function transformTuplesReply(
80113
reply: ArrayReply<BlobStringReply>,
81114
preserve?: any,
@@ -118,13 +151,13 @@ export interface SortedSetMember {
118151
export type SortedSetSide = 'MIN' | 'MAX';
119152

120153
export const transformSortedSetReply = {
121-
2: (reply: ArrayReply<BlobStringReply>) => {
154+
2: (reply: ArrayReply<BlobStringReply>, preserve?: any, typeMapping?: TypeMapping) => {
122155
const inferred = reply as unknown as UnwrapReply<typeof reply>,
123156
members = [];
124157
for (let i = 0; i < inferred.length; i += 2) {
125158
members.push({
126159
value: inferred[i],
127-
score: transformDoubleReply[2](inferred[i + 1])
160+
score: transformDoubleReply[2](inferred[i + 1], preserve, typeMapping)
128161
});
129162
}
130163

packages/search/lib/commands/AGGREGATE.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ArrayReply, BlobStringReply, Command, NumberReply, RedisArgument, ReplyUnion, UnwrapReply } from '@redis/client/dist/lib/RESP/types';
1+
import { ArrayReply, BlobStringReply, Command, MapReply, NumberReply, RedisArgument, ReplyUnion, TypeMapping, UnwrapReply } from '@redis/client/dist/lib/RESP/types';
22
import { RediSearchProperty } from './CREATE';
33
import { FtSearchParams, pushParamsArgument } from './SEARCH';
44
import { pushVariadicArgument, transformTuplesReply } from '@redis/client/dist/lib/commands/generic-transformers';
@@ -132,7 +132,7 @@ export type AggregateRawReply = [
132132

133133
export interface AggregateReply {
134134
total: number;
135-
results: Array<Record<string, BlobStringReply>>;
135+
results: Array<MapReply<BlobStringReply, BlobStringReply>>;
136136
};
137137

138138
export default {
@@ -144,11 +144,11 @@ export default {
144144
return pushAggregateOptions(args, options);
145145
},
146146
transformReply: {
147-
2: (rawReply: AggregateRawReply): AggregateReply => {
148-
const results: Array<Record<string, BlobStringReply>> = [];
147+
2: (rawReply: AggregateRawReply, preserve?: any, typeMapping?: TypeMapping): AggregateReply => {
148+
const results: Array<MapReply<BlobStringReply, BlobStringReply>> = [];
149149
for (let i = 1; i < rawReply.length; i++) {
150150
results.push(
151-
transformTuplesReply(rawReply[i] as ArrayReply<BlobStringReply>)
151+
transformTuplesReply(rawReply[i] as ArrayReply<BlobStringReply>, preserve, typeMapping)
152152
);
153153
}
154154

packages/search/lib/commands/INFO.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { RedisArgument } from "@redis/client";
2-
import { ArrayReply, BlobStringReply, Command, NumberReply, ReplyUnion } from "@redis/client/dist/lib/RESP/types";
3-
import { transformTuplesReply } from "@redis/client/dist/lib/commands/generic-transformers";
2+
import { ArrayReply, BlobStringReply, Command, MapReply, NumberReply, ReplyUnion, TypeMapping } from "@redis/client/dist/lib/RESP/types";
3+
import { createTransformTuplesReplyFunc } from "@redis/client/dist/lib/commands/generic-transformers";
44

55
export default {
66
FIRST_KEY_INDEX: undefined,
@@ -95,8 +95,8 @@ type InfoRawReply = [
9595
export interface InfoReply {
9696
indexName: BlobStringReply;
9797
indexOptions: ArrayReply<BlobStringReply>;
98-
indexDefinition: Record<string, BlobStringReply>;
99-
attributes: Array<Record<string, BlobStringReply>>;
98+
indexDefinition: MapReply<BlobStringReply, BlobStringReply>;
99+
attributes: Array<MapReply<BlobStringReply, BlobStringReply>>;
100100
numDocs: BlobStringReply
101101
maxDocId: BlobStringReply;
102102
numTerms: BlobStringReply;
@@ -133,12 +133,14 @@ export interface InfoReply {
133133
stopWords: ArrayReply<BlobStringReply> | undefined;
134134
}
135135

136-
function transformV2Reply(rawReply: InfoRawReply): InfoReply {
136+
function transformV2Reply(rawReply: InfoRawReply, preserve?: any, typeMapping?: TypeMapping): InfoReply {
137+
const myTransformFunc = createTransformTuplesReplyFunc(preserve, typeMapping);
138+
137139
return {
138140
indexName: rawReply[1],
139141
indexOptions: rawReply[3],
140-
indexDefinition: transformTuplesReply(rawReply[5]),
141-
attributes: rawReply[7].map(attribute => transformTuplesReply(attribute)),
142+
indexDefinition: myTransformFunc(rawReply[5]),
143+
attributes: rawReply[7].map(attribute => myTransformFunc(attribute)),
142144
numDocs: rawReply[9],
143145
maxDocId: rawReply[11],
144146
numTerms: rawReply[13],

0 commit comments

Comments
 (0)