diff --git a/src/main/java/redis/clients/jedis/BuilderFactory.java b/src/main/java/redis/clients/jedis/BuilderFactory.java index 6e39a668fa..8c480f71d4 100644 --- a/src/main/java/redis/clients/jedis/BuilderFactory.java +++ b/src/main/java/redis/clients/jedis/BuilderFactory.java @@ -312,59 +312,34 @@ public String build(Object data) { public String toString() { return "String"; } - }; public static final Builder> STRING_LIST = new Builder>() { @Override @SuppressWarnings("unchecked") public List build(Object data) { - if (null == data) { - return null; - } - List l = (List) data; - final ArrayList result = new ArrayList<>(l.size()); - for (final byte[] barray : l) { - if (barray == null) { - result.add(null); - } else { - result.add(SafeEncoder.encode(barray)); - } - } - return result; + if (null == data) return null; + return ((List) data).stream().map(STRING::build).collect(Collectors.toList()); } @Override public String toString() { return "List"; } - }; public static final Builder> STRING_SET = new Builder>() { @Override @SuppressWarnings("unchecked") public Set build(Object data) { - if (null == data) { - return null; - } - List l = (List) data; - final Set result = new HashSet<>(l.size(), 1); - for (final byte[] barray : l) { - if (barray == null) { - result.add(null); - } else { - result.add(SafeEncoder.encode(barray)); - } - } - return result; + if (null == data) return null; + return ((List) data).stream().map(STRING::build).collect(Collectors.toSet()); } @Override public String toString() { return "Set"; } - }; public static final Builder> STRING_MAP = new Builder>() { @@ -385,7 +360,20 @@ public Map build(Object data) { public String toString() { return "Map"; } + }; + public static final Builder>> STRING_LIST_LIST = new Builder>>() { + @Override + @SuppressWarnings("unchecked") + public List> build(Object data) { + if (null == data) return null; + return ((List) data).stream().map(STRING_LIST::build).collect(Collectors.toList()); + } + + @Override + public String toString() { + return "List>"; + } }; public static final Builder KEYED_LIST_ELEMENT = new Builder() { diff --git a/src/main/java/redis/clients/jedis/CommandObjects.java b/src/main/java/redis/clients/jedis/CommandObjects.java index 61e8a3b8aa..9137092559 100644 --- a/src/main/java/redis/clients/jedis/CommandObjects.java +++ b/src/main/java/redis/clients/jedis/CommandObjects.java @@ -3462,17 +3462,41 @@ public final CommandObject jsonArrTrim(String key, Path path, int start, i return new CommandObject<>(commandArguments(JsonCommand.ARRTRIM).key(key).add(path).add(start).add(stop), BuilderFactory.LONG); } - public final CommandObject jsonDebugMemory(String key) { - return new CommandObject<>(commandArguments(JsonCommand.DEBUG).add("MEMORY").key(key), BuilderFactory.LONG); + public final CommandObject jsonObjLen(String key) { + return new CommandObject<>(commandArguments(JsonCommand.OBJLEN).key(key), BuilderFactory.LONG); } - public final CommandObject> jsonDebugMemory(String key, Path2 path) { - return new CommandObject<>(commandArguments(JsonCommand.DEBUG).add("MEMORY").key(key).add(path), BuilderFactory.LONG_LIST); + public final CommandObject jsonObjLen(String key, Path path) { + return new CommandObject<>(commandArguments(JsonCommand.OBJLEN).key(key).add(path), BuilderFactory.LONG); + } + + public final CommandObject> jsonObjLen(String key, Path2 path) { + return new CommandObject<>(commandArguments(JsonCommand.OBJLEN).key(key).add(path), BuilderFactory.LONG_LIST); + } + + public final CommandObject> jsonObjKeys(String key) { + return new CommandObject<>(commandArguments(JsonCommand.OBJKEYS).key(key), BuilderFactory.STRING_LIST); + } + + public final CommandObject> jsonObjKeys(String key, Path path) { + return new CommandObject<>(commandArguments(JsonCommand.OBJKEYS).key(key).add(path), BuilderFactory.STRING_LIST); + } + + public final CommandObject>> jsonObjKeys(String key, Path2 path) { + return new CommandObject<>(commandArguments(JsonCommand.OBJKEYS).key(key).add(path), BuilderFactory.STRING_LIST_LIST); + } + + public final CommandObject jsonDebugMemory(String key) { + return new CommandObject<>(commandArguments(JsonCommand.DEBUG).add("MEMORY").key(key), BuilderFactory.LONG); } public final CommandObject jsonDebugMemory(String key, Path path) { return new CommandObject<>(commandArguments(JsonCommand.DEBUG).add("MEMORY").key(key).add(path), BuilderFactory.LONG); } + + public final CommandObject> jsonDebugMemory(String key, Path2 path) { + return new CommandObject<>(commandArguments(JsonCommand.DEBUG).add("MEMORY").key(key).add(path), BuilderFactory.LONG_LIST); + } // RedisJSON commands // RedisTimeSeries commands diff --git a/src/main/java/redis/clients/jedis/UnifiedJedis.java b/src/main/java/redis/clients/jedis/UnifiedJedis.java index edcfc541ca..65262c1df9 100644 --- a/src/main/java/redis/clients/jedis/UnifiedJedis.java +++ b/src/main/java/redis/clients/jedis/UnifiedJedis.java @@ -3879,18 +3879,48 @@ public Long jsonArrTrim(String key, Path path, int start, int stop) { return executeCommand(commandObjects.jsonArrTrim(key, path, start, stop)); } + @Override + public Long jsonObjLen(String key) { + return executeCommand(commandObjects.jsonObjLen(key)); + } + + @Override + public Long jsonObjLen(String key, Path path) { + return executeCommand(commandObjects.jsonObjLen(key, path)); + } + + @Override + public List jsonObjLen(String key, Path2 path) { + return executeCommand(commandObjects.jsonObjLen(key, path)); + } + + @Override + public List jsonObjKeys(String key) { + return executeCommand(commandObjects.jsonObjKeys(key)); + } + + @Override + public List jsonObjKeys(String key, Path path) { + return executeCommand(commandObjects.jsonObjKeys(key, path)); + } + + @Override + public List> jsonObjKeys(String key, Path2 path) { + return executeCommand(commandObjects.jsonObjKeys(key, path)); + } + @Override public long jsonDebugMemory(String key) { return executeCommand(commandObjects.jsonDebugMemory(key)); } @Override - public List jsonDebugMemory(String key, Path2 path) { + public long jsonDebugMemory(String key, Path path) { return executeCommand(commandObjects.jsonDebugMemory(key, path)); } @Override - public long jsonDebugMemory(String key, Path path) { + public List jsonDebugMemory(String key, Path2 path) { return executeCommand(commandObjects.jsonDebugMemory(key, path)); } // RedisJSON commands diff --git a/src/main/java/redis/clients/jedis/json/JsonProtocol.java b/src/main/java/redis/clients/jedis/json/JsonProtocol.java index 0b7b434e76..25a0084ddd 100644 --- a/src/main/java/redis/clients/jedis/json/JsonProtocol.java +++ b/src/main/java/redis/clients/jedis/json/JsonProtocol.java @@ -22,6 +22,8 @@ public enum JsonCommand implements ProtocolCommand { ARRTRIM("JSON.ARRTRIM"), CLEAR("JSON.CLEAR"), TOGGLE("JSON.TOGGLE"), + OBJKEYS("JSON.OBJKEYS"), + OBJLEN("JSON.OBJLEN"), DEBUG("JSON.DEBUG"); private final byte[] raw; diff --git a/src/main/java/redis/clients/jedis/json/RedisJsonCommands.java b/src/main/java/redis/clients/jedis/json/RedisJsonCommands.java index 6889176129..ab39600a3d 100644 --- a/src/main/java/redis/clients/jedis/json/RedisJsonCommands.java +++ b/src/main/java/redis/clients/jedis/json/RedisJsonCommands.java @@ -149,9 +149,21 @@ default List jsonMGet(Class clazz, String... keys) { Long jsonArrTrim(String key, Path path, int start, int stop); - long jsonDebugMemory(String key); + Long jsonObjLen(String key); - List jsonDebugMemory(String key, Path2 path); + Long jsonObjLen(String key, Path path); + + List jsonObjLen(String key, Path2 path); + + List jsonObjKeys(String key); + + List jsonObjKeys(String key, Path path); + + List> jsonObjKeys(String key, Path2 path); + + long jsonDebugMemory(String key); long jsonDebugMemory(String key, Path path); + + List jsonDebugMemory(String key, Path2 path); } diff --git a/src/test/java/redis/clients/jedis/modules/json/RedisJsonV1Test.java b/src/test/java/redis/clients/jedis/modules/json/RedisJsonV1Test.java index 182b80f5a9..e6f974ccac 100644 --- a/src/test/java/redis/clients/jedis/modules/json/RedisJsonV1Test.java +++ b/src/test/java/redis/clients/jedis/modules/json/RedisJsonV1Test.java @@ -7,6 +7,7 @@ import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import java.util.Arrays; import java.util.Collections; import java.util.List; import org.junit.BeforeClass; @@ -424,6 +425,21 @@ public void numIncrBy() { assertEquals(5d, client.jsonNumIncrBy("doc", Path.of(".a"), 2), 0d); } + @Test + public void obj() { + assertNull(client.jsonObjLen("doc")); + assertNull(client.jsonObjKeys("doc")); + assertNull(client.jsonObjLen("doc", ROOT_PATH)); + assertNull(client.jsonObjKeys("doc", ROOT_PATH)); + + String json = "{\"a\":[3], \"nested\": {\"a\": {\"b\":2, \"c\": 1}}}"; + client.jsonSetWithPlainString("doc", ROOT_PATH, json); + assertEquals(Long.valueOf(2), client.jsonObjLen("doc")); + assertEquals(Arrays.asList("a", "nested"), client.jsonObjKeys("doc")); + assertEquals(Long.valueOf(2), client.jsonObjLen("doc", Path.of(".nested.a"))); + assertEquals(Arrays.asList("b", "c"), client.jsonObjKeys("doc", Path.of(".nested.a"))); + } + @Test public void debugMemory() { assertEquals(0L, client.jsonDebugMemory("json")); diff --git a/src/test/java/redis/clients/jedis/modules/json/RedisJsonV2Test.java b/src/test/java/redis/clients/jedis/modules/json/RedisJsonV2Test.java index 9062d9fcd5..9472a6cd05 100644 --- a/src/test/java/redis/clients/jedis/modules/json/RedisJsonV2Test.java +++ b/src/test/java/redis/clients/jedis/modules/json/RedisJsonV2Test.java @@ -7,6 +7,7 @@ import static redis.clients.jedis.modules.json.JsonObjects.*; import com.google.gson.Gson; +import java.util.Arrays; import java.util.List; import org.json.JSONArray; import org.json.JSONObject; @@ -386,9 +387,18 @@ public void numIncrBy() { assertJsonArrayEquals(jsonArray(), client.jsonNumIncrBy("doc", Path2.of("..c"), 0d)); } + @Test + public void obj() { + String json = "{\"a\":[3], \"nested\": {\"a\": {\"b\":2, \"c\": 1}}}"; + client.jsonSet("doc", ROOT_PATH, json); + assertEquals(Arrays.asList(2L), client.jsonObjLen("doc", ROOT_PATH)); + assertEquals(Arrays.asList(Arrays.asList("a", "nested")), client.jsonObjKeys("doc", ROOT_PATH)); + assertEquals(Arrays.asList(null, 2L), client.jsonObjLen("doc", Path2.of("..a"))); + assertEquals(Arrays.asList(null, Arrays.asList("b", "c")), client.jsonObjKeys("doc", Path2.of("..a"))); + } + @Test public void debugMemory() { - assertEquals(0L, client.jsonDebugMemory("json")); assertEquals(emptyList(), client.jsonDebugMemory("json", ROOT_PATH)); client.jsonSet("json", new JSONObject("{ foo: 'bar', bar: { foo: 10 }}"));