Skip to content

Commit

Permalink
support smismember with GlideString (valkey-io#1694)
Browse files Browse the repository at this point in the history
  • Loading branch information
alon-arenberg authored Jun 30, 2024
1 parent 40c3a55 commit 1fe3dc2
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 0 deletions.
8 changes: 8 additions & 0 deletions java/client/src/main/java/glide/api/BaseClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -1153,6 +1153,14 @@ public CompletableFuture<Boolean[]> smismember(@NonNull String key, @NonNull Str
SMIsMember, arguments, response -> castArray(handleArrayResponse(response), Boolean.class));
}

@Override
public CompletableFuture<Boolean[]> 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<Long> sdiffstore(@NonNull String destination, @NonNull String[] keys) {
String[] arguments = ArrayUtils.addFirst(keys, destination);
Expand Down
16 changes: 16 additions & 0 deletions java/client/src/main/java/glide/api/commands/SetBaseCommands.java
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,22 @@ public interface SetBaseCommands {
*/
CompletableFuture<Boolean[]> smismember(String key, String[] members);

/**
* Checks whether each member is contained in the members of the set stored at <code>key</code>.
*
* @see <a href="https://redis.io/commands/smismember/">redis.io</a> 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 <code>array</code> of <code>Boolean</code> values, each indicating if the respective
* member exists in the set.
* @example
* <pre>{@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"
* }</pre>
*/
CompletableFuture<Boolean[]> smismember(GlideString key, GlideString[] members);

/**
* Moves <code>member</code> from the set at <code>source</code> to the set at <code>destination
* </code>, removing it from the source set. Creates a new destination set if needed. The
Expand Down
25 changes: 25 additions & 0 deletions java/client/src/test/java/glide/api/RedisClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Boolean[]> testResponse = new CompletableFuture<>();
testResponse.complete(value);

// match on protobuf request
when(commandManager.<Boolean[]>submitNewCommand(eq(SMIsMember), eq(arguments), any()))
.thenReturn(testResponse);

// exercise
CompletableFuture<Boolean[]> response = service.smismember(key, members);
Boolean[] payload = response.get();

// verify
assertEquals(testResponse, response);
assertEquals(value, payload);
}

@SneakyThrows
@Test
public void sdiffstore_returns_success() {
Expand Down
26 changes: 26 additions & 0 deletions java/integTest/src/test/java/glide/SharedCommandTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down

0 comments on commit 1fe3dc2

Please sign in to comment.