Add support for ZRANDMEMBER.

Closes: #2049
Original Pull Request: #2104
This commit is contained in:
Mark Paluch
2021-06-28 14:12:03 +02:00
committed by Christoph Strobl
parent 0b8fbae2c3
commit a523b821c5
23 changed files with 1182 additions and 11 deletions

View File

@@ -2026,6 +2026,39 @@ public abstract class AbstractConnectionIntegrationTests {
new DefaultStringTuple("James".getBytes(), "James", 12d))) }));
}
@Test // GH-2049
@EnabledOnCommand("ZRANDMEMBER")
void testZRandMember() {
actual.add(connection.zAdd("myset", 2, "Bob"));
actual.add(connection.zAdd("myset", 1, "James"));
actual.add(connection.zRandMember("myset"));
actual.add(connection.zRandMember("myset", 2));
List<Object> results = getResults();
assertThat(results.get(2)).isNotNull();
assertThat(new LinkedHashSet<>((Collection) results.get(3)))
.isEqualTo(new LinkedHashSet<>(Arrays.asList("Bob", "James")));
}
@Test // GH-2049
@EnabledOnCommand("ZRANDMEMBER")
void testZRandMemberWithScore() {
actual.add(connection.zAdd("myset", 2, "Bob"));
actual.add(connection.zAdd("myset", 1, "James"));
actual.add(connection.zRandMemberWithScore("myset"));
actual.add(connection.zRandMemberWithScores("myset", 2));
List<Object> results = getResults();
assertThat(results.get(2)).isNotNull();
assertThat(new LinkedHashSet<>((Collection) results.get(3)))
.isEqualTo(new LinkedHashSet<>(Arrays.asList(new DefaultStringTuple("Bob".getBytes(), "Bob", 2d),
new DefaultStringTuple("James".getBytes(), "James", 1d))));
}
@Test
void testZRangeWithScores() {

View File

@@ -637,6 +637,12 @@ public interface ClusterConnectionTests {
// GH-2007
void bzPopMaxShouldWorkCorrectly();
// GH-2049
void zRandMemberShouldReturnResultCorrectly();
// GH-2049
void zRandMemberWithScoreShouldReturnResultCorrectly();
// DATAREDIS-315
void zRangeByLexShouldReturnResultCorrectly();

View File

@@ -2139,6 +2139,29 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests {
.isEqualTo(new DefaultTuple(VALUE_3_BYTES, 30D));
}
@Test // GH-2049
@EnabledOnCommand("ZRANDMEMBER")
public void zRandMemberShouldReturnResultCorrectly() {
nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES);
nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES);
assertThat(clusterConnection.zRandMember(KEY_1_BYTES)).isIn(VALUE_1_BYTES, VALUE_2_BYTES);
assertThat(clusterConnection.zRandMember(KEY_1_BYTES, 2)).hasSize(2).contains(VALUE_1_BYTES, VALUE_2_BYTES);
}
@Test // GH-2049
@EnabledOnCommand("ZRANDMEMBER")
public void zRandMemberWithScoreShouldReturnResultCorrectly() {
nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES);
nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES);
assertThat(clusterConnection.zRandMemberWithScore(KEY_1_BYTES)).isNotNull();
assertThat(clusterConnection.zRandMemberWithScore(KEY_1_BYTES, 2)).hasSize(2);
}
@Test // DATAREDIS-315
public void zRangeByLexShouldReturnResultCorrectly() {

View File

@@ -2179,6 +2179,29 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests {
.isEqualTo(new DefaultTuple(VALUE_3_BYTES, 30D));
}
@Test // GH-2049
@EnabledOnCommand("ZRANDMEMBER")
public void zRandMemberShouldReturnResultCorrectly() {
nativeConnection.zadd(KEY_1, 10D, VALUE_1);
nativeConnection.zadd(KEY_1, 20D, VALUE_2);
assertThat(clusterConnection.zRandMember(KEY_1_BYTES)).isIn(VALUE_1_BYTES, VALUE_2_BYTES);
assertThat(clusterConnection.zRandMember(KEY_1_BYTES, 2)).hasSize(2).contains(VALUE_1_BYTES, VALUE_2_BYTES);
}
@Test // GH-2049
@EnabledOnCommand("ZRANDMEMBER")
public void zRandMemberWithScoreShouldReturnResultCorrectly() {
nativeConnection.zadd(KEY_1, 10D, VALUE_1);
nativeConnection.zadd(KEY_1, 20D, VALUE_2);
assertThat(clusterConnection.zRandMemberWithScore(KEY_1_BYTES)).isNotNull();
assertThat(clusterConnection.zRandMemberWithScore(KEY_1_BYTES, 2)).hasSize(2);
}
@Test // DATAREDIS-315
public void zRangeByLexShouldReturnResultCorrectly() {

View File

@@ -27,6 +27,7 @@ import java.util.Collections;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.springframework.data.domain.Range;
import org.springframework.data.redis.ByteBufferObjectFactory;
@@ -142,6 +143,47 @@ public class DefaultReactiveZSetOperationsIntegrationTests<K, V> {
zSetOperations.incrementScore(key, value, 1.1).as(StepVerifier::create).expectNext(43.2).verifyComplete();
}
@ParameterizedRedisTest // GH-2049
@EnabledOnCommand("ZRANDMEMBER")
void randomMember() {
K key = keyFactory.instance();
V value1 = valueFactory.instance();
V value2 = valueFactory.instance();
zSetOperations.add(key, value1, 42.1).as(StepVerifier::create).expectNext(true).verifyComplete();
zSetOperations.add(key, value2, 10).as(StepVerifier::create).expectNext(true).verifyComplete();
zSetOperations.randomMember(key).as(StepVerifier::create).consumeNextWith(actual -> {
assertThat(actual).isIn(value1, value2);
}).verifyComplete();
zSetOperations.randomMembers(key, 2).as(StepVerifier::create).expectNextCount(2).verifyComplete();
zSetOperations.distinctRandomMembers(key, 2).as(StepVerifier::create).expectNextCount(2).verifyComplete();
}
@ParameterizedRedisTest // GH-2049
@Disabled("https://github.com/redis/redis/issues/9160")
@EnabledOnCommand("ZRANDMEMBER")
void randomMemberWithScore() {
K key = keyFactory.instance();
V value1 = valueFactory.instance();
V value2 = valueFactory.instance();
zSetOperations.add(key, value1, 42.1).as(StepVerifier::create).expectNext(true).verifyComplete();
zSetOperations.add(key, value2, 10).as(StepVerifier::create).expectNext(true).verifyComplete();
zSetOperations.randomMemberWithScore(key).as(StepVerifier::create).consumeNextWith(actual -> {
assertThat(actual).isIn(new DefaultTypedTuple<>(value1, 42.1d), new DefaultTypedTuple<>(value2, 10d));
}).verifyComplete();
zSetOperations.randomMembersWithScore(key, 2).as(StepVerifier::create).expectNextCount(2).verifyComplete();
zSetOperations.distinctRandomMembersWithScore(key, 2).as(StepVerifier::create).expectNextCount(2).verifyComplete();
}
@ParameterizedRedisTest // DATAREDIS-602
void rank() {

View File

@@ -27,12 +27,14 @@ import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.springframework.data.redis.DoubleAsStringObjectFactory;
import org.springframework.data.redis.DoubleObjectFactory;
import org.springframework.data.redis.LongAsStringObjectFactory;
import org.springframework.data.redis.LongObjectFactory;
import org.springframework.data.redis.ObjectFactory;
import org.springframework.data.redis.RawObjectFactory;
import org.springframework.data.redis.connection.RedisZSetCommands;
import org.springframework.data.redis.connection.RedisZSetCommands.Weights;
import org.springframework.data.redis.core.ZSetOperations.TypedTuple;
@@ -187,6 +189,49 @@ public class DefaultZSetOperationsIntegrationTests<K, V> {
assertThat(tuple).isEqualTo(new DefaultTypedTuple<>(value1, 5.7));
}
@ParameterizedRedisTest // GH-2049
@EnabledOnCommand("ZRANDMEMBER")
void testRandomMember() {
K key = keyFactory.instance();
V value1 = valueFactory.instance();
V value2 = valueFactory.instance();
V value3 = valueFactory.instance();
zSetOps.add(key, value1, 1.9);
zSetOps.add(key, value2, 3.7);
zSetOps.add(key, value3, 5.8);
assertThat(zSetOps.randomMember(key)).isIn(value1, value2, value3);
assertThat(zSetOps.randomMembers(key, 2)).hasSize(2).containsAnyOf(value1, value2, value3);
assertThat(zSetOps.distinctRandomMembers(key, 2)).hasSize(2).containsAnyOf(value1, value2, value3);
}
@ParameterizedRedisTest // GH-2049
@Disabled("https://github.com/redis/redis/issues/9160")
@EnabledOnCommand("ZRANDMEMBER")
void testRandomMemberWithScore() {
assumeThat(valueFactory).isNotInstanceOf(RawObjectFactory.class);
K key = keyFactory.instance();
V value1 = valueFactory.instance();
V value2 = valueFactory.instance();
V value3 = valueFactory.instance();
zSetOps.add(key, value1, 1.9);
zSetOps.add(key, value2, 3.7);
zSetOps.add(key, value3, 5.8);
assertThat(zSetOps.randomMemberWithScore(key)).isIn(new DefaultTypedTuple<>(value1, 1.9d),
new DefaultTypedTuple<>(value2, 3.7d), new DefaultTypedTuple<>(value3, 5.8d));
assertThat(zSetOps.randomMembersWithScore(key, 2)).hasSize(2).containsAnyOf(new DefaultTypedTuple<>(value1, 1.9d),
new DefaultTypedTuple<>(value2, 3.7d), new DefaultTypedTuple<>(value3, 5.8d));
assertThat(zSetOps.distinctRandomMembersWithScore(key, 2)).hasSize(2).containsAnyOf(
new DefaultTypedTuple<>(value1, 1.9d), new DefaultTypedTuple<>(value2, 3.7d),
new DefaultTypedTuple<>(value3, 5.8d));
}
@ParameterizedRedisTest
void testRangeByScoreOffsetCount() {