Add support for SMISMEMBER.

Allows querying with a single command whether multiple elements are members of a set. Also, refine DefaultRedisSet.containsAll(…) implementation.

Closes #2037
Original Pull Request: #2105
This commit is contained in:
Mark Paluch
2021-06-29 15:23:30 +02:00
committed by Christoph Strobl
parent 280d9541da
commit 90095d1c89
25 changed files with 425 additions and 2 deletions

View File

@@ -1656,6 +1656,15 @@ public abstract class AbstractConnectionIntegrationTests {
verifyResults(Arrays.asList(new Object[] { 1L, 1L, true, false }));
}
@Test // GH-2037
@EnabledOnCommand("SMISMEMBER")
void testSMIsMember() {
actual.add(connection.sAdd("myset", "foo"));
actual.add(connection.sAdd("myset", "bar"));
actual.add(connection.sMIsMember("myset", "foo", "bar", "baz"));
verifyResults(Arrays.asList(new Object[] { 1L, 1L, Arrays.asList(true, true, false) }));
}
@Test
void testSMove() {
actual.add(connection.sAdd("myset", "foo"));

View File

@@ -470,6 +470,9 @@ public interface ClusterConnectionTests {
// DATAREDIS-315
void sIsMemberShouldReturnTrueIfValueIsMemberOfSet();
// GH-2037
void sMIsMemberShouldReturnCorrectValues();
// DATAREDIS-315
void sMembersShouldReturnValuesContainedInSetCorrectly();

View File

@@ -1589,6 +1589,16 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests {
assertThat(clusterConnection.sIsMember(KEY_1_BYTES, VALUE_1_BYTES)).isTrue();
}
@Test // GH-2037
@EnabledOnCommand("SMISMEMBER")
public void sMIsMemberShouldReturnCorrectValues() {
nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2);
assertThat(clusterConnection.sMIsMember(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES, VALUE_3_BYTES))
.containsExactly(true, true, false);
}
@Test // DATAREDIS-315
public void sMembersShouldReturnValuesContainedInSetCorrectly() {

View File

@@ -1624,6 +1624,16 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests {
assertThat(clusterConnection.sIsMember(KEY_1_BYTES, VALUE_1_BYTES)).isTrue();
}
@Test // GH-2037
@EnabledOnCommand("SMISMEMBER")
public void sMIsMemberShouldReturnCorrectValues() {
nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2);
assertThat(clusterConnection.sMIsMember(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES, VALUE_3_BYTES))
.containsExactly(true, true, false);
}
@Test // DATAREDIS-315
public void sMembersShouldReturnValuesContainedInSetCorrectly() {

View File

@@ -22,6 +22,7 @@ import reactor.test.StepVerifier;
import java.util.Arrays;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.test.condition.EnabledOnCommand;
import org.springframework.data.redis.test.extension.parametrized.ParameterizedRedisTest;
/**
@@ -143,6 +144,18 @@ public class LettuceReactiveSetCommandsIntegrationIntegrationTests extends Lettu
assertThat(connection.setCommands().sIsMember(KEY_1_BBUFFER, VALUE_3_BBUFFER).block()).isFalse();
}
@ParameterizedRedisTest // GH-2037
@EnabledOnCommand("SMISMEMBER")
void sMIsMemberShouldReturnCorrectly() {
nativeCommands.sadd(KEY_1, VALUE_1, VALUE_2);
connection.setCommands().sMIsMember(KEY_1_BBUFFER, Arrays.asList(VALUE_1_BBUFFER, VALUE_3_BBUFFER)) //
.as(StepVerifier::create) //
.expectNext(Arrays.asList(true, false)) //
.verifyComplete();
}
@ParameterizedRedisTest // DATAREDIS-525, DATAREDIS-647
void sInterShouldIntersectSetsCorrectly() {

View File

@@ -30,6 +30,7 @@ import org.springframework.data.redis.ObjectFactory;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.ReactiveOperationsTestParams.Fixture;
import org.springframework.data.redis.test.condition.EnabledOnCommand;
import org.springframework.data.redis.test.extension.parametrized.MethodSource;
import org.springframework.data.redis.test.extension.parametrized.ParameterizedRedisTest;
@@ -154,6 +155,23 @@ public class DefaultReactiveSetOperationsIntegrationTests<K, V> {
setOperations.isMember(key, value1).as(StepVerifier::create).expectNext(true).verifyComplete();
}
@ParameterizedRedisTest // GH-2037
@EnabledOnCommand("SMISMEMBER")
void isMembers() {
assumeThat(valueFactory instanceof ByteBufferObjectFactory).isFalse();
K key = keyFactory.instance();
V value1 = valueFactory.instance();
V value2 = valueFactory.instance();
setOperations.add(key, value1).as(StepVerifier::create).expectNext(1L).verifyComplete();
setOperations.isMember(key, value1, value2).as(StepVerifier::create).consumeNextWith(actual -> {
assertThat(actual).containsEntry(value1, true).containsEntry(value2, false);
}).verifyComplete();
}
@ParameterizedRedisTest // DATAREDIS-602, DATAREDIS-873
void intersect() {

View File

@@ -26,6 +26,7 @@ import java.util.Set;
import org.junit.jupiter.api.BeforeEach;
import org.springframework.data.redis.ObjectFactory;
import org.springframework.data.redis.test.condition.EnabledOnCommand;
import org.springframework.data.redis.test.extension.parametrized.MethodSource;
import org.springframework.data.redis.test.extension.parametrized.ParameterizedRedisTest;
@@ -322,4 +323,23 @@ public class DefaultSetOperationsIntegrationTests<K, V> {
assertThat(setOps.intersectAndStore(sourceKey1, sourceKey2, destinationKey)).isEqualTo(2L);
assertThat(setOps.intersectAndStore(Arrays.asList(sourceKey1, sourceKey2), destinationKey)).isEqualTo(2L);
}
@ParameterizedRedisTest // GH-2037
@EnabledOnCommand("SMISMEMBER")
void isMember() {
K key = keyFactory.instance();
V v1 = valueFactory.instance();
V v2 = valueFactory.instance();
V v3 = valueFactory.instance();
V v4 = valueFactory.instance();
setOps.add(key, v1, v2, v3);
assertThat(setOps.isMember(key, v1)).isTrue();
assertThat(setOps.isMember(key, v4)).isFalse();
assertThat(setOps.isMember(key, v1, v2, v3, v4)).containsEntry(v1, true).containsEntry(v2, true)
.containsEntry(v3, true).containsEntry(v4, false);
}
}

View File

@@ -20,6 +20,7 @@ import static org.assertj.core.api.Assertions.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
@@ -30,6 +31,7 @@ import org.springframework.data.redis.ObjectFactory;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.test.condition.EnabledOnCommand;
import org.springframework.data.redis.test.extension.parametrized.ParameterizedRedisTest;
import org.springframework.util.ObjectUtils;
@@ -67,6 +69,21 @@ public abstract class AbstractRedisSetIntegrationTests<T> extends AbstractRedisC
return new DefaultRedisSet<>((BoundSetOperations<String, T>) set.getOperations().boundSetOps(key));
}
@ParameterizedRedisTest // GH-2037
@EnabledOnCommand("SMISMEMBER")
void testContainsAll() {
T t1 = getT();
T t2 = getT();
T t3 = getT();
set.add(t1);
set.add(t2);
assertThat(set.containsAll(Arrays.asList(t1, t2, t3))).isFalse();
assertThat(set.containsAll(Arrays.asList(t1, t2))).isTrue();
assertThat(set.containsAll(Collections.emptyList())).isTrue();
}
@ParameterizedRedisTest
void testDiff() {
RedisSet<T> diffSet1 = createSetFor("test:set:diff1");