mirror of
http://github.com/valkey-io/valkey
synced 2024-11-22 00:52:38 +00:00
HyperLogLog: make API use the P prefix in honor of Philippe Flajolet.
This commit is contained in:
parent
f1b7608128
commit
e887c62e45
@ -435,8 +435,8 @@ uint64_t hllCount(uint8_t *registers) {
|
||||
|
||||
/* ========================== HyperLogLog commands ========================== */
|
||||
|
||||
/* HLLADD var ele ele ele ... ele => :0 or :1 */
|
||||
void hllAddCommand(redisClient *c) {
|
||||
/* PADD var ele ele ele ... ele => :0 or :1 */
|
||||
void paddCommand(redisClient *c) {
|
||||
robj *o = lookupKeyWrite(c->db,c->argv[1]);
|
||||
uint8_t *registers;
|
||||
int updated = 0, j;
|
||||
@ -482,8 +482,8 @@ void hllAddCommand(redisClient *c) {
|
||||
addReply(c, updated ? shared.cone : shared.czero);
|
||||
}
|
||||
|
||||
/* HLLCOUNT var -> approximated cardinality of set. */
|
||||
void hllCountCommand(redisClient *c) {
|
||||
/* PCOUNT var -> approximated cardinality of set. */
|
||||
void pcountCommand(redisClient *c) {
|
||||
robj *o = lookupKeyRead(c->db,c->argv[1]);
|
||||
uint8_t *registers;
|
||||
uint64_t card;
|
||||
@ -540,8 +540,8 @@ void hllCountCommand(redisClient *c) {
|
||||
}
|
||||
}
|
||||
|
||||
/* HLLMERGE dest src1 src2 src3 ... srcN => OK */
|
||||
void hllMergeCommand(redisClient *c) {
|
||||
/* PMERGE dest src1 src2 src3 ... srcN => OK */
|
||||
void pmergeCommand(redisClient *c) {
|
||||
uint8_t max[REDIS_HLL_REGISTERS];
|
||||
uint8_t *registers;
|
||||
int j, i;
|
||||
@ -614,7 +614,7 @@ void hllMergeCommand(redisClient *c) {
|
||||
* the correct value to be retained and not affect adjacent values. */
|
||||
|
||||
#define REDIS_HLL_TEST_CYCLES 1000
|
||||
void hllSelftestCommand(redisClient *c) {
|
||||
void pselftestCommand(redisClient *c) {
|
||||
int j, i;
|
||||
sds bitcounters = sdsnewlen(NULL,REDIS_HLL_SIZE);
|
||||
uint8_t bytecounters[REDIS_HLL_REGISTERS];
|
||||
|
@ -268,10 +268,10 @@ struct redisCommand redisCommandTable[] = {
|
||||
{"bitcount",bitcountCommand,-2,"r",0,NULL,1,1,1,0,0},
|
||||
{"bitpos",bitposCommand,-3,"r",0,NULL,1,1,1,0,0},
|
||||
{"wait",waitCommand,3,"rs",0,NULL,0,0,0,0,0},
|
||||
{"hllselftest",hllSelftestCommand,1,"r",0,NULL,0,0,0,0,0},
|
||||
{"hlladd",hllAddCommand,-2,"wm",0,NULL,1,1,1,0,0},
|
||||
{"hllcount",hllCountCommand,2,"w",0,NULL,1,1,1,0,0},
|
||||
{"hllmerge",hllMergeCommand,-2,"wm",0,NULL,1,-1,1,0,0}
|
||||
{"pselftest",pselftestCommand,1,"r",0,NULL,0,0,0,0,0},
|
||||
{"padd",paddCommand,-2,"wm",0,NULL,1,1,1,0,0},
|
||||
{"pcount",pcountCommand,2,"w",0,NULL,1,1,1,0,0},
|
||||
{"pmerge",pmergeCommand,-2,"wm",0,NULL,1,-1,1,0,0}
|
||||
};
|
||||
|
||||
struct evictionPoolEntry *evictionPoolAlloc(void);
|
||||
|
@ -1448,10 +1448,10 @@ void bitcountCommand(redisClient *c);
|
||||
void bitposCommand(redisClient *c);
|
||||
void replconfCommand(redisClient *c);
|
||||
void waitCommand(redisClient *c);
|
||||
void hllSelftestCommand(redisClient *c);
|
||||
void hllAddCommand(redisClient *c);
|
||||
void hllCountCommand(redisClient *c);
|
||||
void hllMergeCommand(redisClient *c);
|
||||
void pselftestCommand(redisClient *c);
|
||||
void paddCommand(redisClient *c);
|
||||
void pcountCommand(redisClient *c);
|
||||
void pmergeCommand(redisClient *c);
|
||||
|
||||
#if defined(__GNUC__)
|
||||
void *calloc(size_t count, size_t size) __attribute__ ((deprecated));
|
||||
|
@ -18,9 +18,9 @@ while true do
|
||||
elements << ele
|
||||
i += 1
|
||||
}
|
||||
r.hlladd('hll',*elements)
|
||||
r.padd('hll',*elements)
|
||||
}
|
||||
approx = r.hllcount('hll')
|
||||
approx = r.pcount('hll')
|
||||
abs_err = (approx-i).abs
|
||||
rel_err = 100.to_f*abs_err/i
|
||||
puts "#{i} vs #{approx}: #{rel_err}%"
|
||||
|
@ -30,9 +30,9 @@ def run_experiment(r,seed,max,step)
|
||||
elements << ele
|
||||
i += 1
|
||||
}
|
||||
r.hlladd('hll',*elements)
|
||||
r.padd('hll',*elements)
|
||||
}
|
||||
approx = r.hllcount('hll')
|
||||
approx = r.pcount('hll')
|
||||
err = approx-i
|
||||
rel_err = 100.to_f*err/i
|
||||
samples << [i,rel_err]
|
||||
|
Loading…
Reference in New Issue
Block a user