Skip to content

Commit e34a4a8

Browse files
authored
Merge branch 'main' into ort-diff-for-main
2 parents 098ff92 + f3f87d6 commit e34a4a8

File tree

5 files changed

+1067
-2
lines changed

5 files changed

+1067
-2
lines changed

java/integTest/src/test/java/compatibility/jedis/JedisTest.java

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import glide.api.models.configuration.GlideClientConfiguration;
1111
import glide.api.models.configuration.NodeAddress;
1212
import java.lang.reflect.Constructor;
13+
import java.nio.charset.StandardCharsets;
1314
import java.util.Arrays;
1415
import java.util.HashMap;
1516
import java.util.HashSet;
@@ -1628,6 +1629,145 @@ void send_command_set() {
16281629
assertTrue(resultSet.contains(member3), "SMEMBERS result should contain member3");
16291630
}
16301631

1632+
@Test
1633+
void sadd_srem_smembers_command() {
1634+
String key = UUID.randomUUID().toString();
1635+
String member1 = "member1";
1636+
String member2 = "member2";
1637+
String member3 = "member3";
1638+
1639+
long added = jedis.sadd(key, member1, member2, member3);
1640+
assertEquals(3L, added, "SADD should return 3 for three new members");
1641+
1642+
Set<String> members = jedis.smembers(key);
1643+
assertEquals(3, members.size(), "SMEMBERS should return 3 members");
1644+
assertTrue(members.contains(member1));
1645+
assertTrue(members.contains(member2));
1646+
assertTrue(members.contains(member3));
1647+
1648+
long removed = jedis.srem(key, member1);
1649+
assertEquals(1L, removed, "SREM should return 1 for one removed member");
1650+
1651+
members = jedis.smembers(key);
1652+
assertEquals(2, members.size(), "SMEMBERS should return 2 members after srem");
1653+
1654+
String keyBinary = UUID.randomUUID().toString();
1655+
byte[] keyBytes = keyBinary.getBytes(StandardCharsets.UTF_8);
1656+
byte[] m1 = "m1".getBytes(StandardCharsets.UTF_8);
1657+
byte[] m2 = "m2".getBytes(StandardCharsets.UTF_8);
1658+
jedis.sadd(keyBytes, m1, m2);
1659+
Set<byte[]> binaryMembers = jedis.smembers(keyBytes);
1660+
assertEquals(2, binaryMembers.size(), "SMEMBERS binary should return 2 members");
1661+
Set<String> memberStrings = new HashSet<>();
1662+
for (byte[] member : binaryMembers) {
1663+
memberStrings.add(new String(member, StandardCharsets.UTF_8));
1664+
}
1665+
Set<String> expectedBinaryMembers = new HashSet<>(Arrays.asList("m1", "m2"));
1666+
assertEquals(expectedBinaryMembers, memberStrings, "SMEMBERS binary should contain m1 and m2");
1667+
}
1668+
1669+
@Test
1670+
void set_commands_scard_sismember_smismember_spop_srandmember_smove() {
1671+
String key = UUID.randomUUID().toString();
1672+
jedis.sadd(key, "a", "b", "c");
1673+
assertEquals(3L, jedis.scard(key), "SCARD should return 3");
1674+
assertTrue(jedis.sismember(key, "a"), "SISMEMBER a should be true");
1675+
assertFalse(jedis.sismember(key, "z"), "SISMEMBER z should be false");
1676+
1677+
List<Boolean> smismember = jedis.smismember(key, "a", "b", "z");
1678+
assertEquals(
1679+
Arrays.asList(true, true, false),
1680+
smismember,
1681+
"SMISMEMBER should return [true, true, false]");
1682+
1683+
String popped = jedis.spop(key);
1684+
assertNotNull(popped, "SPOP should return a member");
1685+
Set<String> expectedMembers = new HashSet<>(Arrays.asList("a", "b", "c"));
1686+
assertTrue(expectedMembers.contains(popped), "SPOP should return one of a,b,c");
1687+
assertEquals(2L, jedis.scard(key), "SCARD should be 2 after spop");
1688+
1689+
String rand = jedis.srandmember(key);
1690+
assertNotNull(rand, "SRANDMEMBER should return a member");
1691+
List<String> randList = jedis.srandmember(key, 2);
1692+
assertEquals(2, randList.size(), "SRANDMEMBER count 2 should return 2");
1693+
1694+
String srcKey = UUID.randomUUID().toString();
1695+
String dstKey = UUID.randomUUID().toString();
1696+
jedis.sadd(srcKey, "x", "y");
1697+
jedis.sadd(dstKey, "z");
1698+
long moved = jedis.smove(srcKey, dstKey, "x");
1699+
assertEquals(1L, moved, "SMOVE should return 1");
1700+
assertFalse(jedis.sismember(srcKey, "x"), "x should be removed from source");
1701+
assertTrue(jedis.sismember(dstKey, "x"), "x should be in destination");
1702+
}
1703+
1704+
@Test
1705+
void set_commands_sinter_sintercard_sinterstore_sunion_sunionstore_sdiff_sdiffstore() {
1706+
String key1 = UUID.randomUUID().toString();
1707+
String key2 = UUID.randomUUID().toString();
1708+
String dest = UUID.randomUUID().toString();
1709+
jedis.sadd(key1, "a", "b", "c");
1710+
jedis.sadd(key2, "b", "c", "d");
1711+
1712+
Set<String> inter = jedis.sinter(key1, key2);
1713+
Set<String> expectedInter = new HashSet<>(Arrays.asList("b", "c"));
1714+
assertEquals(expectedInter, inter, "SINTER should return b,c");
1715+
1716+
// SINTERCARD was added in Redis 7.0
1717+
if (SERVER_VERSION.isGreaterThanOrEqualTo("7.0.0")) {
1718+
long interCard = jedis.sintercard(key1, key2);
1719+
assertEquals(2L, interCard, "SINTERCARD should return 2");
1720+
}
1721+
1722+
long interStoreLen = jedis.sinterstore(dest, key1, key2);
1723+
assertEquals(2L, interStoreLen, "SINTERSTORE should store 2 elements");
1724+
Set<String> expectedInterStore = new HashSet<>(Arrays.asList("b", "c"));
1725+
assertEquals(expectedInterStore, jedis.smembers(dest), "SINTERSTORE result should be b,c");
1726+
1727+
Set<String> union = jedis.sunion(key1, key2);
1728+
Set<String> expectedUnion = new HashSet<>(Arrays.asList("a", "b", "c", "d"));
1729+
assertEquals(expectedUnion, union, "SUNION should return a,b,c,d");
1730+
1731+
String destUnion = UUID.randomUUID().toString();
1732+
long unionStoreLen = jedis.sunionstore(destUnion, key1, key2);
1733+
assertEquals(4L, unionStoreLen, "SUNIONSTORE should store 4 elements");
1734+
1735+
Set<String> diff = jedis.sdiff(key1, key2);
1736+
Set<String> expectedDiff = new HashSet<>(Arrays.asList("a"));
1737+
assertEquals(expectedDiff, diff, "SDIFF key1-key2 should return a");
1738+
1739+
String destDiff = UUID.randomUUID().toString();
1740+
long diffStoreLen = jedis.sdiffstore(destDiff, key1, key2);
1741+
assertEquals(1L, diffStoreLen, "SDIFFSTORE should store 1 element");
1742+
Set<String> expectedDiffStore = new HashSet<>(Arrays.asList("a"));
1743+
assertEquals(expectedDiffStore, jedis.smembers(destDiff), "SDIFFSTORE result should be a");
1744+
}
1745+
1746+
@Test
1747+
void set_commands_sscan() {
1748+
String key = UUID.randomUUID().toString();
1749+
jedis.sadd(key, "m1", "m2", "m3");
1750+
ScanResult<String> result = jedis.sscan(key, "0");
1751+
assertNotNull(result, "SSCAN result should not be null");
1752+
assertNotNull(result.getCursor(), "SSCAN cursor should not be null");
1753+
assertNotNull(result.getResult(), "SSCAN result list should not be null");
1754+
assertTrue(
1755+
result.getResult().size() >= 1 && result.getResult().size() <= 3,
1756+
"SSCAN should return 1-3 members in first iteration");
1757+
Set<String> expectedMembers = new HashSet<>(Arrays.asList("m1", "m2", "m3"));
1758+
for (String member : result.getResult()) {
1759+
assertTrue(expectedMembers.contains(member), "SSCAN should return valid members: " + member);
1760+
}
1761+
1762+
ScanResult<String> withParams = jedis.sscan(key, "0", new ScanParams().count(10));
1763+
assertNotNull(withParams.getResult(), "SSCAN with params should return result");
1764+
for (String member : withParams.getResult()) {
1765+
assertTrue(
1766+
expectedMembers.contains(member),
1767+
"SSCAN with params should return valid members: " + member);
1768+
}
1769+
}
1770+
16311771
@Test
16321772
void send_command_binary_data() {
16331773
String key = UUID.randomUUID().toString();

java/jedis-compatibility/compatibility-layer-migration-guide.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ blockingSocketTimeoutMillis
6666
- ✅ Basic string operations (GET, SET, MGET, MSET)
6767
- ✅ Hash operations (HGET, HSET, HMGET, HMSET)
6868
- ✅ List operations (LPUSH, RPUSH, LPOP, RPOP)
69-
- ⚠️ Set operations (SADD, SREM, SMEMBERS) - **Available via `sendCommand()` only**
69+
- Set operations (SADD, SREM, SMEMBERS, SCARD, SISMEMBER, SMISMEMBER, SPOP, SRANDMEMBER, SMOVE, SINTER, SINTERCARD, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SSCAN) via type-safe methods
7070
- ⚠️ Sorted set operations (ZADD, ZREM, ZRANGE) - **Available via `sendCommand()` only**
7171
- ✅ Key operations (DEL, EXISTS, EXPIRE, TTL)
7272
- ✅ Connection commands (PING, SELECT)
@@ -99,7 +99,7 @@ blockingSocketTimeoutMillis
9999
- **Pub/Sub**: Redis publish/subscribe not implemented
100100
- **Lua scripting**: EVAL/EVALSHA commands not supported
101101
- **Modules**: Redis module commands not available
102-
- **Typed set/sorted set methods**: No dedicated methods like `sadd()`, `zadd()` - use `sendCommand()` instead
102+
- **Typed sorted set methods**: No dedicated methods like `zadd()`, `zrem()` - use `sendCommand()` instead
103103

104104
### Configuration Limitations
105105
- **Complex SSL configurations**: Jedis `JedisClientConfig` SSL parameters cannot be mapped to Valkey GLIDE `GlideClientConfiguration`

0 commit comments

Comments
 (0)