diff --git a/java/client/src/main/java/glide/api/BaseClient.java b/java/client/src/main/java/glide/api/BaseClient.java index 188576579b..1b92b5c9b1 100644 --- a/java/client/src/main/java/glide/api/BaseClient.java +++ b/java/client/src/main/java/glide/api/BaseClient.java @@ -1153,6 +1153,14 @@ public CompletableFuture smismember(@NonNull String key, @NonNull Str SMIsMember, arguments, response -> castArray(handleArrayResponse(response), Boolean.class)); } + @Override + public CompletableFuture smismember( + @NonNull GlideString key, @NonNull GlideString[] members) { + GlideString[] arguments = ArrayUtils.addFirst(members, key); + return commandManager.submitNewCommand( + SMIsMember, arguments, response -> castArray(handleArrayResponse(response), Boolean.class)); + } + @Override public CompletableFuture sdiffstore(@NonNull String destination, @NonNull String[] keys) { String[] arguments = ArrayUtils.addFirst(keys, destination); diff --git a/java/client/src/main/java/glide/api/commands/SetBaseCommands.java b/java/client/src/main/java/glide/api/commands/SetBaseCommands.java index a5fa16d05c..364bab4ff6 100644 --- a/java/client/src/main/java/glide/api/commands/SetBaseCommands.java +++ b/java/client/src/main/java/glide/api/commands/SetBaseCommands.java @@ -162,6 +162,22 @@ public interface SetBaseCommands { */ CompletableFuture smismember(String key, String[] members); + /** + * Checks whether each member is contained in the members of the set stored at key. + * + * @see redis.io for details. + * @param key The key of the set to check. + * @param members A list of members to check for existence in the set. + * @return An array of Boolean values, each indicating if the respective + * member exists in the set. + * @example + *
{@code
+     * Boolean[] areMembers = client.smismembmer(gs("my_set"), new GlideString[] { gs("a"), gs("b"), gs("c") }).get();
+     * assert areMembers[0] && areMembers[1] && !areMembers[2]; // Only first two elements are present in "my_set"
+     * }
+ */ + CompletableFuture smismember(GlideString key, GlideString[] members); + /** * Moves member from the set at source to the set at destination * , removing it from the source set. Creates a new destination set if needed. The diff --git a/java/client/src/test/java/glide/api/RedisClientTest.java b/java/client/src/test/java/glide/api/RedisClientTest.java index ea21fde707..5569ff7232 100644 --- a/java/client/src/test/java/glide/api/RedisClientTest.java +++ b/java/client/src/test/java/glide/api/RedisClientTest.java @@ -3042,6 +3042,31 @@ public void smismember_returns_success() { assertEquals(value, payload); } + @SneakyThrows + @Test + public void smismember_binary_returns_success() { + // setup + GlideString key = gs("testKey"); + GlideString[] members = {gs("1"), gs("2")}; + GlideString[] arguments = {gs("testKey"), gs("1"), gs("2")}; + Boolean[] value = {true, false}; + + CompletableFuture testResponse = new CompletableFuture<>(); + testResponse.complete(value); + + // match on protobuf request + when(commandManager.submitNewCommand(eq(SMIsMember), eq(arguments), any())) + .thenReturn(testResponse); + + // exercise + CompletableFuture response = service.smismember(key, members); + Boolean[] payload = response.get(); + + // verify + assertEquals(testResponse, response); + assertEquals(value, payload); + } + @SneakyThrows @Test public void sdiffstore_returns_success() { diff --git a/java/integTest/src/test/java/glide/SharedCommandTests.java b/java/integTest/src/test/java/glide/SharedCommandTests.java index 4a3ce815a2..a65965a967 100644 --- a/java/integTest/src/test/java/glide/SharedCommandTests.java +++ b/java/integTest/src/test/java/glide/SharedCommandTests.java @@ -1775,6 +1775,32 @@ public void smismember(BaseClient client) { assertInstanceOf(RequestException.class, executionException.getCause()); } + @SneakyThrows + @ParameterizedTest(autoCloseArguments = false) + @MethodSource("getClients") + public void smismember_binary(BaseClient client) { + GlideString key1 = gs(UUID.randomUUID().toString()); + GlideString key2 = gs(UUID.randomUUID().toString()); + + assertEquals(2, client.sadd(key1, new GlideString[] {gs("one"), gs("two")}).get()); + assertArrayEquals( + new Boolean[] {true, false}, + client.smismember(key1, new GlideString[] {gs("one"), gs("three")}).get()); + + // empty set + assertArrayEquals( + new Boolean[] {false, false}, + client.smismember(key2, new GlideString[] {gs("one"), gs("three")}).get()); + + // Key exists, but it is not a set + assertEquals(OK, client.set(key2, gs("value")).get()); + ExecutionException executionException = + assertThrows( + ExecutionException.class, + () -> client.smismember(key2, new GlideString[] {gs("_")}).get()); + assertInstanceOf(RequestException.class, executionException.getCause()); + } + @SneakyThrows @ParameterizedTest(autoCloseArguments = false) @MethodSource("getClients")