DATAREDIS-668 - Add SPOP with COUNT command.

We now support SPOP command with COUNT option throughout the imperative, cluster and reactive API.

Original pull request: #259.
This commit is contained in:
Christoph Strobl
2017-07-24 14:54:02 +02:00
committed by Mark Paluch
parent 3616d69bf6
commit c87e0af0ef
19 changed files with 330 additions and 3 deletions

View File

@@ -27,7 +27,18 @@ import static org.springframework.data.redis.connection.RedisGeoCommands.Distanc
import static org.springframework.data.redis.connection.RedisGeoCommands.GeoRadiusCommandArgs.*;
import static org.springframework.data.redis.core.ScanOptions.*;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingDeque;
@@ -36,6 +47,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
import org.hamcrest.core.IsNot;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
@@ -1458,6 +1470,17 @@ public abstract class AbstractConnectionIntegrationTests {
new HashSet<String>(Arrays.asList(new String[] { "foo", "bar" })).contains((String) getResults().get(2)));
}
@Test // DATAREDIS-688
public void testSPopWithCount() {
actual.add(connection.sAdd("myset", "foo"));
actual.add(connection.sAdd("myset", "bar"));
actual.add(connection.sAdd("myset", "baz"));
actual.add(connection.sPop("myset", 2));
assertThat((Collection<Object>) getResults().get(3), hasSize(2));
}
@Test
public void testSRandMember() {
actual.add(connection.sAdd("myset", "foo"));

View File

@@ -28,7 +28,16 @@ import redis.clients.jedis.JedisPool;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.*;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.junit.After;
@@ -919,6 +928,15 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests {
assertThat(clusterConnection.sPop(KEY_1_BYTES), notNullValue());
}
@Test // DATAREDIS-668
public void sPopWithCountShouldPopValueFromSetCorrectly() {
nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2, VALUE_3);
assertThat(clusterConnection.setCommands().sPop(KEY_1_BYTES, 2), hasSize(2));
assertThat(nativeConnection.scard(KEY_1), is(1L));
}
@Test // DATAREDIS-315
public void sMoveShouldWorkWhenKeysMapToSameSlot() {

View File

@@ -934,6 +934,15 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests {
assertThat(clusterConnection.sPop(KEY_1_BYTES), notNullValue());
}
@Test // DATAREDIS-668
public void sPopWithCountShouldPopValueFromSetCorrectly() {
nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2, VALUE_3);
assertThat(clusterConnection.setCommands().sPop(KEY_1_BYTES, 2), hasSize(2));
assertThat(nativeConnection.scard(KEY_1), is(1L));
}
@Test // DATAREDIS-315
public void sMoveShouldWorkWhenKeysMapToSameSlot() {

View File

@@ -69,6 +69,14 @@ public class LettuceReactiveSetCommandsTests extends LettuceReactiveCommandsTest
assertThat(connection.setCommands().sPop(KEY_1_BBUFFER).block(), is(notNullValue()));
}
@Test // DATAREDIS-668
public void sPopCountShouldRetrieveValues() {
nativeCommands.sadd(KEY_1, VALUE_1, VALUE_2, VALUE_3);
StepVerifier.create(connection.setCommands().sPop(KEY_1_BBUFFER, 2)).expectNextCount(2).verifyComplete();
}
@Test // DATAREDIS-525
public void sPopShouldReturnNullWhenNotPresent() {
assertThat(connection.setCommands().sPop(KEY_1_BBUFFER).block(), is(nullValue()));

View File

@@ -133,6 +133,21 @@ public class DefaultReactiveSetOperationsIntegrationTests<K, V> {
}).verifyComplete();
}
@Test // DATAREDIS-668
public void popWithCount() {
assumeFalse(valueFactory instanceof ByteBufferObjectFactory);
K key = keyFactory.instance();
V value1 = valueFactory.instance();
V value2 = valueFactory.instance();
V value3 = valueFactory.instance();
StepVerifier.create(setOperations.add(key, value1, value2, value3)).expectNext(3L).verifyComplete();
StepVerifier.create(setOperations.pop(key, 2)).expectNextCount(2).verifyComplete();
StepVerifier.create(setOperations.size(key)).expectNext(1L).verifyComplete();
}
@Test // DATAREDIS-602
public void move() {

View File

@@ -16,6 +16,7 @@
package org.springframework.data.redis.core;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
import static org.junit.Assert.*;
import static org.junit.Assume.*;
import static org.springframework.data.redis.matcher.RedisTestMatchers.*;
@@ -28,6 +29,7 @@ import java.util.List;
import java.util.Set;
import org.hamcrest.CoreMatchers;
import org.hamcrest.collection.IsCollectionWithSize;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
@@ -175,6 +177,20 @@ public class DefaultSetOperationsTests<K, V> {
assertTrue(setOps.members(key).isEmpty());
}
@Test // DATAREDIS-668
public void testPopWithCount() {
K key = keyFactory.instance();
V v1 = valueFactory.instance();
V v2 = valueFactory.instance();
V v3 = valueFactory.instance();
setOps.add(key, v1, v2, v3);
List<V> result = setOps.pop(key, 2);
assertThat(result, hasSize(2));
assertThat(result.get(0), instanceOf(v1.getClass()));
}
@SuppressWarnings("unchecked")
@Test
public void testRandomMember() {