Skip to content

Commit 9483063

Browse files
authored
Support TOPK.LIST with WITHCOUNT option (#3495)
1 parent 2cd2601 commit 9483063

File tree

9 files changed

+90
-7
lines changed

9 files changed

+90
-7
lines changed

src/main/java/redis/clients/jedis/BuilderFactory.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,37 @@ public String toString() {
415415
}
416416
};
417417

418+
public static final Builder<Map<String, Long>> STRING_LONG_MAP = new Builder<Map<String, Long>>() {
419+
@Override
420+
@SuppressWarnings("unchecked")
421+
public Map<String, Long> build(Object data) {
422+
final List<Object> list = (List<Object>) data;
423+
if (list.isEmpty()) return Collections.emptyMap();
424+
425+
if (list.get(0) instanceof KeyValue) {
426+
final Map<String, Long> map = new LinkedHashMap<>(list.size(), 1f);
427+
final Iterator iterator = list.iterator();
428+
while (iterator.hasNext()) {
429+
KeyValue kv = (KeyValue) iterator.next();
430+
map.put(STRING.build(kv.getKey()), LONG.build(kv.getValue()));
431+
}
432+
return map;
433+
} else {
434+
final Map<String, Long> map = new LinkedHashMap<>(list.size() / 2, 1f);
435+
final Iterator iterator = list.iterator();
436+
while (iterator.hasNext()) {
437+
map.put(STRING.build(iterator.next()), LONG.build(iterator.next()));
438+
}
439+
return map;
440+
}
441+
}
442+
443+
@Override
444+
public String toString() {
445+
return "Map<String, Long>";
446+
}
447+
};
448+
418449
public static final Builder<KeyValue<String, String>> KEYED_ELEMENT = new Builder<KeyValue<String, String>>() {
419450
@Override
420451
@SuppressWarnings("unchecked")

src/main/java/redis/clients/jedis/CommandObjects.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4056,6 +4056,11 @@ public final CommandObject<List<String>> topkList(String key) {
40564056
return new CommandObject<>(commandArguments(TopKCommand.LIST).key(key), BuilderFactory.STRING_LIST);
40574057
}
40584058

4059+
public final CommandObject<Map<String, Long>> topkListWithCount(String key) {
4060+
return new CommandObject<>(commandArguments(TopKCommand.LIST).key(key)
4061+
.add(RedisBloomKeyword.WITHCOUNT), BuilderFactory.STRING_LONG_MAP);
4062+
}
4063+
40594064
public final CommandObject<Map<String, Object>> topkInfo(String key) {
40604065
return new CommandObject<>(commandArguments(TopKCommand.INFO).key(key), BuilderFactory.ENCODED_OBJECT_MAP);
40614066
}

src/main/java/redis/clients/jedis/PipelineBase.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4059,6 +4059,11 @@ public Response<List<String>> topkList(String key) {
40594059
return appendCommand(commandObjects.topkList(key));
40604060
}
40614061

4062+
@Override
4063+
public Response<Map<String, Long>> topkListWithCount(String key) {
4064+
return appendCommand(commandObjects.topkListWithCount(key));
4065+
}
4066+
40624067
@Override
40634068
public Response<Map<String, Object>> topkInfo(String key) {
40644069
return appendCommand(commandObjects.topkInfo(key));

src/main/java/redis/clients/jedis/TransactionBase.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4227,6 +4227,11 @@ public Response<List<String>> topkList(String key) {
42274227
return appendCommand(commandObjects.topkList(key));
42284228
}
42294229

4230+
@Override
4231+
public Response<Map<String, Long>> topkListWithCount(String key) {
4232+
return appendCommand(commandObjects.topkListWithCount(key));
4233+
}
4234+
42304235
@Override
42314236
public Response<Map<String, Object>> topkInfo(String key) {
42324237
return appendCommand(commandObjects.topkInfo(key));

src/main/java/redis/clients/jedis/UnifiedJedis.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4583,6 +4583,11 @@ public List<String> topkList(String key) {
45834583
return executeCommand(commandObjects.topkList(key));
45844584
}
45854585

4586+
@Override
4587+
public Map<String, Long> topkListWithCount(String key) {
4588+
return executeCommand(commandObjects.topkListWithCount(key));
4589+
}
4590+
45864591
@Override
45874592
public Map<String, Object> topkInfo(String key) {
45884593
return executeCommand(commandObjects.topkInfo(key));

src/main/java/redis/clients/jedis/bloom/RedisBloomProtocol.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public byte[] getRaw() {
120120
public enum RedisBloomKeyword implements Rawable {
121121

122122
CAPACITY, ERROR, NOCREATE, EXPANSION, NONSCALING, BUCKETSIZE, MAXITERATIONS, ITEMS, WEIGHTS,
123-
COMPRESSION, OVERRIDE;
123+
COMPRESSION, OVERRIDE, WITHCOUNT;
124124

125125
private final byte[] raw;
126126

src/main/java/redis/clients/jedis/bloom/commands/TopKFilterCommands.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package redis.clients.jedis.bloom.commands;
22

3+
import java.util.Collections;
34
import java.util.List;
45
import java.util.Map;
56

@@ -35,6 +36,18 @@ public interface TopKFilterCommands {
3536
*/
3637
List<String> topkAdd(String key, String... items);
3738

39+
/**
40+
* {@code TOPK.INCRBY {key} {item} {increment}}
41+
*
42+
* @param key
43+
* @param item
44+
* @param increment
45+
* @return item dropped from list
46+
*/
47+
default String topkIncrBy(String key, String item, long increment) {
48+
return topkIncrBy(key, Collections.singletonMap(item, increment)).get(0);
49+
}
50+
3851
/**
3952
* {@code TOPK.INCRBY {key} {item} {increment} [{item} {increment} ...]}
4053
*
@@ -61,6 +74,14 @@ public interface TopKFilterCommands {
6174
*/
6275
List<String> topkList(String key);
6376

77+
/**
78+
* {@code TOPK.LIST {key} WITHCOUNT}
79+
*
80+
* @param key
81+
* @return k (or less) items in Top K list
82+
*/
83+
Map<String, Long> topkListWithCount(String key);
84+
6485
/**
6586
* {@code TOPK.INFO {key}}
6687
*

src/main/java/redis/clients/jedis/bloom/commands/TopKFilterPipelineCommands.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,7 @@ public interface TopKFilterPipelineCommands {
1818

1919
Response<List<String>> topkList(String key);
2020

21+
Response<Map<String, Long>> topkListWithCount(String key);
22+
2123
Response<Map<String, Object>> topkInfo(String key);
2224
}

src/test/java/redis/clients/jedis/modules/bloom/TopKTest.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package redis.clients.jedis.modules.bloom;
22

33
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertTrue;
45

56
import java.util.Arrays;
67
import java.util.Collections;
7-
import java.util.TreeSet;
8+
import java.util.Map;
89
import org.junit.BeforeClass;
910
import org.junit.Test;
1011

@@ -30,12 +31,20 @@ public void createTopKFilter() {
3031

3132
assertEquals(Arrays.asList(true, false, true), client.topkQuery("aaa", "bb", "gg", "cc"));
3233

33-
assertEquals(new TreeSet<>(Arrays.asList("bb", "cc")), new TreeSet<>(client.topkList("aaa")));
34+
assertEquals(Arrays.asList("bb", "cc"), client.topkList("aaa"));
3435

35-
// assertEquals(null, client.topkIncrBy("aaa", "ff", 10));
36-
assertEquals(Collections.<String>singletonList(null),
37-
client.topkIncrBy("aaa", Collections.singletonMap("ff", 10L)));
36+
Map<String, Long> listWithCount = client.topkListWithCount("aaa");
37+
assertEquals(2, listWithCount.size());
38+
listWithCount.forEach((item, count) -> {
39+
assertTrue(Arrays.asList("bb", "cc").contains(item));
40+
assertEquals(Long.valueOf(1), count);
41+
});
42+
43+
assertEquals(null, client.topkIncrBy("aaa", "ff", 5));
44+
assertEquals(Arrays.asList("ff", "bb", "cc"), client.topkList("aaa"));
3845

39-
assertEquals(new TreeSet<>(Arrays.asList("bb", "cc", "ff")), new TreeSet<>(client.topkList("aaa")));
46+
assertEquals(Collections.<String>singletonList(null),
47+
client.topkIncrBy("aaa", Collections.singletonMap("ff", 8L)));
48+
assertEquals(Long.valueOf(13), client.topkListWithCount("aaa").get("ff"));
4049
}
4150
}

0 commit comments

Comments
 (0)