Skip to content

Commit befe801

Browse files
[fix] fixed CmsMerge and TopKCount long inputs from []string to []int64. Extended tests coverage (#23)
* [fix] fixed CmsMerge and TopKCount long inputs from []string to []int64. Extended tests coverage
1 parent 0fc2724 commit befe801

File tree

2 files changed

+82
-7
lines changed

2 files changed

+82
-7
lines changed

client.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -211,12 +211,12 @@ func (client *Client) TopkAdd(key string, items []string) ([]string, error) {
211211
}
212212

213213
// Returns count for an item.
214-
func (client *Client) TopkCount(key string, items []string) ([]string, error) {
214+
func (client *Client) TopkCount(key string, items []string) (result []int64, err error) {
215215
conn := client.Pool.Get()
216216
defer conn.Close()
217217
args := redis.Args{key}.AddFlat(items)
218-
result, err := conn.Do("TOPK.COUNT", args...)
219-
return redis.Strings(result, err)
218+
result, err = redis.Int64s(conn.Do("TOPK.COUNT", args...))
219+
return
220220
}
221221

222222
// Checks whether an item is one of Top-K items.
@@ -314,11 +314,12 @@ func (client *Client) CmsQuery(key string, items []string) ([]int64, error) {
314314
return redis.Int64s(result, err)
315315
}
316316

317-
// Merges several sketches into one sketch.
318-
func (client *Client) CmsMerge(key string, srcs []string, weights []string) (string, error) {
317+
// Merges several sketches into one sketch, stored at dest key
318+
// All sketches must have identical width and depth.
319+
func (client *Client) CmsMerge(dest string, srcs []string, weights []int64) (string, error) {
319320
conn := client.Pool.Get()
320321
defer conn.Close()
321-
args := redis.Args{key}.Add(len(srcs)).AddFlat(srcs)
322+
args := redis.Args{dest}.Add(len(srcs)).AddFlat(srcs)
322323
if weights != nil && len(weights) > 0 {
323324
args = args.Add("WEIGHTS").AddFlat(weights)
324325
}

client_test.go

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ func TestClient_BfExistsMulti(t *testing.T) {
133133
func TestClient_BfInsert(t *testing.T) {
134134
client.FlushAll()
135135
key := "test_bf_insert"
136+
key_expansion := "test_bf_insert_expansion"
136137
key_nocreate := "test_bf_insert_nocreate"
137138
key_noscaling := "test_bf_insert_noscaling"
138139

@@ -149,6 +150,11 @@ func TestClient_BfInsert(t *testing.T) {
149150
assert.Nil(t, err)
150151
assert.Equal(t, 2, len(ret))
151152

153+
// Test for EXPANSION : If a new sub-filter is created, its size will be the size of the current filter multiplied by expansion
154+
ret, err = client.BfInsert(key_expansion, 1000, 0.1, 4, false, false, []string{"a"})
155+
assert.Nil(t, err)
156+
assert.Equal(t, 1, len(ret))
157+
152158
// Test for NOCREATE : If specified, indicates that the filter should not be created if it does not already exist
153159
_, err = client.BfInsert(key_nocreate, 1000, 0.1, -1, true, false, []string{"a"})
154160
assert.NotNil(t, err)
@@ -181,6 +187,22 @@ func TestClient_TopkAdd(t *testing.T) {
181187
assert.Equal(t, 3, len(rets))
182188
}
183189

190+
func TestClient_TopkCount(t *testing.T) {
191+
client.FlushAll()
192+
key := "test_topk_count"
193+
ret, err := client.TopkReserve(key, 10, 2000, 7, 0.925)
194+
assert.Nil(t, err)
195+
assert.Equal(t, "OK", ret)
196+
rets, err := client.TopkAdd(key, []string{"test", "test1", "test3"})
197+
assert.Nil(t, err)
198+
assert.Equal(t, 3, len(rets))
199+
counts, err := client.TopkCount(key, []string{"test", "test1", "test3"})
200+
assert.Equal(t, 3, len(counts))
201+
for _, element := range counts {
202+
assert.LessOrEqual(t, int64(1), element)
203+
}
204+
}
205+
184206
func TestClient_TopkQuery(t *testing.T) {
185207
client.FlushAll()
186208
key := "test_topk_query"
@@ -294,11 +316,41 @@ func TestClient_CmsMerge(t *testing.T) {
294316
ret, err = client.CmsInitByDim("C", 1000, 5)
295317
assert.Nil(t, err)
296318
assert.Equal(t, "OK", ret)
319+
ret, err = client.CmsInitByDim("D", 1000, 5)
320+
assert.Nil(t, err)
321+
assert.Equal(t, "OK", ret)
322+
ret, err = client.CmsInitByDim("E", 1000, 5)
323+
assert.Nil(t, err)
324+
assert.Equal(t, "OK", ret)
325+
297326
client.CmsIncrBy("A", map[string]int64{"foo": 5, "bar": 3, "baz": 9})
298327
client.CmsIncrBy("B", map[string]int64{"foo": 2, "bar": 3, "baz": 1})
299-
client.CmsMerge("C", []string{"A", "B"}, nil)
328+
329+
// Negative test ( key not exist )
330+
ret, err = client.CmsMerge("dont_exist", []string{"A", "B"}, nil)
331+
assert.NotNil(t, err)
332+
assert.Equal(t, "CMS: key does not exist", err.Error())
333+
334+
// Positive tests
335+
ret, err = client.CmsMerge("C", []string{"A", "B"}, nil)
336+
assert.Nil(t, err)
337+
assert.Equal(t, "OK", ret)
300338
results, err := client.CmsQuery("C", []string{"foo", "bar", "baz"})
301339
assert.Equal(t, []int64{7, 6, 10}, results)
340+
341+
// Test for WEIGHTS ( default weight )
342+
ret, err = client.CmsMerge("D", []string{"A", "B"}, []int64{1, 1, 1})
343+
assert.Nil(t, err)
344+
assert.Equal(t, "OK", ret)
345+
results, err = client.CmsQuery("D", []string{"foo", "bar", "baz"})
346+
assert.Equal(t, []int64{7, 6, 10}, results)
347+
348+
// Test for WEIGHTS ( default weight )
349+
ret, err = client.CmsMerge("E", []string{"A", "B"}, []int64{1, 5})
350+
assert.Nil(t, err)
351+
assert.Equal(t, "OK", ret)
352+
results, err = client.CmsQuery("E", []string{"foo", "bar", "baz"})
353+
assert.Equal(t, []int64{5 + 2*5, 3 + 3*5, 9 + 1*5}, results)
302354
}
303355

304356
func TestClient_CmsInfo(t *testing.T) {
@@ -317,9 +369,21 @@ func TestClient_CmsInfo(t *testing.T) {
317369
func TestClient_CfReserve(t *testing.T) {
318370
client.FlushAll()
319371
key := "test_cf_reserve"
372+
key_max_iterations := "test_cf_reserve_maxiterations"
373+
key_expansion := "test_cf_reserve_expansion"
320374
ret, err := client.CfReserve(key, 1000, -1, -1, -1)
321375
assert.Nil(t, err)
322376
assert.Equal(t, "OK", ret)
377+
378+
// Test for MAXITERATIONS property
379+
ret, err = client.CfReserve(key_max_iterations, 1000, -1, 20, -1)
380+
assert.Nil(t, err)
381+
assert.Equal(t, "OK", ret)
382+
383+
// Test for EXPANSION property
384+
ret, err = client.CfReserve(key_expansion, 1000, -1, -1, 2)
385+
assert.Nil(t, err)
386+
assert.Equal(t, "OK", ret)
323387
}
324388

325389
func TestClient_CfAdd(t *testing.T) {
@@ -454,4 +518,14 @@ func TestClient_BfScanDump(t *testing.T) {
454518
}
455519
exists, err := client.Exists(key, "1")
456520
assert.True(t, exists)
521+
522+
// Negative testing
523+
notBfKey := "string_key"
524+
conn := client.Pool.Get()
525+
defer conn.Close()
526+
_, err = conn.Do("SET", redis.Args{notBfKey, "value"}...)
527+
assert.Nil(t, err)
528+
_, _, err = client.BfScanDump(notBfKey, 0)
529+
assert.Equal(t, err.Error(), "WRONGTYPE Operation against a key holding the wrong kind of value")
530+
457531
}

0 commit comments

Comments
 (0)