Skip to content

Commit

Permalink
change more string commands to have CommandFunction support (#5184)
Browse files Browse the repository at this point in the history
* CommandFunction now supports getrange, setrange, bitcount, bitop, bitpos, getbit, setbit, incrbyfloat, mget, and strlen.

Added integration test coverage for untested string commands.
  • Loading branch information
dschneider-pivotal committed Jun 15, 2020
1 parent dd6a002 commit e5426f7
Show file tree
Hide file tree
Showing 30 changed files with 1,523 additions and 439 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@
package org.apache.geode.redis.sets;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
Expand Down Expand Up @@ -178,6 +180,47 @@ private int doABunchOfSAdds(String key, String[] strings,
return successes;
}

@Test
public void srandmember_withStringFails() {
jedis.set("string", "value");
assertThatThrownBy(() -> jedis.srandmember("string")).hasMessageContaining("WRONGTYPE");
}

@Test
public void srandmember_withNonExistentKeyReturnsNull() {
assertThat(jedis.srandmember("non existent")).isNull();
}

@Test
public void srandmemberCount_withNonExistentKeyReturnsEmptyArray() {
assertThat(jedis.srandmember("non existent", 3)).isEmpty();
}

@Test
public void srandmember_returnsOneMember() {
jedis.sadd("key", "m1", "m2");
String result = jedis.srandmember("key");
assertThat(result).isIn("m1", "m2");
}

@Test
public void srandmemberCount_returnsTwoUniqueMembers() {
jedis.sadd("key", "m1", "m2", "m3");
List<String> results = jedis.srandmember("key", 2);
assertThat(results).hasSize(2);
assertThat(results).containsAnyOf("m1", "m2", "m3");
assertThat(results.get(0)).isNotEqualTo(results.get(1));
}

@Test
public void srandmemberCount_returnsTwoMembers() {
jedis.sadd("key", "m1", "m2", "m3");
List<String> results = jedis.srandmember("key", -3);
assertThat(results).hasSize(3);
assertThat(results).containsAnyOf("m1", "m2", "m3");
}


@Test
public void testSMembersSIsMember() {
int elements = 10;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,10 @@ Collection<ByteArrayWrapper> spop(

Collection<ByteArrayWrapper> srandmember(int count) {
int membersSize = members.size();
boolean duplicatesAllowed = count < 0;
if (duplicatesAllowed) {
count = -count;
}

if (membersSize <= count && count != 1) {
return new ArrayList<>(members);
Expand All @@ -138,14 +142,23 @@ Collection<ByteArrayWrapper> srandmember(int count) {
result.add(randEntry);
return result;
}
Set<ByteArrayWrapper> result = new HashSet<>();
// Note that rand.nextInt can return duplicates when "count" is high
// so we need to use a Set to collect the results.
while (result.size() < count) {
ByteArrayWrapper s = entries[rand.nextInt(entries.length)];
result.add(s);
if (duplicatesAllowed) {
ArrayList<ByteArrayWrapper> result = new ArrayList<>(count);
while (count > 0) {
result.add(entries[rand.nextInt(entries.length)]);
count--;
}
return result;
} else {
Set<ByteArrayWrapper> result = new HashSet<>();
// Note that rand.nextInt can return duplicates when "count" is high
// so we need to use a Set to collect the results.
while (result.size() < count) {
ByteArrayWrapper s = entries[rand.nextInt(entries.length)];
result.add(s);
}
return result;
}
return result;
}

public boolean sismember(ByteArrayWrapper member) {
Expand Down

0 comments on commit e5426f7

Please sign in to comment.