diff --git a/src/main/java/io/lettuce/core/RedisJsonCommandBuilder.java b/src/main/java/io/lettuce/core/RedisJsonCommandBuilder.java index bd713854cb..42e8e40cfd 100644 --- a/src/main/java/io/lettuce/core/RedisJsonCommandBuilder.java +++ b/src/main/java/io/lettuce/core/RedisJsonCommandBuilder.java @@ -106,13 +106,14 @@ Command> jsonArrpop(K key, JsonPath jsonPath, int index) { CommandArgs args = new CommandArgs<>(codec).addKey(key); - if (jsonPath != null && !jsonPath.isRootPath()) { - // OPTIONAL as per API - args.add(jsonPath.toString()); - + if (jsonPath != null) { if (index != -1) { // OPTIONAL as per API + args.add(jsonPath.toString()); args.add(index); + } else if (!jsonPath.isRootPath()) { + // OPTIONAL as per API + args.add(jsonPath.toString()); } } diff --git a/src/test/java/io/lettuce/core/RedisJsonCommandBuilderUnitTests.java b/src/test/java/io/lettuce/core/RedisJsonCommandBuilderUnitTests.java index fbb2ae3fbb..28df5f01a9 100644 --- a/src/test/java/io/lettuce/core/RedisJsonCommandBuilderUnitTests.java +++ b/src/test/java/io/lettuce/core/RedisJsonCommandBuilderUnitTests.java @@ -157,7 +157,7 @@ void shouldCorrectlyConstructJsonArrpopNoIndex() { } @Test - void shouldCorrectlyConstructJsonArrpopRootPath() { + void shouldCorrectlyConstructJsonArrpopRootPathNoIndex() { Command> command = builder.jsonArrpop(MY_KEY, JsonPath.ROOT_PATH, -1); ByteBuf buf = Unpooled.directBuffer(); command.encode(buf); @@ -166,6 +166,16 @@ void shouldCorrectlyConstructJsonArrpopRootPath() { .isEqualTo("*2\r\n" + "$11\r\n" + "JSON.ARRPOP\r\n" + "$15\r\n" + "bikes:inventory\r\n"); } + @Test + void shouldCorrectlyConstructJsonArrpopRootPath() { + Command> command = builder.jsonArrpop(MY_KEY, JsonPath.ROOT_PATH, 1); + ByteBuf buf = Unpooled.directBuffer(); + command.encode(buf); + + assertThat(buf.toString(StandardCharsets.UTF_8)).isEqualTo("*4\r\n" + "$11\r\n" + "JSON.ARRPOP\r\n" + "$15\r\n" + + "bikes:inventory\r\n" + "$1\r\n" + "$\r\n" + "$1\r\n" + "1\r\n"); + } + @Test void shouldCorrectlyConstructJsonArrtrim() { JsonRangeArgs range = JsonRangeArgs.Builder.start(0).stop(1); diff --git a/src/test/java/io/lettuce/core/json/RedisJsonIntegrationTests.java b/src/test/java/io/lettuce/core/json/RedisJsonIntegrationTests.java index 116b127712..225dd749f7 100644 --- a/src/test/java/io/lettuce/core/json/RedisJsonIntegrationTests.java +++ b/src/test/java/io/lettuce/core/json/RedisJsonIntegrationTests.java @@ -163,8 +163,16 @@ public void jsonArrpopEmptyArray() { redis.jsonSet("myKey", JsonPath.ROOT_PATH, value); List result = redis.jsonArrpop("myKey"); assertThat(result.toString()).isEqualTo("[\"one\"]"); - result = redis.jsonArrpop("myKey", JsonPath.ROOT_PATH, 0); - assertThat(result.get(0).isNull()).isTrue(); + assertThat(redis.jsonGet("myKey").get(0).toString()).isEqualTo("[]"); + } + + @Test + public void jsonArrpopWithRootPathAndIndex() { + JsonValue value = redis.getJsonParser().createJsonValue("[\"one\",\"two\",\"three\"]"); + redis.jsonSet("myKey", JsonPath.ROOT_PATH, value); + List result = redis.jsonArrpop("myKey", JsonPath.ROOT_PATH, 1); + assertThat(result.toString()).isEqualTo("[\"two\"]"); + assertThat(redis.jsonGet("myKey").get(0).toString()).isEqualTo("[\"one\",\"three\"]"); } @ParameterizedTest(name = "With {0} as path")