Skip to content

Commit d679f01

Browse files
authored
Merge branch 'master' into migrate_to_clients_test_image
2 parents 2b3fb84 + 2fdf928 commit d679f01

File tree

4 files changed

+83
-30
lines changed

4 files changed

+83
-30
lines changed

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

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -975,30 +975,8 @@ public Map<String, CommandDocument> build(Object data) {
975975
}
976976
};
977977

978-
public static final Builder<Map<String, CommandInfo>> COMMAND_INFO_RESPONSE = new Builder<Map<String, CommandInfo>>() {
979-
@Override
980-
public Map<String, CommandInfo> build(Object data) {
981-
if (data == null) {
982-
return null;
983-
}
984-
985-
List<Object> rawList = (List<Object>) data;
986-
Map<String, CommandInfo> map = new HashMap<>(rawList.size());
987-
988-
for (Object rawCommandInfo : rawList) {
989-
if (rawCommandInfo == null) {
990-
continue;
991-
}
992-
993-
List<Object> commandInfo = (List<Object>) rawCommandInfo;
994-
String name = STRING.build(commandInfo.get(0));
995-
CommandInfo info = CommandInfo.COMMAND_INFO_BUILDER.build(commandInfo);
996-
map.put(name, info);
997-
}
998-
999-
return map;
1000-
}
1001-
};
978+
@Deprecated
979+
public static final Builder<Map<String, CommandInfo>> COMMAND_INFO_RESPONSE = CommandInfo.COMMAND_INFO_RESPONSE;
1002980

1003981
public static final Builder<Map<String, LatencyLatestInfo>> LATENCY_LATEST_RESPONSE = new Builder<Map<String, LatencyLatestInfo>>() {
1004982
@Override

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8250,7 +8250,7 @@ public List<KeyValue<String, List<String>>> commandGetKeysAndFlags(String... com
82508250
public Map<String, CommandInfo> commandInfo(String... commands) {
82518251
checkIsInMultiOrPipeline();
82528252
connection.sendCommand(COMMAND, joinParameters(Keyword.INFO.name(), commands));
8253-
return BuilderFactory.COMMAND_INFO_RESPONSE.build(connection.getOne());
8253+
return CommandInfo.COMMAND_INFO_RESPONSE.build(connection.getOne());
82548254
}
82558255

82568256
public List<String> commandList() {

src/main/java/redis/clients/jedis/resps/CommandInfo.java

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,40 @@
33
import redis.clients.jedis.Builder;
44

55
import java.util.Collections;
6+
import java.util.HashMap;
67
import java.util.List;
8+
import java.util.Map;
79

8-
import static redis.clients.jedis.BuilderFactory.STRING_LIST;
910
import static redis.clients.jedis.BuilderFactory.LONG;
11+
import static redis.clients.jedis.BuilderFactory.STRING;
12+
import static redis.clients.jedis.BuilderFactory.STRING_LIST;
1013

1114
public class CommandInfo {
15+
16+
private final String name;
1217
private final long arity;
1318
private final List<String> flags;
1419
private final long firstKey;
1520
private final long lastKey;
1621
private final long step;
1722
private final List<String> aclCategories;
1823
private final List<String> tips;
19-
private final List<String> subcommands;
24+
private final Map<String, CommandInfo> subcommands;
2025

26+
/**
27+
* THIS IGNORES 'subcommands' parameter.
28+
* @param subcommands WILL BE IGNORED
29+
* @deprecated
30+
*/
31+
@Deprecated
2132
public CommandInfo(long arity, List<String> flags, long firstKey, long lastKey, long step,
2233
List<String> aclCategories, List<String> tips, List<String> subcommands) {
34+
this((String) null, arity, flags, firstKey, lastKey, step, aclCategories, tips, (Map) null);
35+
}
36+
37+
private CommandInfo(String name, long arity, List<String> flags, long firstKey, long lastKey, long step,
38+
List<String> aclCategories, List<String> tips, Map<String, CommandInfo> subcommands) {
39+
this.name = name;
2340
this.arity = arity;
2441
this.flags = flags;
2542
this.firstKey = firstKey;
@@ -30,6 +47,13 @@ public CommandInfo(long arity, List<String> flags, long firstKey, long lastKey,
3047
this.subcommands = subcommands;
3148
}
3249

50+
/**
51+
* Command name
52+
*/
53+
public String getName() {
54+
return name;
55+
}
56+
3357
/**
3458
* Arity is the number of arguments a command expects. It follows a simple pattern:
3559
* A positive integer means a fixed number of arguments.
@@ -90,15 +114,23 @@ public List<String> getTips() {
90114
/**
91115
* All the command's subcommands, if any
92116
*/
93-
public List<String> getSubcommands() {
117+
public Map<String, CommandInfo> getSubcommands() {
94118
return subcommands;
95119
}
96120

97121
public static final Builder<CommandInfo> COMMAND_INFO_BUILDER = new Builder<CommandInfo>() {
98122
@Override
99123
public CommandInfo build(Object data) {
124+
if (data == null) {
125+
return null;
126+
}
127+
100128
List<Object> commandData = (List<Object>) data;
129+
if (commandData.isEmpty()) {
130+
return null;
131+
}
101132

133+
String name = STRING.build(commandData.get(0));
102134
long arity = LONG.build(commandData.get(1));
103135
List<String> flags = STRING_LIST.build(commandData.get(2));
104136
long firstKey = LONG.build(commandData.get(3));
@@ -110,9 +142,31 @@ public CommandInfo build(Object data) {
110142

111143
// (as of Redis 7.0)
112144
List<String> tips = commandData.size()>=8?STRING_LIST.build(commandData.get(7)):Collections.emptyList();
113-
List<String> subcommands = commandData.size()>=10?STRING_LIST.build(commandData.get(9)): Collections.emptyList();
145+
Map<String, CommandInfo> subcommands = commandData.size()>=10?COMMAND_INFO_RESPONSE.build(commandData.get(9)): Collections.emptyMap();
146+
147+
return new CommandInfo(name, arity, flags, firstKey, lastKey, step, aclCategories, tips, subcommands);
148+
}
149+
};
114150

115-
return new CommandInfo(arity, flags, firstKey, lastKey, step, aclCategories, tips, subcommands);
151+
public static final Builder<Map<String, CommandInfo>> COMMAND_INFO_RESPONSE = new Builder<Map<String, CommandInfo>>() {
152+
@Override
153+
public Map<String, CommandInfo> build(Object data) {
154+
if (data == null) {
155+
return null;
156+
}
157+
158+
List<Object> rawList = (List<Object>) data;
159+
Map<String, CommandInfo> map = new HashMap<>(rawList.size());
160+
161+
for (Object rawCommandInfo : rawList) {
162+
CommandInfo info = CommandInfo.COMMAND_INFO_BUILDER.build(rawCommandInfo);
163+
if (info != null) {
164+
map.put(info.getName(), info);
165+
}
166+
}
167+
168+
return map;
116169
}
117170
};
171+
118172
}

src/test/java/redis/clients/jedis/commands/jedis/ControlCommandsTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,27 @@ public void commandInfo() {
532532
assertEquals(0, setInfo.getSubcommands().size());
533533
}
534534

535+
@Test // GitHub Issue #4020
536+
public void commandInfoAcl() {
537+
Map<String, CommandInfo> infos = jedis.commandInfo("ACL");
538+
assertThat(infos, Matchers.aMapWithSize(1));
539+
540+
CommandInfo aclInfo = infos.get("acl");
541+
assertEquals(-2, aclInfo.getArity());
542+
assertEquals(0, aclInfo.getFlags().size());
543+
assertEquals(0, aclInfo.getFirstKey());
544+
assertEquals(0, aclInfo.getLastKey());
545+
assertEquals(0, aclInfo.getStep());
546+
assertEquals(1, aclInfo.getAclCategories().size());
547+
assertEquals(0, aclInfo.getTips().size());
548+
assertThat(aclInfo.getSubcommands().size(), Matchers.greaterThanOrEqualTo(13));
549+
aclInfo.getSubcommands().forEach((name, subcommand) -> {
550+
assertThat(name, Matchers.startsWith("acl|"));
551+
assertNotNull(subcommand);
552+
assertEquals(name, subcommand.getName());
553+
});
554+
}
555+
535556
@Test
536557
@Ignore( "Till https://github.com/redis/jedis/issues/4020 is resolved")
537558
public void commandInfoWithSubcommands() {

0 commit comments

Comments
 (0)