diff --git a/src/hyperloglog.c b/src/hyperloglog.c index 7fad34d5bb5d9d4ae642a27aa717e50270b65508..e3621ac95681746146ea8838328f28a928d1ede9 100644 --- a/src/hyperloglog.c +++ b/src/hyperloglog.c @@ -630,7 +630,10 @@ void pfmergeCommand(redisClient *c) { addReply(c,shared.ok); } -/* This command performs a self-test of the HLL registers implementation. +/* ========================== Testing / Debugging ========================== */ + +/* PFSELFTEST + * This command performs a self-test of the HLL registers implementation. * Something that is not easy to test from within the outside. */ #define REDIS_HLL_TEST_CYCLES 1000 void pfselftestCommand(redisClient *c) { @@ -701,3 +704,38 @@ void pfselftestCommand(redisClient *c) { cleanup: sdsfree(bitcounters); } + +/* PFGETREG + * Return the registers values of the specified HLL. */ +void pfgetregCommand(redisClient *c) { + robj *o = lookupKeyRead(c->db,c->argv[1]); + uint8_t *registers; + int j; + + if (o == NULL) { + addReplyError(c,"The specified key does not exist"); + return; + } else { + /* Key exists, check type */ + if (checkType(c,o,REDIS_STRING)) + return; + + /* If this is a string representing an HLL, the size should match + * exactly. */ + if (stringObjectLen(o) != REDIS_HLL_SIZE) { + addReplyErrorFormat(c, + "PFCOUNT target key must contain a %d bytes string.", + REDIS_HLL_SIZE); + return; + } + + registers = o->ptr; + addReplyMultiBulkLen(c,REDIS_HLL_REGISTERS); + for (j = 0; j < REDIS_HLL_REGISTERS; j++) { + uint8_t val; + + HLL_GET_REGISTER(val,registers,j); + addReplyLongLong(c,val); + } + } +} diff --git a/src/redis.c b/src/redis.c index 3e3d840c6da4d9aa5acca47a21e1d0de78ddf133..0df24a2b6ffc3de2d9e948dbc2da5d7b8ebbc166 100644 --- a/src/redis.c +++ b/src/redis.c @@ -262,7 +262,8 @@ struct redisCommand redisCommandTable[] = { {"pfselftest",pfselftestCommand,1,"r",0,NULL,0,0,0,0,0}, {"pfadd",pfaddCommand,-2,"wm",0,NULL,1,1,1,0,0}, {"pfcount",pfcountCommand,2,"w",0,NULL,1,1,1,0,0}, - {"pfmerge",pfmergeCommand,-2,"wm",0,NULL,1,-1,1,0,0} + {"pfmerge",pfmergeCommand,-2,"wm",0,NULL,1,-1,1,0,0}, + {"pfgetreg",pfgetregCommand,2,"r",0,NULL,0,0,0,0,0} }; /*============================ Utility functions ============================ */ diff --git a/src/redis.h b/src/redis.h index 4f651a25e033c6c56a69cda4c9b17425c571f6dc..536e1181a0a82cabb33cfd1e61dd952925fc5687 100644 --- a/src/redis.h +++ b/src/redis.h @@ -1355,6 +1355,7 @@ void pfselftestCommand(redisClient *c); void pfaddCommand(redisClient *c); void pfcountCommand(redisClient *c); void pfmergeCommand(redisClient *c); +void pfgetregCommand(redisClient *c); #if defined(__GNUC__) void *calloc(size_t count, size_t size) __attribute__ ((deprecated));