From cf160e733d28967d729651738dabc3a768bd815c Mon Sep 17 00:00:00 2001 From: annemayor Date: Sun, 26 May 2024 23:19:05 +0900 Subject: [PATCH] Add multiple reactive keys exist checker --- .../redis/connection/ReactiveKeyCommands.java | 14 ++++++++++ ...ceReactiveKeyCommandsIntegrationTests.java | 28 +++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/connection/ReactiveKeyCommands.java b/src/main/java/org/springframework/data/redis/connection/ReactiveKeyCommands.java index bd3f4d73dd..6a0d467ec2 100644 --- a/src/main/java/org/springframework/data/redis/connection/ReactiveKeyCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/ReactiveKeyCommands.java @@ -175,6 +175,20 @@ default Mono exists(ByteBuffer key) { return exists(Mono.just(new KeyCommand(key))).next().map(BooleanResponse::getOutput); } + /** + * Determine if given all {@literal keys} exist. + * + * @param keys must not be {@literal null} or {@literal empty}. + * @return {@link Mono} emitting {@literal true} if all keys exist. + * @see Redis Documentation: EXISTS + */ + default Mono exists(List keys) { + + Assert.notNull(keys, "Keys must not be null"); + Assert.notEmpty(keys, "Keys must not be empty"); + + return exists(Flux.fromIterable(keys).map(KeyCommand::new)).all(BooleanResponse::getOutput); + } /** * Determine if given {@literal key} exists. diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveKeyCommandsIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveKeyCommandsIntegrationTests.java index 457c009a60..4622e8b7bd 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveKeyCommandsIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveKeyCommandsIntegrationTests.java @@ -66,6 +66,28 @@ void existsShouldReturnFalseForNonExistingKeys() { connection.keyCommands().exists(KEY_1_BBUFFER).as(StepVerifier::create).expectNext(false).verifyComplete(); } + @ParameterizedRedisTest + void existsShouldReturnTrueWhenKeysExist() { + + nativeCommands.set(KEY_1, VALUE_1); + nativeCommands.set(KEY_2, VALUE_2); + + connection.keyCommands().exists(Arrays.asList(KEY_1_BBUFFER, KEY_2_BBUFFER)).as(StepVerifier::create) + .expectNext(true) + .verifyComplete(); + } + + @ParameterizedRedisTest + void existsShouldReturnFalseWhenKeysDoNotExist() { + + nativeCommands.set(KEY_1, VALUE_1); + + connection.keyCommands().exists(Arrays.asList(KEY_1_BBUFFER, KEY_2_BBUFFER)).as(StepVerifier::create) + .expectNext(false) // + .verifyComplete(); + } + + @ParameterizedRedisTest // DATAREDIS-525 void typeShouldReturnTypeCorrectly() { @@ -164,7 +186,7 @@ void renameShouldAlterKeyNameCorrectly() { connection.keyCommands().rename(KEY_1_BBUFFER, KEY_2_BBUFFER).as(StepVerifier::create).expectNext(true) .verifyComplete(); assertThat(nativeCommands.exists(KEY_2)).isEqualTo(1L); - assertThat(nativeCommands.exists(KEY_1)).isEqualTo(0L); + assertThat(nativeCommands.exists(KEY_1)).isZero(); } @ParameterizedRedisTest // DATAREDIS-525 @@ -183,7 +205,7 @@ void renameNXShouldAlterKeyNameCorrectly() { .verifyComplete(); assertThat(nativeCommands.exists(KEY_2)).isEqualTo(1L); - assertThat(nativeCommands.exists(KEY_1)).isEqualTo(0L); + assertThat(nativeCommands.exists(KEY_1)).isZero(); } @ParameterizedRedisTest // DATAREDIS-525 @@ -395,7 +417,7 @@ void shouldMoveToDatabase() { .expectNext(true) // .expectComplete() // .verify(); - assertThat(nativeCommands.exists(KEY_1)).isEqualTo(0L); + assertThat(nativeCommands.exists(KEY_1)).isZero(); } @ParameterizedRedisTest // DATAREDIS-694