Skip to content

Commit d9c675b

Browse files
author
dengliming
authored
Add support for ZADD GT/LT options (#2411)
1 parent 9488026 commit d9c675b

File tree

2 files changed

+70
-20
lines changed

2 files changed

+70
-20
lines changed

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ public class ZAddParams extends Params {
1010
private static final String XX = "xx";
1111
private static final String NX = "nx";
1212
private static final String CH = "ch";
13+
private static final String LT = "lt";
14+
private static final String GT = "gt";
1315

1416
public ZAddParams() {
1517
}
@@ -46,6 +48,24 @@ public ZAddParams ch() {
4648
return this;
4749
}
4850

51+
/**
52+
* Only update existing elements if the new score is greater than the current score.
53+
* @return ZAddParams
54+
*/
55+
public ZAddParams gt() {
56+
addParam(GT);
57+
return this;
58+
}
59+
60+
/**
61+
* Only update existing elements if the new score is less than the current score.
62+
* @return ZAddParams
63+
*/
64+
public ZAddParams lt() {
65+
addParam(LT);
66+
return this;
67+
}
68+
4969
public byte[][] getByteParams(byte[] key, byte[]... args) {
5070
ArrayList<byte[]> byteParams = new ArrayList<>();
5171
byteParams.add(key);
@@ -59,6 +79,12 @@ public byte[][] getByteParams(byte[] key, byte[]... args) {
5979
if (contains(CH)) {
6080
byteParams.add(SafeEncoder.encode(CH));
6181
}
82+
if (contains(LT)) {
83+
byteParams.add(SafeEncoder.encode(LT));
84+
}
85+
if (contains(GT)) {
86+
byteParams.add(SafeEncoder.encode(GT));
87+
}
6288

6389
Collections.addAll(byteParams, args);
6490

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

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,18 @@ public void zaddWithParams() {
9292
status = jedis.zadd("foo", scoreMembers, ZAddParams.zAddParams().ch());
9393
assertEquals(2L, status);
9494

95+
// lt: only update existing elements if the new score is less than the current score.
96+
jedis.zadd("foo", 3d, "a", ZAddParams.zAddParams().lt());
97+
assertEquals(Double.valueOf(2d), jedis.zscore("foo", "a"));
98+
jedis.zadd("foo", 1d, "a", ZAddParams.zAddParams().lt());
99+
assertEquals(Double.valueOf(1d), jedis.zscore("foo", "a"));
100+
101+
// gt: only update existing elements if the new score is greater than the current score.
102+
jedis.zadd("foo", 0d, "b", ZAddParams.zAddParams().gt());
103+
assertEquals(Double.valueOf(1d), jedis.zscore("foo", "b"));
104+
jedis.zadd("foo", 2d, "b", ZAddParams.zAddParams().gt());
105+
assertEquals(Double.valueOf(2d), jedis.zscore("foo", "b"));
106+
95107
// binary
96108
jedis.del(bfoo);
97109

@@ -111,6 +123,18 @@ public void zaddWithParams() {
111123
// ch: return count of members not only added, but also updated
112124
status = jedis.zadd(bfoo, binaryScoreMembers, ZAddParams.zAddParams().ch());
113125
assertEquals(2L, status);
126+
127+
// lt: only update existing elements if the new score is less than the current score.
128+
jedis.zadd(bfoo, 3d, ba, ZAddParams.zAddParams().lt());
129+
assertEquals(Double.valueOf(2d), jedis.zscore(bfoo, ba));
130+
jedis.zadd(bfoo, 1d, ba, ZAddParams.zAddParams().lt());
131+
assertEquals(Double.valueOf(1d), jedis.zscore(bfoo, ba));
132+
133+
// gt: only update existing elements if the new score is greater than the current score.
134+
jedis.zadd(bfoo, 0d, bb, ZAddParams.zAddParams().gt());
135+
assertEquals(Double.valueOf(1d), jedis.zscore(bfoo, bb));
136+
jedis.zadd(bfoo, 2d, bb, ZAddParams.zAddParams().gt());
137+
assertEquals(Double.valueOf(2d), jedis.zscore(bfoo, bb));
114138
}
115139

116140
@Test
@@ -568,48 +592,48 @@ public void zpopmax() {
568592
jedis.zadd("foo", 10d, "b");
569593
jedis.zadd("foo", 0.1d, "c");
570594
jedis.zadd("foo", 2d, "d");
571-
595+
572596
Tuple actual = jedis.zpopmax("foo");
573597
Tuple expected = new Tuple("b", 10d);
574598
assertEquals(expected, actual);
575-
599+
576600
actual = jedis.zpopmax("foo");
577601
expected = new Tuple("d", 2d);
578602
assertEquals(expected, actual);
579-
603+
580604
actual = jedis.zpopmax("foo");
581605
expected = new Tuple("a", 1d);
582606
assertEquals(expected, actual);
583-
607+
584608
actual = jedis.zpopmax("foo");
585609
expected = new Tuple("c", 0.1d);
586610
assertEquals(expected, actual);
587-
611+
588612
// Empty
589613
actual = jedis.zpopmax("foo");
590614
assertNull(actual);
591-
615+
592616
// Binary
593617
jedis.zadd(bfoo, 1d, ba);
594618
jedis.zadd(bfoo, 10d, bb);
595619
jedis.zadd(bfoo, 0.1d, bc);
596620
jedis.zadd(bfoo, 2d, ba);
597-
621+
598622
// First
599623
actual = jedis.zpopmax(bfoo);
600624
expected = new Tuple(bb, 10d);
601625
assertEquals(expected, actual);
602-
626+
603627
// Second
604628
actual = jedis.zpopmax(bfoo);
605629
expected = new Tuple(ba, 2d);
606630
assertEquals(expected, actual);
607-
631+
608632
// Third
609633
actual = jedis.zpopmax(bfoo);
610634
expected = new Tuple(bc, 0.1d);
611635
assertEquals(expected, actual);
612-
636+
613637
// Empty
614638
actual = jedis.zpopmax(bfoo);
615639
assertNull(actual);
@@ -622,35 +646,35 @@ public void zpopmaxWithCount() {
622646
jedis.zadd("foo", 0.1d, "c");
623647
jedis.zadd("foo", 2d, "d");
624648
jedis.zadd("foo", 0.03, "e");
625-
649+
626650
Set<Tuple> actual = jedis.zpopmax("foo", 2);
627651
assertEquals(2, actual.size());
628-
652+
629653
Set<Tuple> expected = new LinkedHashSet<Tuple>();
630654
expected.add(new Tuple("b", 10d));
631655
expected.add(new Tuple("d", 2d));
632656
assertEquals(expected, actual);
633-
657+
634658
actual = jedis.zpopmax("foo", 3);
635659
assertEquals(3, actual.size());
636-
660+
637661
expected.clear();
638662
expected.add(new Tuple("a", 1d));
639663
expected.add(new Tuple("c", 0.1d));
640664
expected.add(new Tuple("e", 0.03d));
641665
assertEquals(expected, actual);
642-
666+
643667
// Empty
644668
actual = jedis.zpopmax("foo", 1);
645669
expected.clear();
646670
assertEquals(expected, actual);
647-
671+
648672
// Binary
649673
jedis.zadd(bfoo, 1d, ba);
650674
jedis.zadd(bfoo, 10d, bb);
651675
jedis.zadd(bfoo, 0.1d, bc);
652676
jedis.zadd(bfoo, 2d, ba);
653-
677+
654678
// First
655679
actual = jedis.zpopmax(bfoo, 1);
656680
expected.clear();
@@ -662,19 +686,19 @@ public void zpopmaxWithCount() {
662686
expected.clear();
663687
expected.add(new Tuple(ba, 2d));
664688
assertEquals(expected, actual);
665-
689+
666690
// Last 2 (just 1, because 1 was overwritten)
667691
actual = jedis.zpopmax(bfoo, 1);
668692
expected.clear();
669693
expected.add(new Tuple(bc, 0.1d));
670694
assertEquals(expected, actual);
671-
695+
672696
// Empty
673697
actual = jedis.zpopmax(bfoo, 1);
674698
expected.clear();
675699
assertEquals(expected, actual);
676700
}
677-
701+
678702
@Test
679703
public void zpopmin() {
680704

0 commit comments

Comments
 (0)