Skip to content

Commit 7b59bdd

Browse files
authored
Add long index support to ZRangeParams (#4445) (#4446)
* add support for zrange params from long min/max resolves #4445
1 parent f669f98 commit 7b59bdd

File tree

9 files changed

+434
-53
lines changed

9 files changed

+434
-53
lines changed

pom.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -543,8 +543,6 @@
543543
<include>src/main/java/redis/clients/jedis/HostAndPort.java</include>
544544
<include>**/builders/*.java</include>
545545
<include>**/MultiDb*.java</include>
546-
<include>**/ClientTestUtil.java</include>
547-
<include>**/ReflectionTestUtil.java</include>
548546
<include>**/*CommandFlags*.java</include>
549547
<include>**/*CompareCondition*.java</include>
550548
<include>**/*MSetExParams*.java</include>
@@ -554,7 +552,6 @@
554552
<include>**/ClientCommandsTest*.java</include>
555553
<include>**/Delay*.java</include>
556554
<include>**/SentineledConnectionProviderReconnectionTest.java</include>
557-
<include>**/ACLTestUtil.java</include>
558555
<include>**/search/Apply.java</include>
559556
<include>**/search/Combiner.java</include>
560557
<include>**/search/Combiners.java</include>
@@ -568,6 +565,8 @@
568565
<include>**/TestDataUtil*.java</include>
569566
<include>**/*JedisClientConfig*.java</include>
570567
<include>**/resps/LibraryInfoTest.java</include>
568+
<include>**/*Matchers.java</include>
569+
<include>**/*TestUtil.java</include>
571570
</includes>
572571
</configuration>
573572
<executions>

src/main/java/redis/clients/jedis/params/ZRangeParams.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ private ZRangeParams() {
2626
}
2727

2828
public ZRangeParams(int min, int max) {
29+
this((long) min, (long) max);
30+
}
31+
32+
public ZRangeParams(long min, long max) {
2933
this.by = null;
3034
this.min = from(min);
3135
this.max = from(max);
@@ -35,6 +39,10 @@ public static ZRangeParams zrangeParams(int min, int max) {
3539
return new ZRangeParams(min, max);
3640
}
3741

42+
public static ZRangeParams zrangeParams(long min, long max) {
43+
return new ZRangeParams(min, max);
44+
}
45+
3846
public ZRangeParams(double min, double max) {
3947
this.by = BYSCORE;
4048
this.min = from(min);

src/test/java/redis/clients/jedis/JedisClusterInfoCacheTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import static org.mockito.Mockito.when;
2727
import static redis.clients.jedis.JedisClusterInfoCache.getNodeKey;
2828
import static redis.clients.jedis.Protocol.Command.CLUSTER;
29-
import static redis.clients.jedis.util.CommandArgumentMatchers.commandWithArgs;
29+
import static redis.clients.jedis.util.CommandArgumentsMatchers.commandWithArgs;
3030

3131
@Tag("unit")
3232
@ExtendWith(MockitoExtension.class)

src/test/java/redis/clients/jedis/commands/jedis/SortedSetCommandsTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,6 +1032,22 @@ public void zrangeParams() {
10321032
assertNotNull(jedis.zrangeWithScores(bfoo, ZRangeParams.zrangeByScoreParams(0, 1).limit(0, 3)));
10331033
}
10341034

1035+
@Test
1036+
public void zrangeParamsLongMinMax() {
1037+
1038+
long min = 0;
1039+
long max = 1;
1040+
1041+
jedis.zadd("foo", 1, "a");
1042+
jedis.zadd("foo", 2, "b");
1043+
1044+
List<String> expected = new ArrayList<String>();
1045+
expected.add("b");
1046+
expected.add("a");
1047+
1048+
assertEquals(expected, jedis.zrange("foo", ZRangeParams.zrangeParams(min, max).rev()));
1049+
}
1050+
10351051
@Test
10361052
@ConditionalOnEnv(value = TestEnvUtil.ENV_REDIS_ENTERPRISE, enabled = false)
10371053
public void zrangestore() {

src/test/java/redis/clients/jedis/commands/unified/SortedSetCommandsTestBase.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,22 @@ public void zrangeParams() {
325325
assertNotNull(jedis.zrangeWithScores(bfoo, ZRangeParams.zrangeByScoreParams(0, 1).limit(0, 3)));
326326
}
327327

328+
@Test
329+
public void zrangeParamsLongMinMax() {
330+
331+
long min = 0;
332+
long max = 1;
333+
334+
jedis.zadd("foo", 1, "a");
335+
jedis.zadd("foo", 2, "b");
336+
337+
List<String> expected = new ArrayList<String>();
338+
expected.add("b");
339+
expected.add("a");
340+
341+
assertEquals(expected, jedis.zrange("foo", ZRangeParams.zrangeParams(min, max).rev()));
342+
}
343+
328344
@Test
329345
@ConditionalOnEnv(value = TestEnvUtil.ENV_REDIS_ENTERPRISE, enabled = false)
330346
public void zrangestore() {

src/test/java/redis/clients/jedis/params/ZRangeParamsTest.java

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
11
package redis.clients.jedis.params;
22

3+
import org.junit.jupiter.api.Nested;
34
import org.junit.jupiter.api.Test;
5+
import redis.clients.jedis.CommandArguments;
6+
import redis.clients.jedis.Protocol;
7+
import redis.clients.jedis.args.Rawable;
8+
import redis.clients.jedis.args.RawableFactory;
9+
import redis.clients.jedis.util.CommandArgumentsMatchers;
10+
import redis.clients.jedis.util.ProtocolTestUtil;
411

12+
import java.io.IOException;
13+
import java.util.Iterator;
14+
15+
import static org.hamcrest.MatcherAssert.assertThat;
16+
import static org.hamcrest.Matchers.*;
517
import static org.junit.jupiter.api.Assertions.*;
18+
import static redis.clients.jedis.util.CommandArgumentsMatchers.*;
619

720
public class ZRangeParamsTest {
821

@@ -45,6 +58,104 @@ public void checkEqualsWithNull() {
4558
assertFalse(firstParam.equals(secondParam));
4659
}
4760

61+
@Nested
62+
class BuilderTests {
63+
64+
@Test
65+
public void testZrangeParamsIntMinMax() {
66+
int min = 0;
67+
int max = 1;
68+
ZRangeParams params = ZRangeParams.zrangeParams(min, max);
69+
CommandArguments args = new CommandArguments(Protocol.Command.ZRANGE);
70+
params.addParams(args);
71+
72+
assertThat(args, hasArgumentCount(3));
73+
74+
assertThat(args, hasArguments(
75+
Protocol.Command.ZRANGE,
76+
RawableFactory.from(min),
77+
RawableFactory.from(max)
78+
));
79+
}
80+
81+
//Test that long values are serialized as long (not double) to avoid precision loss
82+
@Test
83+
public void testZrangeParamsLongMinMax() {
84+
long min = Integer.MAX_VALUE + 1L;
85+
long max = Integer.MAX_VALUE + 2L;
86+
87+
ZRangeParams params = ZRangeParams.zrangeParams(min, max);
88+
CommandArguments args = new CommandArguments(Protocol.Command.ZRANGE);
89+
params.addParams(args);
90+
91+
assertThat(args, hasArgumentCount(3));
92+
93+
assertThat(args, hasArguments(
94+
Protocol.Command.ZRANGE,
95+
RawableFactory.from(min),
96+
RawableFactory.from(max)
97+
));
98+
}
99+
100+
//Test that int factory method delegates to long constructor and produces the same Rawable encoding
101+
@Test
102+
public void testZrangeParamsIntMinMaxDelegatesToLong() {
103+
int min = 100;
104+
int max = 200;
105+
ZRangeParams intParams = ZRangeParams.zrangeParams(min, max);
106+
ZRangeParams longParams = ZRangeParams.zrangeParams((long) min, (long) max);
107+
CommandArguments intArgs = new CommandArguments(Protocol.Command.ZRANGE);
108+
intParams.addParams(intArgs);
109+
CommandArguments longArgs = new CommandArguments(Protocol.Command.ZRANGE);
110+
longParams.addParams(longArgs);
111+
112+
// Both should produce identical arguments
113+
assertEquals(intArgs.size(), longArgs.size());
114+
Iterator<Rawable> intIter = intArgs.iterator();
115+
Iterator<Rawable> longIter = longArgs.iterator();
116+
while (intIter.hasNext() && longIter.hasNext()) {
117+
assertEquals(intIter.next(), longIter.next());
118+
}
119+
}
120+
121+
// Test that zrangeParams(double, double) produces BYSCORE args
122+
@Test
123+
public void testZrangeParamsByScore() {
124+
double min = 0.1;
125+
double max = 1.1;
126+
ZRangeParams params = ZRangeParams.zrangeByScoreParams(min, max);
127+
CommandArguments args = new CommandArguments(Protocol.Command.ZRANGE);
128+
params.addParams(args);
129+
130+
assertThat(args, hasArgumentCount(4));
131+
assertThat(args, hasArguments(
132+
Protocol.Command.ZRANGE,
133+
RawableFactory.from(min),
134+
RawableFactory.from(max),
135+
Protocol.Keyword.BYSCORE
136+
));
137+
}
138+
139+
// Test the actual RESP protocol output
140+
@Test
141+
public void testProtocolOutputWithLongValues() throws IOException {
142+
long largeStart = 3_000_000_000L;
143+
long largeEnd = 3_000_000_099L;
144+
145+
ZRangeParams params = ZRangeParams.zrangeParams(largeStart, largeEnd);
146+
CommandArguments args = new CommandArguments(Protocol.Command.ZRANGE);
147+
params.addParams(args);
148+
149+
// Capture the RESP protocol output
150+
String respOutput = ProtocolTestUtil.captureCommandOutput(args);
151+
152+
// RESP protocol uses CRLF (\r\n) line endings
153+
String expected = "*3\r\n" + "$6\r\n" + "ZRANGE\r\n" + "$10\r\n" + "3000000000\r\n" + "$10\r\n" + "3000000099\r\n";
154+
assertEquals(expected, respOutput);
155+
}
156+
157+
}
158+
48159
private ZRangeParams getDefaultValue() {
49160
return new ZRangeParams(0, 0);
50161
}

src/test/java/redis/clients/jedis/util/CommandArgumentMatchers.java

Lines changed: 0 additions & 49 deletions
This file was deleted.

0 commit comments

Comments
 (0)