1 /*
2  * Hunt - A redis client library for D programming language.
3  *
4  * Copyright (C) 2018-2019 HuntLabs
5  *
6  * Website: https://www.huntlabs.net/
7  *
8  * Licensed under the Apache-2.0 License.
9  *
10  */
11  
12 module hunt.redis.PipelineBase;
13 
14 import hunt.redis.BitPosParams;
15 import hunt.redis.BuilderFactory;
16 import hunt.redis.Client;
17 import hunt.redis.GeoCoordinate;
18 import hunt.redis.GeoRadiusResponse;
19 import hunt.redis.GeoUnit;
20 import hunt.redis.ListPosition;
21 import hunt.redis.Queable;
22 import hunt.redis.Response;
23 import hunt.redis.SortingParams;
24 import hunt.redis.StreamEntry;
25 import hunt.redis.StreamEntryID;
26 import hunt.redis.StreamPendingEntry;
27 import hunt.redis.Tuple;
28 
29 import hunt.collection.List;
30 import hunt.collection.Map;
31 import hunt.collection.Set;
32 
33 import hunt.redis.commands.BinaryRedisPipeline;
34 import hunt.redis.Protocol;
35 import hunt.redis.commands.RedisPipeline;
36 import hunt.redis.params.GeoRadiusParam;
37 import hunt.redis.params.SetParams;
38 import hunt.redis.params.ZAddParams;
39 import hunt.redis.params.ZIncrByParams;
40 
41 import hunt.Boolean;
42 import hunt.Double;
43 import hunt.Long;
44 
45 import std.conv;
46 
47 abstract class PipelineBase : Queable, BinaryRedisPipeline, RedisPipeline {
48 
49   protected abstract Client getClient(string key);
50 
51   protected abstract Client getClient(const(ubyte)[] key);
52 
53   // override
54   Response!(Long) append(string key, string value) {
55     getClient(key).append(key, value);
56     return getResponse(BuilderFactory.LONG);
57   }
58 
59   // override
60   Response!(Long) append(const(ubyte)[] key, const(ubyte)[] value) {
61     getClient(key).append(key, value);
62     return getResponse(BuilderFactory.LONG);
63   }
64 
65   // override
66   Response!(List!(string)) blpop(string key) {
67     string[] temp = new string[1];
68     temp[0] = key;
69     getClient(key).blpop(temp);
70     return getResponse(BuilderFactory.STRING_LIST);
71   }
72 
73   // override
74   Response!(List!(string)) brpop(string key) {
75     string[] temp = new string[1];
76     temp[0] = key;
77     getClient(key).brpop(temp);
78     return getResponse(BuilderFactory.STRING_LIST);
79   }
80 
81   // override
82   Response!(List!(const(ubyte)[])) blpop(const(ubyte)[] key) {
83     const(ubyte)[][] temp = new const(ubyte)[][1];
84     temp[0] = key;
85     getClient(key).blpop(temp);
86     return getResponse(BuilderFactory.BYTE_ARRAY_LIST);
87   }
88 
89   // override
90   Response!(List!(const(ubyte)[])) brpop(const(ubyte)[] key) {
91     const(ubyte)[][] temp = new const(ubyte)[][1];
92     temp[0] = key;
93     getClient(key).brpop(temp);
94     return getResponse(BuilderFactory.BYTE_ARRAY_LIST);
95   }
96 
97   // override
98   Response!(Long) decr(string key) {
99     getClient(key).decr(key);
100     return getResponse(BuilderFactory.LONG);
101   }
102 
103   // override
104   Response!(Long) decr(const(ubyte)[] key) {
105     getClient(key).decr(key);
106     return getResponse(BuilderFactory.LONG);
107   }
108 
109   // override
110   Response!(Long) decrBy(string key, long decrement) {
111     getClient(key).decrBy(key, decrement);
112     return getResponse(BuilderFactory.LONG);
113   }
114 
115   // override
116   Response!(Long) decrBy(const(ubyte)[] key, long decrement) {
117     getClient(key).decrBy(key, decrement);
118     return getResponse(BuilderFactory.LONG);
119   }
120 
121   // override
122   Response!(Long) del(string key) {
123     getClient(key).del(key);
124     return getResponse(BuilderFactory.LONG);
125   }
126 
127   // override
128   Response!(Long) del(const(ubyte)[] key) {
129     getClient(key).del(key);
130     return getResponse(BuilderFactory.LONG);
131   }
132 
133   // override
134   Response!(Long) unlink(string key) {
135     getClient(key).unlink(key);
136     return getResponse(BuilderFactory.LONG);
137   }
138 
139   // override
140   Response!(Long) unlink(const(ubyte)[] key) {
141     getClient(key).unlink(key);
142     return getResponse(BuilderFactory.LONG);
143   }
144 
145   // override
146   Response!(string) echo(string string) {
147     getClient(string).echo(string);
148     return getResponse(BuilderFactory.STRING);
149   }
150 
151   // override
152   Response!(const(ubyte)[]) echo(const(ubyte)[] string) {
153     getClient(string).echo(string);
154     return getResponse(BuilderFactory.BYTE_ARRAY);
155   }
156 
157   // override
158   Response!(Boolean) exists(string key) {
159     getClient(key).exists(key);
160     return getResponse(BuilderFactory.BOOLEAN);
161   }
162 
163   // override
164   Response!(Boolean) exists(const(ubyte)[] key) {
165     getClient(key).exists(key);
166     return getResponse(BuilderFactory.BOOLEAN);
167   }
168 
169   // override
170   Response!(Long) expire(string key, int seconds) {
171     getClient(key).expire(key, seconds);
172     return getResponse(BuilderFactory.LONG);
173   }
174 
175   // override
176   Response!(Long) expire(const(ubyte)[] key, int seconds) {
177     getClient(key).expire(key, seconds);
178     return getResponse(BuilderFactory.LONG);
179   }
180 
181   // override
182   Response!(Long) expireAt(string key, long unixTime) {
183     getClient(key).expireAt(key, unixTime);
184     return getResponse(BuilderFactory.LONG);
185   }
186 
187   // override
188   Response!(Long) expireAt(const(ubyte)[] key, long unixTime) {
189     getClient(key).expireAt(key, unixTime);
190     return getResponse(BuilderFactory.LONG);
191   }
192 
193   // override
194   Response!(string) get(string key) {
195     getClient(key).get(key);
196     return getResponse(BuilderFactory.STRING);
197   }
198 
199   // override
200   Response!(const(ubyte)[]) get(const(ubyte)[] key) {
201     getClient(key).get(key);
202     return getResponse(BuilderFactory.BYTE_ARRAY);
203   }
204 
205   // override
206   Response!(Boolean) getbit(string key, long offset) {
207     getClient(key).getbit(key, offset);
208     return getResponse(BuilderFactory.BOOLEAN);
209   }
210 
211   // override
212   Response!(Boolean) getbit(const(ubyte)[] key, long offset) {
213     getClient(key).getbit(key, offset);
214     return getResponse(BuilderFactory.BOOLEAN);
215   }
216 
217   // override
218   Response!(Long) bitpos(string key, bool value) {
219     return bitpos(key, value, new BitPosParams());
220   }
221 
222   // override
223   Response!(Long) bitpos(string key, bool value, BitPosParams params) {
224     getClient(key).bitpos(key, value, params);
225     return getResponse(BuilderFactory.LONG);
226   }
227 
228   // override
229   Response!(Long) bitpos(const(ubyte)[] key, bool value) {
230     return bitpos(key, value, new BitPosParams());
231   }
232 
233   // override
234   Response!(Long) bitpos(const(ubyte)[] key, bool value, BitPosParams params) {
235     getClient(key).bitpos(key, value, params);
236     return getResponse(BuilderFactory.LONG);
237   }
238 
239   // override
240   Response!(string) getrange(string key, long startOffset, long endOffset) {
241     getClient(key).getrange(key, startOffset, endOffset);
242     return getResponse(BuilderFactory.STRING);
243   }
244 
245   // override
246   Response!(string) getSet(string key, string value) {
247     getClient(key).getSet(key, value);
248     return getResponse(BuilderFactory.STRING);
249   }
250 
251   // override
252   Response!(const(ubyte)[]) getSet(const(ubyte)[] key, const(ubyte)[] value) {
253     getClient(key).getSet(key, value);
254     return getResponse(BuilderFactory.BYTE_ARRAY);
255   }
256 
257   // override
258   Response!(const(ubyte)[]) getrange(const(ubyte)[] key, long startOffset, long endOffset) {
259     getClient(key).getrange(key, startOffset, endOffset);
260     return getResponse(BuilderFactory.BYTE_ARRAY);
261   }
262 
263   // override
264   Response!(Long) hdel(string key, string[] field...) {
265     getClient(key).hdel(key, field);
266     return getResponse(BuilderFactory.LONG);
267   }
268 
269   // override
270   Response!(Long) hdel(const(ubyte)[] key, const(ubyte)[][] field...) {
271     getClient(key).hdel(key, field);
272     return getResponse(BuilderFactory.LONG);
273   }
274 
275   // override
276   Response!(Boolean) hexists(string key, string field) {
277     getClient(key).hexists(key, field);
278     return getResponse(BuilderFactory.BOOLEAN);
279   }
280 
281   // override
282   Response!(Boolean) hexists(const(ubyte)[] key, const(ubyte)[] field) {
283     getClient(key).hexists(key, field);
284     return getResponse(BuilderFactory.BOOLEAN);
285   }
286 
287   // override
288   Response!(string) hget(string key, string field) {
289     getClient(key).hget(key, field);
290     return getResponse(BuilderFactory.STRING);
291   }
292 
293   // override
294   Response!(const(ubyte)[]) hget(const(ubyte)[] key, const(ubyte)[] field) {
295     getClient(key).hget(key, field);
296     return getResponse(BuilderFactory.BYTE_ARRAY);
297   }
298 
299   // override
300   Response!(Map!(string, string)) hgetAll(string key) {
301     getClient(key).hgetAll(key);
302     return getResponse(BuilderFactory.STRING_MAP);
303   }
304 
305   // override
306   Response!(Map!(const(ubyte)[], const(ubyte)[])) hgetAll(const(ubyte)[] key) {
307     getClient(key).hgetAll(key);
308     return getResponse(BuilderFactory.BYTE_ARRAY_MAP);
309   }
310 
311   // override
312   Response!(Long) hincrBy(string key, string field, long value) {
313     getClient(key).hincrBy(key, field, value);
314     return getResponse(BuilderFactory.LONG);
315   }
316 
317   // override
318   Response!(Long) hincrBy(const(ubyte)[] key, const(ubyte)[] field, long value) {
319     getClient(key).hincrBy(key, field, value);
320     return getResponse(BuilderFactory.LONG);
321   }
322 
323   // override
324   Response!(Set!(string)) hkeys(string key) {
325     getClient(key).hkeys(key);
326     return getResponse(BuilderFactory.STRING_SET);
327   }
328 
329   // override
330   Response!(Set!(const(ubyte)[])) hkeys(const(ubyte)[] key) {
331     getClient(key).hkeys(key);
332     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
333   }
334 
335   // override
336   Response!(Long) hlen(string key) {
337     getClient(key).hlen(key);
338     return getResponse(BuilderFactory.LONG);
339   }
340 
341   // override
342   Response!(Long) hlen(const(ubyte)[] key) {
343     getClient(key).hlen(key);
344     return getResponse(BuilderFactory.LONG);
345   }
346 
347   // override
348   Response!(List!(string)) hmget(string key, string[] fields...) {
349     getClient(key).hmget(key, fields);
350     return getResponse(BuilderFactory.STRING_LIST);
351   }
352 
353   // override
354   Response!(List!(const(ubyte)[])) hmget(const(ubyte)[] key, const(ubyte)[][] fields...) {
355     getClient(key).hmget(key, fields);
356     return getResponse(BuilderFactory.BYTE_ARRAY_LIST);
357   }
358 
359   // override
360   Response!(string) hmset(string key, Map!(string, string) hash) {
361     getClient(key).hmset(key, hash);
362     return getResponse(BuilderFactory.STRING);
363   }
364 
365   // override
366   Response!(string) hmset(const(ubyte)[] key, Map!(const(ubyte)[], const(ubyte)[]) hash) {
367     getClient(key).hmset(key, hash);
368     return getResponse(BuilderFactory.STRING);
369   }
370 
371   // override
372   Response!(Long) hset(string key, string field, string value) {
373     getClient(key).hset(key, field, value);
374     return getResponse(BuilderFactory.LONG);
375   }
376 
377   // override
378   Response!(Long) hset(const(ubyte)[] key, const(ubyte)[] field, const(ubyte)[] value) {
379     getClient(key).hset(key, field, value);
380     return getResponse(BuilderFactory.LONG);
381   }
382 
383   // override
384   Response!(Long) hset(string key, Map!(string, string) hash) {
385     getClient(key).hset(key, hash);
386     return getResponse(BuilderFactory.LONG);
387   }
388 
389   // override
390   Response!(Long) hset(const(ubyte)[] key, Map!(const(ubyte)[], const(ubyte)[]) hash) {
391     getClient(key).hset(key, hash);
392     return getResponse(BuilderFactory.LONG);
393   }
394 
395   // override
396   Response!(Long) hsetnx(string key, string field, string value) {
397     getClient(key).hsetnx(key, field, value);
398     return getResponse(BuilderFactory.LONG);
399   }
400 
401   // override
402   Response!(Long) hsetnx(const(ubyte)[] key, const(ubyte)[] field, const(ubyte)[] value) {
403     getClient(key).hsetnx(key, field, value);
404     return getResponse(BuilderFactory.LONG);
405   }
406 
407   // override
408   Response!(List!(string)) hvals(string key) {
409     getClient(key).hvals(key);
410     return getResponse(BuilderFactory.STRING_LIST);
411   }
412 
413   // override
414   Response!(List!(const(ubyte)[])) hvals(const(ubyte)[] key) {
415     getClient(key).hvals(key);
416     return getResponse(BuilderFactory.BYTE_ARRAY_LIST);
417   }
418 
419   // override
420   Response!(Long) incr(string key) {
421     getClient(key).incr(key);
422     return getResponse(BuilderFactory.LONG);
423   }
424 
425   // override
426   Response!(Long) incr(const(ubyte)[] key) {
427     getClient(key).incr(key);
428     return getResponse(BuilderFactory.LONG);
429   }
430 
431   // override
432   Response!(Long) incrBy(string key, long increment) {
433     getClient(key).incrBy(key, increment);
434     return getResponse(BuilderFactory.LONG);
435   }
436 
437   // override
438   Response!(Long) incrBy(const(ubyte)[] key, long increment) {
439     getClient(key).incrBy(key, increment);
440     return getResponse(BuilderFactory.LONG);
441   }
442 
443   // override
444   Response!(string) lindex(string key, long index) {
445     getClient(key).lindex(key, index);
446     return getResponse(BuilderFactory.STRING);
447   }
448 
449   // override
450   Response!(const(ubyte)[]) lindex(const(ubyte)[] key, long index) {
451     getClient(key).lindex(key, index);
452     return getResponse(BuilderFactory.BYTE_ARRAY);
453   }
454 
455   // override
456   Response!(Long) linsert(string key, ListPosition where, string pivot, string value) {
457     getClient(key).linsert(key, where, pivot, value);
458     return getResponse(BuilderFactory.LONG);
459   }
460 
461   // override
462   Response!(Long) linsert(const(ubyte)[] key, ListPosition where, const(ubyte)[] pivot, const(ubyte)[] value) {
463     getClient(key).linsert(key, where, pivot, value);
464     return getResponse(BuilderFactory.LONG);
465   }
466 
467   // override
468   Response!(Long) llen(string key) {
469     getClient(key).llen(key);
470     return getResponse(BuilderFactory.LONG);
471   }
472 
473   // override
474   Response!(Long) llen(const(ubyte)[] key) {
475     getClient(key).llen(key);
476     return getResponse(BuilderFactory.LONG);
477   }
478 
479   // override
480   Response!(string) lpop(string key) {
481     getClient(key).lpop(key);
482     return getResponse(BuilderFactory.STRING);
483   }
484 
485   // override
486   Response!(const(ubyte)[]) lpop(const(ubyte)[] key) {
487     getClient(key).lpop(key);
488     return getResponse(BuilderFactory.BYTE_ARRAY);
489   }
490 
491   // override
492   Response!(Long) lpush(string key, string[] string...) {
493     getClient(key).lpush(key, string);
494     return getResponse(BuilderFactory.LONG);
495   }
496 
497   // override
498   Response!(Long) lpush(const(ubyte)[] key, const(ubyte)[][] string...) {
499     getClient(key).lpush(key, string);
500     return getResponse(BuilderFactory.LONG);
501   }
502 
503   // override
504   Response!(Long) lpushx(string key, string[] string...) {
505     getClient(key).lpushx(key, string);
506     return getResponse(BuilderFactory.LONG);
507   }
508 
509   // override
510   Response!(Long) lpushx(const(ubyte)[] key, const(ubyte)[][] bytes...) {
511     getClient(key).lpushx(key, bytes);
512     return getResponse(BuilderFactory.LONG);
513   }
514 
515   // override
516   Response!(List!(string)) lrange(string key, long start, long stop) {
517     getClient(key).lrange(key, start, stop);
518     return getResponse(BuilderFactory.STRING_LIST);
519   }
520 
521   // override
522   Response!(List!(const(ubyte)[])) lrange(const(ubyte)[] key, long start, long stop) {
523     getClient(key).lrange(key, start, stop);
524     return getResponse(BuilderFactory.BYTE_ARRAY_LIST);
525   }
526 
527   // override
528   Response!(Long) lrem(string key, long count, string value) {
529     getClient(key).lrem(key, count, value);
530     return getResponse(BuilderFactory.LONG);
531   }
532 
533   // override
534   Response!(Long) lrem(const(ubyte)[] key, long count, const(ubyte)[] value) {
535     getClient(key).lrem(key, count, value);
536     return getResponse(BuilderFactory.LONG);
537   }
538 
539   // override
540   Response!(string) lset(string key, long index, string value) {
541     getClient(key).lset(key, index, value);
542     return getResponse(BuilderFactory.STRING);
543   }
544 
545   // override
546   Response!(string) lset(const(ubyte)[] key, long index, const(ubyte)[] value) {
547     getClient(key).lset(key, index, value);
548     return getResponse(BuilderFactory.STRING);
549   }
550 
551   // override
552   Response!(string) ltrim(string key, long start, long stop) {
553     getClient(key).ltrim(key, start, stop);
554     return getResponse(BuilderFactory.STRING);
555   }
556 
557   // override
558   Response!(string) ltrim(const(ubyte)[] key, long start, long stop) {
559     getClient(key).ltrim(key, start, stop);
560     return getResponse(BuilderFactory.STRING);
561   }
562 
563   // override
564   Response!(Long) move(string key, int dbIndex) {
565     getClient(key).move(key, dbIndex);
566     return getResponse(BuilderFactory.LONG);
567   }
568 
569   // override
570   Response!(Long) move(const(ubyte)[] key, int dbIndex) {
571     getClient(key).move(key, dbIndex);
572     return getResponse(BuilderFactory.LONG);
573   }
574 
575   // override
576   Response!(Long) persist(string key) {
577     getClient(key).persist(key);
578     return getResponse(BuilderFactory.LONG);
579   }
580 
581   // override
582   Response!(Long) persist(const(ubyte)[] key) {
583     getClient(key).persist(key);
584     return getResponse(BuilderFactory.LONG);
585   }
586 
587   // override
588   Response!(string) rpop(string key) {
589     getClient(key).rpop(key);
590     return getResponse(BuilderFactory.STRING);
591   }
592 
593   // override
594   Response!(const(ubyte)[]) rpop(const(ubyte)[] key) {
595     getClient(key).rpop(key);
596     return getResponse(BuilderFactory.BYTE_ARRAY);
597   }
598 
599   // override
600   Response!(Long) rpush(string key, string[] string...) {
601     getClient(key).rpush(key, string);
602     return getResponse(BuilderFactory.LONG);
603   }
604 
605   // override
606   Response!(Long) rpush(const(ubyte)[] key, const(ubyte)[][] string...) {
607     getClient(key).rpush(key, string);
608     return getResponse(BuilderFactory.LONG);
609   }
610 
611   // override
612   Response!(Long) rpushx(string key, string[] string...) {
613     getClient(key).rpushx(key, string);
614     return getResponse(BuilderFactory.LONG);
615   }
616 
617   // override
618   Response!(Long) rpushx(const(ubyte)[] key, const(ubyte)[][] string...) {
619     getClient(key).rpushx(key, string);
620     return getResponse(BuilderFactory.LONG);
621   }
622 
623   // override
624   Response!(Long) sadd(string key, string[] member...) {
625     getClient(key).sadd(key, member);
626     return getResponse(BuilderFactory.LONG);
627   }
628 
629   // override
630   Response!(Long) sadd(const(ubyte)[] key, const(ubyte)[][] member...) {
631     getClient(key).sadd(key, member);
632     return getResponse(BuilderFactory.LONG);
633   }
634 
635   // override
636   Response!(Long) scard(string key) {
637     getClient(key).scard(key);
638     return getResponse(BuilderFactory.LONG);
639   }
640 
641   // override
642   Response!(Long) scard(const(ubyte)[] key) {
643     getClient(key).scard(key);
644     return getResponse(BuilderFactory.LONG);
645   }
646 
647   // override
648   Response!(string) set(string key, string value) {
649     getClient(key).set(key, value);
650     return getResponse(BuilderFactory.STRING);
651   }
652 
653   // override
654   Response!(string) set(const(ubyte)[] key, const(ubyte)[] value) {
655     getClient(key).set(key, value);
656     return getResponse(BuilderFactory.STRING);
657   }
658 
659   // override
660   Response!(string) set(string key, string value, SetParams params) {
661     getClient(key).set(key, value, params);
662     return getResponse(BuilderFactory.STRING);
663   }
664 
665   // override
666   Response!(string) set(const(ubyte)[] key, const(ubyte)[] value, SetParams params) {
667     getClient(key).set(key, value, params);
668     return getResponse(BuilderFactory.STRING);
669   }
670 
671   // override
672   Response!(Boolean) setbit(string key, long offset, bool value) {
673     getClient(key).setbit(key, offset, value);
674     return getResponse(BuilderFactory.BOOLEAN);
675   }
676 
677   // override
678   Response!(Boolean) setbit(const(ubyte)[] key, long offset, const(ubyte)[] value) {
679     getClient(key).setbit(key, offset, value);
680     return getResponse(BuilderFactory.BOOLEAN);
681   }
682 
683   // override
684   Response!(string) setex(string key, int seconds, string value) {
685     getClient(key).setex(key, seconds, value);
686     return getResponse(BuilderFactory.STRING);
687   }
688 
689   // override
690   Response!(string) setex(const(ubyte)[] key, int seconds, const(ubyte)[] value) {
691     getClient(key).setex(key, seconds, value);
692     return getResponse(BuilderFactory.STRING);
693   }
694 
695   // override
696   Response!(Long) setnx(string key, string value) {
697     getClient(key).setnx(key, value);
698     return getResponse(BuilderFactory.LONG);
699   }
700 
701   // override
702   Response!(Long) setnx(const(ubyte)[] key, const(ubyte)[] value) {
703     getClient(key).setnx(key, value);
704     return getResponse(BuilderFactory.LONG);
705   }
706 
707   // override
708   Response!(Long) setrange(string key, long offset, string value) {
709     getClient(key).setrange(key, offset, value);
710     return getResponse(BuilderFactory.LONG);
711   }
712 
713   // override
714   Response!(Long) setrange(const(ubyte)[] key, long offset, const(ubyte)[] value) {
715     getClient(key).setrange(key, offset, value);
716     return getResponse(BuilderFactory.LONG);
717   }
718 
719   // override
720   Response!(Boolean) sismember(string key, string member) {
721     getClient(key).sismember(key, member);
722     return getResponse(BuilderFactory.BOOLEAN);
723   }
724 
725   // override
726   Response!(Boolean) sismember(const(ubyte)[] key, const(ubyte)[] member) {
727     getClient(key).sismember(key, member);
728     return getResponse(BuilderFactory.BOOLEAN);
729   }
730 
731   // override
732   Response!(Set!(string)) smembers(string key) {
733     getClient(key).smembers(key);
734     return getResponse(BuilderFactory.STRING_SET);
735   }
736 
737   // override
738   Response!(Set!(const(ubyte)[])) smembers(const(ubyte)[] key) {
739     getClient(key).smembers(key);
740     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
741   }
742 
743   // override
744   Response!(List!(string)) sort(string key) {
745     getClient(key).sort(key);
746     return getResponse(BuilderFactory.STRING_LIST);
747   }
748 
749   // override
750   Response!(List!(const(ubyte)[])) sort(const(ubyte)[] key) {
751     getClient(key).sort(key);
752     return getResponse(BuilderFactory.BYTE_ARRAY_LIST);
753   }
754 
755   // override
756   Response!(List!(string)) sort(string key, SortingParams sortingParameters) {
757     getClient(key).sort(key, sortingParameters);
758     return getResponse(BuilderFactory.STRING_LIST);
759   }
760 
761   // override
762   Response!(List!(const(ubyte)[])) sort(const(ubyte)[] key, SortingParams sortingParameters) {
763     getClient(key).sort(key, sortingParameters);
764     return getResponse(BuilderFactory.BYTE_ARRAY_LIST);
765   }
766 
767   // override
768   Response!(string) spop(string key) {
769     getClient(key).spop(key);
770     return getResponse(BuilderFactory.STRING);
771   }
772 
773   // override
774   Response!(Set!(string)) spop(string key, long count) {
775     getClient(key).spop(key, count);
776     return getResponse(BuilderFactory.STRING_SET);
777   }
778 
779   // override
780   Response!(const(ubyte)[]) spop(const(ubyte)[] key) {
781     getClient(key).spop(key);
782     return getResponse(BuilderFactory.BYTE_ARRAY);
783   }
784 
785   // override
786   Response!(Set!(const(ubyte)[])) spop(const(ubyte)[] key, long count) {
787     getClient(key).spop(key, count);
788     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
789   }
790 
791   // override
792   Response!(string) srandmember(string key) {
793     getClient(key).srandmember(key);
794     return getResponse(BuilderFactory.STRING);
795   }
796 
797   // override
798   Response!(List!(string)) srandmember(string key, int count) {
799     getClient(key).srandmember(key, count);
800     return getResponse(BuilderFactory.STRING_LIST);
801   }
802 
803   // override
804   Response!(const(ubyte)[]) srandmember(const(ubyte)[] key) {
805     getClient(key).srandmember(key);
806     return getResponse(BuilderFactory.BYTE_ARRAY);
807   }
808 
809   // override
810   Response!(List!(const(ubyte)[])) srandmember(const(ubyte)[] key, int count) {
811     getClient(key).srandmember(key, count);
812     return getResponse(BuilderFactory.BYTE_ARRAY_LIST);
813   }
814 
815   // override
816   Response!(Long) srem(string key, string[] member...) {
817     getClient(key).srem(key, member);
818     return getResponse(BuilderFactory.LONG);
819   }
820 
821   // override
822   Response!(Long) srem(const(ubyte)[] key, const(ubyte)[][] member...) {
823     getClient(key).srem(key, member);
824     return getResponse(BuilderFactory.LONG);
825   }
826 
827   // override
828   Response!(Long) strlen(string key) {
829     getClient(key).strlen(key);
830     return getResponse(BuilderFactory.LONG);
831   }
832 
833   // override
834   Response!(Long) strlen(const(ubyte)[] key) {
835     getClient(key).strlen(key);
836     return getResponse(BuilderFactory.LONG);
837   }
838 
839   // override
840   Response!(string) substr(string key, int start, int end) {
841     getClient(key).substr(key, start, end);
842     return getResponse(BuilderFactory.STRING);
843   }
844 
845   // override
846   Response!(string) substr(const(ubyte)[] key, int start, int end) {
847     getClient(key).substr(key, start, end);
848     return getResponse(BuilderFactory.STRING);
849   }
850 
851   // override
852   Response!(Long) touch(string key) {
853     getClient(key).touch(key);
854     return getResponse(BuilderFactory.LONG);
855   }
856 
857   // override
858   Response!(Long) touch(const(ubyte)[] key) {
859     getClient(key).touch(key);
860     return getResponse(BuilderFactory.LONG);
861   }
862 
863   // override
864   Response!(Long) ttl(string key) {
865     getClient(key).ttl(key);
866     return getResponse(BuilderFactory.LONG);
867   }
868 
869   // override
870   Response!(Long) ttl(const(ubyte)[] key) {
871     getClient(key).ttl(key);
872     return getResponse(BuilderFactory.LONG);
873   }
874 
875   // override
876   Response!(string) type(string key) {
877     getClient(key).type(key);
878     return getResponse(BuilderFactory.STRING);
879   }
880 
881   // override
882   Response!(string) type(const(ubyte)[] key) {
883     getClient(key).type(key);
884     return getResponse(BuilderFactory.STRING);
885   }
886 
887   // override
888   Response!(Long) zadd(string key, double score, string member) {
889     getClient(key).zadd(key, score, member);
890     return getResponse(BuilderFactory.LONG);
891   }
892 
893   // override
894   Response!(Long) zadd(string key, double score, string member, ZAddParams params) {
895     getClient(key).zadd(key, score, member, params);
896     return getResponse(BuilderFactory.LONG);
897   }
898 
899   // override
900   Response!(Long) zadd(string key, Map!(string, double) scoreMembers) {
901     getClient(key).zadd(key, scoreMembers);
902     return getResponse(BuilderFactory.LONG);
903   }
904 
905   // override
906   Response!(Long) zadd(string key, Map!(string, double) scoreMembers, ZAddParams params) {
907     getClient(key).zadd(key, scoreMembers, params);
908     return getResponse(BuilderFactory.LONG);
909   }
910 
911   // override
912   Response!(Long) zadd(const(ubyte)[] key, double score, const(ubyte)[] member) {
913     getClient(key).zadd(key, score, member);
914     return getResponse(BuilderFactory.LONG);
915   }
916 
917   // override
918   Response!(Long) zadd(const(ubyte)[] key, double score, const(ubyte)[] member, ZAddParams params) {
919     getClient(key).zadd(key, score, member, params);
920     return getResponse(BuilderFactory.LONG);
921   }
922 
923   // override
924   Response!(Long) zadd(const(ubyte)[] key, Map!(const(ubyte)[], double) scoreMembers) {
925     getClient(key).zadd(key, scoreMembers);
926     return getResponse(BuilderFactory.LONG);
927   }
928 
929   // override
930   Response!(Long) zadd(const(ubyte)[] key, Map!(const(ubyte)[], double) scoreMembers, ZAddParams params) {
931     getClient(key).zadd(key, scoreMembers, params);
932     return getResponse(BuilderFactory.LONG);
933   }
934 
935   // override
936   Response!(Long) zcard(string key) {
937     getClient(key).zcard(key);
938     return getResponse(BuilderFactory.LONG);
939   }
940 
941   // override
942   Response!(Long) zcard(const(ubyte)[] key) {
943     getClient(key).zcard(key);
944     return getResponse(BuilderFactory.LONG);
945   }
946 
947   // override
948   Response!(Long) zcount(string key, double min, double max) {
949     getClient(key).zcount(key, min, max);
950     return getResponse(BuilderFactory.LONG);
951   }
952 
953   // override
954   Response!(Long) zcount(string key, string min, string max) {
955     getClient(key).zcount(key, min, max);
956     return getResponse(BuilderFactory.LONG);
957   }
958 
959   // override
960   Response!(Long) zcount(const(ubyte)[] key, double min, double max) {
961     getClient(key).zcount(key, min, max);
962     return getResponse(BuilderFactory.LONG);
963   }
964 
965   // override
966   Response!(Long) zcount(const(ubyte)[] key, const(ubyte)[] min, const(ubyte)[] max) {
967     getClient(key).zcount(key, min, max);
968     return getResponse(BuilderFactory.LONG);
969   }
970 
971   // override
972   Response!(Double) zincrby(string key, double increment, string member) {
973     getClient(key).zincrby(key, increment, member);
974     return getResponse(BuilderFactory.DOUBLE);
975   }
976 
977   // override
978   Response!(Double) zincrby(string key, double increment, string member, ZIncrByParams params) {
979     getClient(key).zincrby(key, increment, member, params);
980     return getResponse(BuilderFactory.DOUBLE);
981   }
982 
983   // override
984   Response!(Double) zincrby(const(ubyte)[] key, double increment, const(ubyte)[] member) {
985     getClient(key).zincrby(key, increment, member);
986     return getResponse(BuilderFactory.DOUBLE);
987   }
988 
989   // override
990   Response!(Double) zincrby(const(ubyte)[] key, double increment, const(ubyte)[] member, ZIncrByParams params) {
991     getClient(key).zincrby(key, increment, member);
992     return getResponse(BuilderFactory.DOUBLE);
993   }
994 
995   // override
996   Response!(Set!(string)) zrange(string key, long start, long stop) {
997     getClient(key).zrange(key, start, stop);
998     return getResponse(BuilderFactory.STRING_ZSET);
999   }
1000 
1001   // override
1002   Response!(Set!(const(ubyte)[])) zrange(const(ubyte)[] key, long start, long stop) {
1003     getClient(key).zrange(key, start, stop);
1004     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1005   }
1006 
1007   // override
1008   Response!(Set!(string)) zrangeByScore(string key, double min, double max) {
1009     getClient(key).zrangeByScore(key, min, max);
1010     return getResponse(BuilderFactory.STRING_ZSET);
1011   }
1012 
1013   // override
1014   Response!(Set!(const(ubyte)[])) zrangeByScore(const(ubyte)[] key, double min, double max) {
1015     getClient(key).zrangeByScore(key, min, max);
1016     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1017   }
1018 
1019   // override
1020   Response!(Set!(string)) zrangeByScore(string key, string min, string max) {
1021     getClient(key).zrangeByScore(key, min, max);
1022     return getResponse(BuilderFactory.STRING_ZSET);
1023   }
1024 
1025   // override
1026   Response!(Set!(const(ubyte)[])) zrangeByScore(const(ubyte)[] key, const(ubyte)[] min, const(ubyte)[] max) {
1027     getClient(key).zrangeByScore(key, min, max);
1028     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1029   }
1030 
1031   // override
1032   Response!(Set!(string)) zrangeByScore(string key, double min, double max, int offset,
1033       int count) {
1034     getClient(key).zrangeByScore(key, min, max, offset, count);
1035     return getResponse(BuilderFactory.STRING_ZSET);
1036   }
1037 
1038   // override
1039   Response!(Set!(string)) zrangeByScore(string key, string min, string max, int offset,
1040       int count) {
1041     getClient(key).zrangeByScore(key, min, max, offset, count);
1042     return getResponse(BuilderFactory.STRING_ZSET);
1043   }
1044 
1045   // override
1046   Response!(Set!(const(ubyte)[])) zrangeByScore(const(ubyte)[] key, double min, double max, int offset,
1047       int count) {
1048     getClient(key).zrangeByScore(key, min, max, offset, count);
1049     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1050   }
1051 
1052   // override
1053   Response!(Set!(const(ubyte)[])) zrangeByScore(const(ubyte)[] key, const(ubyte)[] min, const(ubyte)[] max, int offset,
1054       int count) {
1055     getClient(key).zrangeByScore(key, min, max, offset, count);
1056     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1057   }
1058 
1059   // override
1060   Response!(Set!(Tuple)) zrangeByScoreWithScores(string key, double min, double max) {
1061     getClient(key).zrangeByScoreWithScores(key, min, max);
1062     return getResponse(BuilderFactory.TUPLE_ZSET);
1063   }
1064 
1065   // override
1066   Response!(Set!(Tuple)) zrangeByScoreWithScores(string key, string min, string max) {
1067     getClient(key).zrangeByScoreWithScores(key, min, max);
1068     return getResponse(BuilderFactory.TUPLE_ZSET);
1069   }
1070 
1071   // override
1072   Response!(Set!(Tuple)) zrangeByScoreWithScores(const(ubyte)[] key, double min, double max) {
1073     getClient(key).zrangeByScoreWithScores(key, min, max);
1074     return getResponse(BuilderFactory.TUPLE_ZSET);
1075   }
1076 
1077   // override
1078   Response!(Set!(Tuple)) zrangeByScoreWithScores(const(ubyte)[] key, const(ubyte)[] min, const(ubyte)[] max) {
1079     getClient(key).zrangeByScoreWithScores(key, min, max);
1080     return getResponse(BuilderFactory.TUPLE_ZSET);
1081   }
1082 
1083   // override
1084   Response!(Set!(Tuple)) zrangeByScoreWithScores(string key, double min, double max,
1085       int offset, int count) {
1086     getClient(key).zrangeByScoreWithScores(key, min, max, offset, count);
1087     return getResponse(BuilderFactory.TUPLE_ZSET);
1088   }
1089 
1090   // override
1091   Response!(Set!(Tuple)) zrangeByScoreWithScores(string key, string min, string max,
1092       int offset, int count) {
1093     getClient(key).zrangeByScoreWithScores(key, min, max, offset, count);
1094     return getResponse(BuilderFactory.TUPLE_ZSET);
1095   }
1096 
1097   // override
1098   Response!(Set!(Tuple)) zrangeByScoreWithScores(const(ubyte)[] key, double min, double max,
1099       int offset, int count) {
1100     getClient(key).zrangeByScoreWithScores(key, min, max, offset, count);
1101     return getResponse(BuilderFactory.TUPLE_ZSET);
1102   }
1103 
1104   // override
1105   Response!(Set!(Tuple)) zrangeByScoreWithScores(const(ubyte)[] key, const(ubyte)[] min, const(ubyte)[] max,
1106       int offset, int count) {
1107     getClient(key).zrangeByScoreWithScores(key, min, max, offset, count);
1108     return getResponse(BuilderFactory.TUPLE_ZSET);
1109   }
1110 
1111   // override
1112   Response!(Set!(string)) zrevrangeByScore(string key, double max, double min) {
1113     getClient(key).zrevrangeByScore(key, max, min);
1114     return getResponse(BuilderFactory.STRING_ZSET);
1115   }
1116 
1117   // override
1118   Response!(Set!(const(ubyte)[])) zrevrangeByScore(const(ubyte)[] key, double max, double min) {
1119     getClient(key).zrevrangeByScore(key, max, min);
1120     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1121   }
1122 
1123   // override
1124   Response!(Set!(string)) zrevrangeByScore(string key, string max, string min) {
1125     getClient(key).zrevrangeByScore(key, max, min);
1126     return getResponse(BuilderFactory.STRING_ZSET);
1127   }
1128 
1129   // override
1130   Response!(Set!(const(ubyte)[])) zrevrangeByScore(const(ubyte)[] key, const(ubyte)[] max, const(ubyte)[] min) {
1131     getClient(key).zrevrangeByScore(key, max, min);
1132     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1133   }
1134 
1135   // override
1136   Response!(Set!(string)) zrevrangeByScore(string key, double max, double min, int offset,
1137       int count) {
1138     getClient(key).zrevrangeByScore(key, max, min, offset, count);
1139     return getResponse(BuilderFactory.STRING_ZSET);
1140   }
1141 
1142   // override
1143   Response!(Set!(string)) zrevrangeByScore(string key, string max, string min, int offset,
1144       int count) {
1145     getClient(key).zrevrangeByScore(key, max, min, offset, count);
1146     return getResponse(BuilderFactory.STRING_ZSET);
1147   }
1148 
1149   // override
1150   Response!(Set!(const(ubyte)[])) zrevrangeByScore(const(ubyte)[] key, double max, double min, int offset,
1151       int count) {
1152     getClient(key).zrevrangeByScore(key, max, min, offset, count);
1153     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1154   }
1155 
1156   // override
1157   Response!(Set!(const(ubyte)[])) zrevrangeByScore(const(ubyte)[] key, const(ubyte)[] max, const(ubyte)[] min, int offset,
1158       int count) {
1159     getClient(key).zrevrangeByScore(key, max, min, offset, count);
1160     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1161   }
1162 
1163   // override
1164   Response!(Set!(Tuple)) zrevrangeByScoreWithScores(string key, double max, double min) {
1165     getClient(key).zrevrangeByScoreWithScores(key, max, min);
1166     return getResponse(BuilderFactory.TUPLE_ZSET);
1167   }
1168 
1169   // override
1170   Response!(Set!(Tuple)) zrevrangeByScoreWithScores(string key, string max, string min) {
1171     getClient(key).zrevrangeByScoreWithScores(key, max, min);
1172     return getResponse(BuilderFactory.TUPLE_ZSET);
1173   }
1174 
1175   // override
1176   Response!(Set!(Tuple)) zrevrangeByScoreWithScores(const(ubyte)[] key, double max, double min) {
1177     getClient(key).zrevrangeByScoreWithScores(key, max, min);
1178     return getResponse(BuilderFactory.TUPLE_ZSET);
1179   }
1180 
1181   // override
1182   Response!(Set!(Tuple)) zrevrangeByScoreWithScores(const(ubyte)[] key, const(ubyte)[] max, const(ubyte)[] min) {
1183     getClient(key).zrevrangeByScoreWithScores(key, max, min);
1184     return getResponse(BuilderFactory.TUPLE_ZSET);
1185   }
1186 
1187   // override
1188   Response!(Set!(Tuple)) zrevrangeByScoreWithScores(string key, double max, double min,
1189       int offset, int count) {
1190     getClient(key).zrevrangeByScoreWithScores(key, max, min, offset, count);
1191     return getResponse(BuilderFactory.TUPLE_ZSET);
1192   }
1193 
1194   // override
1195   Response!(Set!(Tuple)) zrevrangeByScoreWithScores(string key, string max, string min,
1196       int offset, int count) {
1197     getClient(key).zrevrangeByScoreWithScores(key, max, min, offset, count);
1198     return getResponse(BuilderFactory.TUPLE_ZSET);
1199   }
1200 
1201   // override
1202   Response!(Set!(Tuple)) zrevrangeByScoreWithScores(const(ubyte)[] key, double max, double min,
1203       int offset, int count) {
1204     getClient(key).zrevrangeByScoreWithScores(key, max, min, offset, count);
1205     return getResponse(BuilderFactory.TUPLE_ZSET);
1206   }
1207 
1208   // override
1209   Response!(Set!(Tuple)) zrevrangeByScoreWithScores(const(ubyte)[] key, const(ubyte)[] max, const(ubyte)[] min,
1210       int offset, int count) {
1211     getClient(key).zrevrangeByScoreWithScores(key, max, min, offset, count);
1212     return getResponse(BuilderFactory.TUPLE_ZSET);
1213   }
1214 
1215   // override
1216   Response!(Set!(Tuple)) zrangeWithScores(string key, long start, long stop) {
1217     getClient(key).zrangeWithScores(key, start, stop);
1218     return getResponse(BuilderFactory.TUPLE_ZSET);
1219   }
1220 
1221   // override
1222   Response!(Set!(Tuple)) zrangeWithScores(const(ubyte)[] key, long start, long stop) {
1223     getClient(key).zrangeWithScores(key, start, stop);
1224     return getResponse(BuilderFactory.TUPLE_ZSET);
1225   }
1226 
1227   // override
1228   Response!(Long) zrank(string key, string member) {
1229     getClient(key).zrank(key, member);
1230     return getResponse(BuilderFactory.LONG);
1231   }
1232 
1233   // override
1234   Response!(Long) zrank(const(ubyte)[] key, const(ubyte)[] member) {
1235     getClient(key).zrank(key, member);
1236     return getResponse(BuilderFactory.LONG);
1237   }
1238 
1239   // override
1240   Response!(Long) zrem(string key, string[] members...) {
1241     getClient(key).zrem(key, members);
1242     return getResponse(BuilderFactory.LONG);
1243   }
1244 
1245   // override
1246   Response!(Long) zrem(const(ubyte)[] key, const(ubyte)[][] members...) {
1247     getClient(key).zrem(key, members);
1248     return getResponse(BuilderFactory.LONG);
1249   }
1250 
1251   // override
1252   Response!(Long) zremrangeByRank(string key, long start, long stop) {
1253     getClient(key).zremrangeByRank(key, start, stop);
1254     return getResponse(BuilderFactory.LONG);
1255   }
1256 
1257   // override
1258   Response!(Long) zremrangeByRank(const(ubyte)[] key, long start, long stop) {
1259     getClient(key).zremrangeByRank(key, start, stop);
1260     return getResponse(BuilderFactory.LONG);
1261   }
1262 
1263   // override
1264   Response!(Long) zremrangeByScore(string key, double min, double max) {
1265     getClient(key).zremrangeByScore(key, min, max);
1266     return getResponse(BuilderFactory.LONG);
1267   }
1268 
1269   // override
1270   Response!(Long) zremrangeByScore(string key, string min, string max) {
1271     getClient(key).zremrangeByScore(key, min, max);
1272     return getResponse(BuilderFactory.LONG);
1273   }
1274 
1275   // override
1276   Response!(Long) zremrangeByScore(const(ubyte)[] key, double min, double max) {
1277     getClient(key).zremrangeByScore(key, min, max);
1278     return getResponse(BuilderFactory.LONG);
1279   }
1280 
1281   // override
1282   Response!(Long) zremrangeByScore(const(ubyte)[] key, const(ubyte)[] min, const(ubyte)[] max) {
1283     getClient(key).zremrangeByScore(key, min, max);
1284     return getResponse(BuilderFactory.LONG);
1285   }
1286 
1287   // override
1288   Response!(Set!(string)) zrevrange(string key, long start, long stop) {
1289     getClient(key).zrevrange(key, start, stop);
1290     return getResponse(BuilderFactory.STRING_ZSET);
1291   }
1292 
1293   // override
1294   Response!(Set!(const(ubyte)[])) zrevrange(const(ubyte)[] key, long start, long stop) {
1295     getClient(key).zrevrange(key, start, stop);
1296     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1297   }
1298 
1299   // override
1300   Response!(Set!(Tuple)) zrevrangeWithScores(string key, long start, long stop) {
1301     getClient(key).zrevrangeWithScores(key, start, stop);
1302     return getResponse(BuilderFactory.TUPLE_ZSET);
1303   }
1304 
1305   // override
1306   Response!(Set!(Tuple)) zrevrangeWithScores(const(ubyte)[] key, long start, long stop) {
1307     getClient(key).zrevrangeWithScores(key, start, stop);
1308     return getResponse(BuilderFactory.TUPLE_ZSET);
1309   }
1310 
1311   // override
1312   Response!(Long) zrevrank(string key, string member) {
1313     getClient(key).zrevrank(key, member);
1314     return getResponse(BuilderFactory.LONG);
1315   }
1316 
1317   // override
1318   Response!(Long) zrevrank(const(ubyte)[] key, const(ubyte)[] member) {
1319     getClient(key).zrevrank(key, member);
1320     return getResponse(BuilderFactory.LONG);
1321   }
1322 
1323   // override
1324   Response!(Double) zscore(string key, string member) {
1325     getClient(key).zscore(key, member);
1326     return getResponse(BuilderFactory.DOUBLE);
1327   }
1328 
1329   // override
1330   Response!(Double) zscore(const(ubyte)[] key, const(ubyte)[] member) {
1331     getClient(key).zscore(key, member);
1332     return getResponse(BuilderFactory.DOUBLE);
1333   }
1334 
1335   // override
1336   Response!(Long) zlexcount(const(ubyte)[] key, const(ubyte)[] min, const(ubyte)[] max) {
1337     getClient(key).zlexcount(key, min, max);
1338     return getResponse(BuilderFactory.LONG);
1339   }
1340 
1341   // override
1342   Response!(Long) zlexcount(string key, string min, string max) {
1343     getClient(key).zlexcount(key, min, max);
1344     return getResponse(BuilderFactory.LONG);
1345   }
1346 
1347   // override
1348   Response!(Set!(const(ubyte)[])) zrangeByLex(const(ubyte)[] key, const(ubyte)[] min, const(ubyte)[] max) {
1349     getClient(key).zrangeByLex(key, min, max);
1350     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1351   }
1352 
1353   // override
1354   Response!(Set!(string)) zrangeByLex(string key, string min, string max) {
1355     getClient(key).zrangeByLex(key, min, max);
1356     return getResponse(BuilderFactory.STRING_ZSET);
1357   }
1358 
1359   // override
1360   Response!(Set!(const(ubyte)[])) zrangeByLex(const(ubyte)[] key, const(ubyte)[] min, const(ubyte)[] max,
1361       int offset, int count) {
1362     getClient(key).zrangeByLex(key, min, max, offset, count);
1363     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1364   }
1365 
1366   // override
1367   Response!(Set!(string)) zrangeByLex(string key, string min, string max,
1368       int offset, int count) {
1369     getClient(key).zrangeByLex(key, min, max, offset, count);
1370     return getResponse(BuilderFactory.STRING_ZSET);
1371   }
1372 
1373   // override
1374   Response!(Set!(const(ubyte)[])) zrevrangeByLex(const(ubyte)[] key, const(ubyte)[] max, const(ubyte)[] min) {
1375     getClient(key).zrevrangeByLex(key, max, min);
1376     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1377   }
1378 
1379   // override
1380   Response!(Set!(string)) zrevrangeByLex(string key, string max, string min) {
1381     getClient(key).zrevrangeByLex(key, max, min);
1382     return getResponse(BuilderFactory.STRING_ZSET);
1383   }
1384 
1385   // override
1386   Response!(Set!(const(ubyte)[])) zrevrangeByLex(const(ubyte)[] key, const(ubyte)[] max, const(ubyte)[] min,
1387       int offset, int count) {
1388     getClient(key).zrevrangeByLex(key, max, min, offset, count);
1389     return getResponse(BuilderFactory.BYTE_ARRAY_ZSET);
1390   }
1391 
1392   // override
1393   Response!(Set!(string)) zrevrangeByLex(string key, string max, string min,
1394       int offset, int count) {
1395     getClient(key).zrevrangeByLex(key, max, min, offset, count);
1396     return getResponse(BuilderFactory.STRING_ZSET);
1397   }
1398 
1399   // override
1400   Response!(Long) zremrangeByLex(const(ubyte)[] key, const(ubyte)[] min, const(ubyte)[] max) {
1401     getClient(key).zremrangeByLex(key, min, max);
1402     return getResponse(BuilderFactory.LONG);
1403   }
1404 
1405   // override
1406   Response!(Long) zremrangeByLex(string key, string min, string max) {
1407     getClient(key).zremrangeByLex(key, min, max);
1408     return getResponse(BuilderFactory.LONG);
1409   }
1410 
1411   // override
1412   Response!(Long) bitcount(string key) {
1413     getClient(key).bitcount(key);
1414     return getResponse(BuilderFactory.LONG);
1415   }
1416 
1417   // override
1418   Response!(Long) bitcount(string key, long start, long end) {
1419     getClient(key).bitcount(key, start, end);
1420     return getResponse(BuilderFactory.LONG);
1421   }
1422 
1423   // override
1424   Response!(Long) bitcount(const(ubyte)[] key) {
1425     getClient(key).bitcount(key);
1426     return getResponse(BuilderFactory.LONG);
1427   }
1428 
1429   // override
1430   Response!(Long) bitcount(const(ubyte)[] key, long start, long end) {
1431     getClient(key).bitcount(key, start, end);
1432     return getResponse(BuilderFactory.LONG);
1433   }
1434 
1435   // // override
1436   Response!(const(ubyte)[]) dump(string key) {
1437     getClient(key).dump(key);
1438     return getResponse(BuilderFactory.BYTE_ARRAY);
1439   }
1440 
1441   // override
1442   Response!(const(ubyte)[]) dump(const(ubyte)[] key) {
1443     getClient(key).dump(key);
1444     return getResponse(BuilderFactory.BYTE_ARRAY);
1445   }
1446 
1447   // override
1448   Response!(string) migrate(string host, int port,
1449       string key, int destinationDb, int timeout) {
1450     getClient(key).migrate(host, port, key, destinationDb, timeout);
1451     return getResponse(BuilderFactory.STRING);
1452   }
1453 
1454   // override
1455   Response!(string) migrate(string host, int port,
1456       const(ubyte)[] key, int destinationDb, int timeout) {
1457     getClient(key).migrate(host, port, key, destinationDb, timeout);
1458     return getResponse(BuilderFactory.STRING);
1459   }
1460 
1461   // override
1462   Response!(Long) objectRefcount(string key) {
1463     getClient(key).objectRefcount(key);
1464     return getResponse(BuilderFactory.LONG);
1465   }
1466 
1467   // override
1468   Response!(Long) objectRefcount(const(ubyte)[] key) {
1469     getClient(key).objectRefcount(key);
1470     return getResponse(BuilderFactory.LONG);
1471   }
1472 
1473   // override
1474   Response!(string) objectEncoding(string key) {
1475     getClient(key).objectEncoding(key);
1476     return getResponse(BuilderFactory.STRING);
1477   }
1478 
1479   // override
1480   Response!(const(ubyte)[]) objectEncoding(const(ubyte)[] key) {
1481     getClient(key).objectEncoding(key);
1482     return getResponse(BuilderFactory.BYTE_ARRAY);
1483   }
1484 
1485   // override
1486   Response!(Long) objectIdletime(string key) {
1487     getClient(key).objectIdletime(key);
1488     return getResponse(BuilderFactory.LONG);
1489   }
1490 
1491   // override
1492   Response!(Long) objectIdletime(const(ubyte)[] key) {
1493     getClient(key).objectIdletime(key);
1494     return getResponse(BuilderFactory.LONG);
1495   }
1496 
1497   // override
1498   Response!(Long) pexpire(string key, long milliseconds) {
1499     getClient(key).pexpire(key, milliseconds);
1500     return getResponse(BuilderFactory.LONG);
1501   }
1502 
1503   // override
1504   Response!(Long) pexpire(const(ubyte)[] key, long milliseconds) {
1505     getClient(key).pexpire(key, milliseconds);
1506     return getResponse(BuilderFactory.LONG);
1507   }
1508 
1509   // override
1510   Response!(Long) pexpireAt(string key, long millisecondsTimestamp) {
1511     getClient(key).pexpireAt(key, millisecondsTimestamp);
1512     return getResponse(BuilderFactory.LONG);
1513   }
1514 
1515   // override
1516   Response!(Long) pexpireAt(const(ubyte)[] key, long millisecondsTimestamp) {
1517     getClient(key).pexpireAt(key, millisecondsTimestamp);
1518     return getResponse(BuilderFactory.LONG);
1519   }
1520 
1521   // override
1522   Response!(Long) pttl(string key) {
1523     getClient(key).pttl(key);
1524     return getResponse(BuilderFactory.LONG);
1525   }
1526 
1527   // override
1528   Response!(Long) pttl(const(ubyte)[] key) {
1529     getClient(key).pttl(key);
1530     return getResponse(BuilderFactory.LONG);
1531   }
1532 
1533   // override
1534   Response!(string) restore(string key, int ttl, const(ubyte)[] serializedValue) {
1535     getClient(key).restore(key, ttl, serializedValue);
1536     return getResponse(BuilderFactory.STRING);
1537   }
1538 
1539   // override
1540   Response!(string) restore(const(ubyte)[] key, int ttl, const(ubyte)[] serializedValue) {
1541     getClient(key).restore(key, ttl, serializedValue);
1542     return getResponse(BuilderFactory.STRING);
1543   }
1544 
1545   // override
1546   Response!(string) restoreReplace(string key, int ttl, const(ubyte)[] serializedValue) {
1547     getClient(key).restoreReplace(key, ttl, serializedValue);
1548     return getResponse(BuilderFactory.STRING);
1549   }
1550 
1551   // override
1552   Response!(string) restoreReplace(const(ubyte)[] key, int ttl, const(ubyte)[] serializedValue) {
1553     getClient(key).restoreReplace(key, ttl, serializedValue);
1554     return getResponse(BuilderFactory.STRING);
1555   }
1556 
1557   // override
1558   Response!(Double) incrByFloat(string key, double increment) {
1559     getClient(key).incrByFloat(key, increment);
1560     return getResponse(BuilderFactory.DOUBLE);
1561   }
1562 
1563   // override
1564   Response!(Double) incrByFloat(const(ubyte)[] key, double increment) {
1565     getClient(key).incrByFloat(key, increment);
1566     return getResponse(BuilderFactory.DOUBLE);
1567   }
1568 
1569   // override
1570   Response!(string) psetex(string key, long milliseconds, string value) {
1571     getClient(key).psetex(key, milliseconds, value);
1572     return getResponse(BuilderFactory.STRING);
1573   }
1574 
1575   // override
1576   Response!(string) psetex(const(ubyte)[] key, long milliseconds, const(ubyte)[] value) {
1577     getClient(key).psetex(key, milliseconds, value);
1578     return getResponse(BuilderFactory.STRING);
1579   }
1580 
1581   // override
1582   Response!(Double) hincrByFloat(string key, string field, double increment) {
1583     getClient(key).hincrByFloat(key, field, increment);
1584     return getResponse(BuilderFactory.DOUBLE);
1585   }
1586 
1587   // override
1588   Response!(Double) hincrByFloat(const(ubyte)[] key, const(ubyte)[] field, double increment) {
1589     getClient(key).hincrByFloat(key, field, increment);
1590     return getResponse(BuilderFactory.DOUBLE);
1591   }
1592 
1593   // override
1594   Response!(Long) pfadd(const(ubyte)[] key, const(ubyte)[][] elements...) {
1595     getClient(key).pfadd(key, elements);
1596     return getResponse(BuilderFactory.LONG);
1597   }
1598 
1599   // override
1600   Response!(Long) pfcount(const(ubyte)[] key) {
1601     getClient(key).pfcount(key);
1602     return getResponse(BuilderFactory.LONG);
1603   }
1604 
1605   // override
1606   Response!(Long) pfadd(string key, string[] elements...) {
1607     getClient(key).pfadd(key, elements);
1608     return getResponse(BuilderFactory.LONG);
1609   }
1610 
1611   // override
1612   Response!(Long) pfcount(string key) {
1613     getClient(key).pfcount(key);
1614     return getResponse(BuilderFactory.LONG);
1615   }
1616 
1617   // override
1618   Response!(Long) geoadd(const(ubyte)[] key, double longitude, double latitude, const(ubyte)[] member) {
1619     getClient(key).geoadd(key, longitude, latitude, member);
1620     return getResponse(BuilderFactory.LONG);
1621   }
1622 
1623   // override
1624   Response!(Long) geoadd(const(ubyte)[] key, Map!(const(ubyte)[], GeoCoordinate) memberCoordinateMap) {
1625     getClient(key).geoadd(key, memberCoordinateMap);
1626     return getResponse(BuilderFactory.LONG);
1627   }
1628 
1629   // override
1630   Response!(Long) geoadd(string key, double longitude, double latitude, string member) {
1631     getClient(key).geoadd(key, longitude, latitude, member);
1632     return getResponse(BuilderFactory.LONG);
1633   }
1634 
1635   // override
1636   Response!(Long) geoadd(string key, Map!(string, GeoCoordinate) memberCoordinateMap) {
1637     getClient(key).geoadd(key, memberCoordinateMap);
1638     return getResponse(BuilderFactory.LONG);
1639   }
1640 
1641   // override
1642   Response!(Double) geodist(const(ubyte)[] key, const(ubyte)[] member1, const(ubyte)[] member2) {
1643     getClient(key).geodist(key, member1, member2);
1644     return getResponse(BuilderFactory.DOUBLE);
1645   }
1646 
1647   // override
1648   Response!(Double) geodist(const(ubyte)[] key, const(ubyte)[] member1, const(ubyte)[] member2, GeoUnit unit) {
1649     getClient(key).geodist(key, member1, member2, unit);
1650     return getResponse(BuilderFactory.DOUBLE);
1651   }
1652 
1653   // override
1654   Response!(Double) geodist(string key, string member1, string member2) {
1655     getClient(key).geodist(key, member1, member2);
1656     return getResponse(BuilderFactory.DOUBLE);
1657   }
1658 
1659   // override
1660   Response!(Double) geodist(string key, string member1, string member2, GeoUnit unit) {
1661     getClient(key).geodist(key, member1, member2);
1662     return getResponse(BuilderFactory.DOUBLE);
1663   }
1664 
1665   // override
1666   Response!(List!(const(ubyte)[])) geohash(const(ubyte)[] key, const(ubyte)[][] members...) {
1667     getClient(key).geohash(key, members);
1668     return getResponse(BuilderFactory.BYTE_ARRAY_LIST);
1669   }
1670 
1671   // override
1672   Response!(List!(string)) geohash(string key, string[] members...) {
1673     getClient(key).geohash(key, members);
1674     return getResponse(BuilderFactory.STRING_LIST);
1675   }
1676 
1677   // override
1678   Response!(List!(GeoCoordinate)) geopos(const(ubyte)[] key, const(ubyte)[][] members...) {
1679     getClient(key).geopos(key, members);
1680     return getResponse(BuilderFactory.GEO_COORDINATE_LIST);
1681   }
1682 
1683   // override
1684   Response!(List!(GeoCoordinate)) geopos(string key, string[] members...) {
1685     getClient(key).geopos(key, members);
1686     return getResponse(BuilderFactory.GEO_COORDINATE_LIST);
1687   }
1688 
1689   // override
1690   Response!(List!(GeoRadiusResponse)) georadius(const(ubyte)[] key, double longitude, double latitude,
1691       double radius, GeoUnit unit) {
1692     getClient(key).georadius(key, longitude, latitude, radius, unit);
1693     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1694   }
1695 
1696   // override
1697   Response!(List!(GeoRadiusResponse)) georadiusReadonly(const(ubyte)[] key, double longitude, double latitude,
1698       double radius, GeoUnit unit) {
1699     getClient(key).georadiusReadonly(key, longitude, latitude, radius, unit);
1700     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1701   }
1702 
1703   // override
1704   Response!(List!(GeoRadiusResponse)) georadius(const(ubyte)[] key, double longitude, double latitude,
1705       double radius, GeoUnit unit, GeoRadiusParam param) {
1706     getClient(key).georadius(key, longitude, latitude, radius, unit, param);
1707     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1708   }
1709 
1710   // override
1711   Response!(List!(GeoRadiusResponse)) georadiusReadonly(const(ubyte)[] key, double longitude, double latitude,
1712       double radius, GeoUnit unit, GeoRadiusParam param) {
1713     getClient(key).georadiusReadonly(key, longitude, latitude, radius, unit, param);
1714     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1715   }
1716 
1717   // override
1718   Response!(List!(GeoRadiusResponse)) georadius(string key, double longitude, double latitude,
1719       double radius, GeoUnit unit) {
1720     getClient(key).georadius(key, longitude, latitude, radius, unit);
1721     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1722   }
1723 
1724   // override
1725   Response!(List!(GeoRadiusResponse)) georadiusReadonly(string key, double longitude, double latitude,
1726       double radius, GeoUnit unit) {
1727     getClient(key).georadiusReadonly(key, longitude, latitude, radius, unit);
1728     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1729   }
1730 
1731   // override
1732   Response!(List!(GeoRadiusResponse)) georadius(string key, double longitude, double latitude,
1733       double radius, GeoUnit unit, GeoRadiusParam param) {
1734     getClient(key).georadius(key, longitude, latitude, radius, unit, param);
1735     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1736   }
1737 
1738   // override
1739   Response!(List!(GeoRadiusResponse)) georadiusReadonly(string key, double longitude, double latitude,
1740       double radius, GeoUnit unit, GeoRadiusParam param) {
1741     getClient(key).georadiusReadonly(key, longitude, latitude, radius, unit, param);
1742     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1743   }
1744 
1745   // override
1746   Response!(List!(GeoRadiusResponse)) georadiusByMember(const(ubyte)[] key, const(ubyte)[] member,
1747       double radius, GeoUnit unit) {
1748     getClient(key).georadiusByMember(key, member, radius, unit);
1749     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1750   }
1751 
1752   // override
1753   Response!(List!(GeoRadiusResponse)) georadiusByMemberReadonly(const(ubyte)[] key, const(ubyte)[] member,
1754       double radius, GeoUnit unit) {
1755     getClient(key).georadiusByMemberReadonly(key, member, radius, unit);
1756     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1757   }
1758 
1759   // override
1760   Response!(List!(GeoRadiusResponse)) georadiusByMember(const(ubyte)[] key, const(ubyte)[] member,
1761       double radius, GeoUnit unit, GeoRadiusParam param) {
1762     getClient(key).georadiusByMember(key, member, radius, unit, param);
1763     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1764   }
1765 
1766   // override
1767   Response!(List!(GeoRadiusResponse)) georadiusByMemberReadonly(const(ubyte)[] key, const(ubyte)[] member,
1768       double radius, GeoUnit unit, GeoRadiusParam param) {
1769     getClient(key).georadiusByMemberReadonly(key, member, radius, unit, param);
1770     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1771   }
1772 
1773   // override
1774   Response!(List!(GeoRadiusResponse)) georadiusByMember(string key, string member,
1775       double radius, GeoUnit unit) {
1776     getClient(key).georadiusByMember(key, member, radius, unit);
1777     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1778   }
1779 
1780   // override
1781   Response!(List!(GeoRadiusResponse)) georadiusByMemberReadonly(string key, string member,
1782       double radius, GeoUnit unit) {
1783     getClient(key).georadiusByMemberReadonly(key, member, radius, unit);
1784     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1785   }
1786 
1787   // override
1788   Response!(List!(GeoRadiusResponse)) georadiusByMember(string key, string member,
1789       double radius, GeoUnit unit, GeoRadiusParam param) {
1790     getClient(key).georadiusByMember(key, member, radius, unit, param);
1791     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1792   }
1793 
1794   // override
1795   Response!(List!(GeoRadiusResponse)) georadiusByMemberReadonly(string key, string member,
1796       double radius, GeoUnit unit, GeoRadiusParam param) {
1797     getClient(key).georadiusByMemberReadonly(key, member, radius, unit, param);
1798     return getResponse(BuilderFactory.GEORADIUS_WITH_PARAMS_RESULT);
1799   }
1800 
1801   // override
1802   Response!(List!(Long)) bitfield(string key, string[] elements...) {
1803     getClient(key).bitfield(key, elements);
1804     return getResponse(BuilderFactory.LONG_LIST);
1805   }
1806 
1807   // override
1808   Response!(List!(Long)) bitfield(const(ubyte)[] key, const(ubyte)[][] elements...) {
1809     getClient(key).bitfield(key, elements);
1810     return getResponse(BuilderFactory.LONG_LIST);
1811   }
1812 
1813   // override
1814   Response!(Long) hstrlen(string key, string field) {
1815     getClient(key).hstrlen(key, field);
1816     return getResponse(BuilderFactory.LONG);
1817   }
1818 
1819   // override
1820   Response!(Long) hstrlen(const(ubyte)[] key, const(ubyte)[] field) {
1821     getClient(key).hstrlen(key, field);
1822     return getResponse(BuilderFactory.LONG);
1823   }
1824   
1825   // override
1826   Response!(StreamEntryID) xadd(string key, StreamEntryID id, Map!(string, string) hash){
1827     return xadd(key, id, hash, Long.MAX_VALUE, true);    
1828   }
1829   
1830   // override
1831   Response!(const(ubyte)[]) xadd(const(ubyte)[] key, const(ubyte)[] id, Map!(const(ubyte)[], const(ubyte)[]) hash){
1832     return xadd(key, id, hash, Long.MAX_VALUE, true);
1833   }
1834 
1835 
1836   // override
1837   Response!(StreamEntryID) xadd(string key, StreamEntryID id, Map!(string, string) hash, long maxLen, bool approximateLength){
1838     getClient(key).xadd(key, id, hash, maxLen, approximateLength);
1839     return getResponse(BuilderFactory.STREAM_ENTRY_ID);    
1840   }
1841   
1842 
1843   // override
1844   Response!(const(ubyte)[]) xadd(const(ubyte)[] key, const(ubyte)[] id, Map!(const(ubyte)[], const(ubyte)[]) hash, long maxLen, bool approximateLength){
1845     getClient(key).xadd(key, id, hash, maxLen, approximateLength);
1846     return getResponse(BuilderFactory.BYTE_ARRAY);        
1847   }
1848 
1849   
1850   // override
1851   Response!(Long) xlen(string key){
1852     getClient(key).xlen(key);
1853     return getResponse(BuilderFactory.LONG);
1854   }
1855   
1856   // override
1857   Response!(Long) xlen(const(ubyte)[] key){
1858     getClient(key).xlen(key);
1859     return getResponse(BuilderFactory.LONG);    
1860   }
1861 
1862   // override
1863   Response!(List!(StreamEntry)) xrange(string key, StreamEntryID start, StreamEntryID end, int count){
1864     getClient(key).xrange(key, start, end, count);
1865     return getResponse(BuilderFactory.STREAM_ENTRY_LIST);        
1866   }
1867 
1868   // override
1869   Response!(List!(const(ubyte)[])) xrange(const(ubyte)[] key, const(ubyte)[] start, const(ubyte)[] end, int count){
1870     getClient(key).xrange(key, start, end, count);
1871     return getResponse(BuilderFactory.BYTE_ARRAY_LIST);            
1872   }
1873 
1874   // override
1875   Response!(List!(StreamEntry)) xrevrange(string key, StreamEntryID end, StreamEntryID start, int count){
1876     getClient(key).xrevrange(key, start, end, count);
1877     return getResponse(BuilderFactory.STREAM_ENTRY_LIST);            
1878   }
1879 
1880   // override
1881   Response!(List!(const(ubyte)[])) xrevrange(const(ubyte)[] key, const(ubyte)[] end, const(ubyte)[] start, int count){
1882     getClient(key).xrevrange(key, start, end, count);
1883     return getResponse(BuilderFactory.BYTE_ARRAY_LIST);                
1884   }
1885 
1886    
1887   // override
1888   Response!(Long) xack(string key, string group,  StreamEntryID[] ids...){
1889     getClient(key).xack(key, group, ids);
1890     return getResponse(BuilderFactory.LONG);                
1891   }
1892   
1893   // override
1894   Response!(Long) xack(const(ubyte)[] key, const(ubyte)[] group,  const(ubyte)[][] ids...){
1895     getClient(key).xack(key, group, ids);
1896     return getResponse(BuilderFactory.LONG);                    
1897   }
1898   
1899   // override
1900   Response!(string) xgroupCreate( string key, string groupname, StreamEntryID id, bool makeStream){
1901     getClient(key).xgroupCreate(key, groupname, id, makeStream);
1902     return getResponse(BuilderFactory.STRING);
1903   }
1904   
1905   // override
1906   Response!(string) xgroupCreate(const(ubyte)[] key, const(ubyte)[] groupname, const(ubyte)[] id, bool makeStream){
1907     getClient(key).xgroupCreate(key, groupname, id, makeStream);
1908     return getResponse(BuilderFactory.STRING);    
1909   }
1910   
1911   // override
1912   Response!(string) xgroupSetID( string key, string groupname, StreamEntryID id){
1913     getClient(key).xgroupSetID(key, groupname, id);
1914     return getResponse(BuilderFactory.STRING);
1915   }
1916   
1917   // override
1918   Response!(string) xgroupSetID(const(ubyte)[] key, const(ubyte)[] groupname, const(ubyte)[] id){
1919     getClient(key).xgroupSetID(key, groupname, id);
1920     return getResponse(BuilderFactory.STRING);    
1921   }
1922   
1923   // override
1924   Response!(Long) xgroupDestroy( string key, string groupname){
1925     getClient(key).xgroupDestroy(key, groupname);
1926     return getResponse(BuilderFactory.LONG);
1927   }
1928   
1929   // override
1930   Response!(Long) xgroupDestroy(const(ubyte)[] key, const(ubyte)[] groupname){
1931     getClient(key).xgroupDestroy(key, groupname);
1932     return getResponse(BuilderFactory.LONG);
1933   }
1934   
1935   // override
1936   Response!(string) xgroupDelConsumer( string key, string groupname, string consumername){
1937     getClient(key).xgroupDelConsumer(key, groupname, consumername);
1938     return getResponse(BuilderFactory.STRING);
1939   }
1940   
1941   // override
1942   Response!(string) xgroupDelConsumer(const(ubyte)[] key, const(ubyte)[] groupname, const(ubyte)[] consumername){
1943     getClient(key).xgroupDelConsumer(key, groupname, consumername);
1944     return getResponse(BuilderFactory.STRING);    
1945   }
1946 
1947   // override
1948   Response!(List!(StreamPendingEntry)) xpending(string key, string groupname, StreamEntryID start, StreamEntryID end, int count, string consumername){
1949     getClient(key).xpending(key, groupname, start, end, count, consumername);
1950     return getResponse(BuilderFactory.STREAM_PENDING_ENTRY_LIST);        
1951   }
1952   
1953   // override
1954   Response!(List!(StreamPendingEntry)) xpending(const(ubyte)[] key, const(ubyte)[] groupname, const(ubyte)[] start, const(ubyte)[] end, int count, const(ubyte)[] consumername){
1955     getClient(key).xpending(key, groupname, start, end, count, consumername);
1956     return getResponse(BuilderFactory.STREAM_PENDING_ENTRY_LIST);            
1957   }
1958 
1959   
1960   // override
1961   Response!(Long) xdel( string key, StreamEntryID[] ids...){
1962     getClient(key).xdel(key, ids);
1963     return getResponse(BuilderFactory.LONG);        
1964   }
1965 
1966   // override
1967   Response!(Long) xdel(const(ubyte)[] key, const(ubyte)[][] ids...){
1968     getClient(key).xdel(key, ids);
1969     return getResponse(BuilderFactory.LONG);            
1970   }
1971   
1972   // override
1973   Response!(Long) xtrim( string key, long maxLen, bool approximateLength){
1974     getClient(key).xtrim(key, maxLen, approximateLength);
1975     return getResponse(BuilderFactory.LONG);        
1976   }
1977   
1978   // override
1979   Response!(Long) xtrim(const(ubyte)[] key, long maxLen, bool approximateLength){
1980     getClient(key).xtrim(key, maxLen, approximateLength);
1981     return getResponse(BuilderFactory.LONG);            
1982   }
1983  
1984   // override
1985   Response!(List!(StreamEntry)) xclaim( string key, string group, string consumername, long minIdleTime, 
1986       long newIdleTime, int retries, bool force, StreamEntryID[] ids...){
1987     getClient(key).xclaim(key, group, consumername, minIdleTime, newIdleTime, retries, force, ids);
1988     return getResponse(BuilderFactory.STREAM_ENTRY_LIST);        
1989   }
1990  
1991   // override
1992   Response!(List!(const(ubyte)[])) xclaim(const(ubyte)[] key, const(ubyte)[] group, const(ubyte)[] consumername, long minIdleTime, 
1993       long newIdleTime, int retries, bool force, const(ubyte)[][] ids...){
1994     getClient(key).xclaim(key, group, consumername, minIdleTime, newIdleTime, retries, force, ids);
1995     return getResponse(BuilderFactory.BYTE_ARRAY_LIST);            
1996   }
1997 
1998   // override
1999   Response!(Object) sendCommand(ProtocolCommand cmd, string[] args...){
2000     string key = args.length > 0 ? args[0] : cmd.to!string();
2001     getClient(key).sendCommand(cmd, args);
2002     return getResponse(BuilderFactory.OBJECT);
2003   }
2004 
2005   // override
2006   Response!(Object) sendCommand(ProtocolCommand cmd, const(ubyte)[][] args...){
2007     const(ubyte)[] key = args.length > 0 ? args[0] : cast(const(ubyte)[])(cmd.to!string());
2008     getClient(key).sendCommand(cmd, args);
2009     return getResponse(BuilderFactory.OBJECT);
2010   }
2011 }