Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions src/main/java/redis/clients/jedis/params/ZAddParams.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ public class ZAddParams extends Params {
private static final String XX = "xx";
private static final String NX = "nx";
private static final String CH = "ch";
private static final String LT = "lt";
private static final String GT = "gt";

public ZAddParams() {
}
Expand Down Expand Up @@ -46,6 +48,24 @@ public ZAddParams ch() {
return this;
}

/**
* Only update existing elements if the new score is greater than the current score.
* @return ZAddParams
*/
public ZAddParams gt() {
addParam(GT);
return this;
}

/**
* Only update existing elements if the new score is less than the current score.
* @return ZAddParams
*/
public ZAddParams lt() {
addParam(LT);
return this;
}

public byte[][] getByteParams(byte[] key, byte[]... args) {
ArrayList<byte[]> byteParams = new ArrayList<>();
byteParams.add(key);
Expand All @@ -59,6 +79,12 @@ public byte[][] getByteParams(byte[] key, byte[]... args) {
if (contains(CH)) {
byteParams.add(SafeEncoder.encode(CH));
}
if (contains(LT)) {
byteParams.add(SafeEncoder.encode(LT));
}
if (contains(GT)) {
byteParams.add(SafeEncoder.encode(GT));
}

Collections.addAll(byteParams, args);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,18 @@ public void zaddWithParams() {
status = jedis.zadd("foo", scoreMembers, ZAddParams.zAddParams().ch());
assertEquals(2L, status);

// lt: only update existing elements if the new score is less than the current score.
jedis.zadd("foo", 3d, "a", ZAddParams.zAddParams().lt());
assertEquals(Double.valueOf(2d), jedis.zscore("foo", "a"));
jedis.zadd("foo", 1d, "a", ZAddParams.zAddParams().lt());
assertEquals(Double.valueOf(1d), jedis.zscore("foo", "a"));

// gt: only update existing elements if the new score is greater than the current score.
jedis.zadd("foo", 0d, "b", ZAddParams.zAddParams().gt());
assertEquals(Double.valueOf(1d), jedis.zscore("foo", "b"));
jedis.zadd("foo", 2d, "b", ZAddParams.zAddParams().gt());
assertEquals(Double.valueOf(2d), jedis.zscore("foo", "b"));

// binary
jedis.del(bfoo);

Expand All @@ -111,6 +123,18 @@ public void zaddWithParams() {
// ch: return count of members not only added, but also updated
status = jedis.zadd(bfoo, binaryScoreMembers, ZAddParams.zAddParams().ch());
assertEquals(2L, status);

// lt: only update existing elements if the new score is less than the current score.
jedis.zadd(bfoo, 3d, ba, ZAddParams.zAddParams().lt());
assertEquals(Double.valueOf(2d), jedis.zscore(bfoo, ba));
jedis.zadd(bfoo, 1d, ba, ZAddParams.zAddParams().lt());
assertEquals(Double.valueOf(1d), jedis.zscore(bfoo, ba));

// gt: only update existing elements if the new score is greater than the current score.
jedis.zadd(bfoo, 0d, bb, ZAddParams.zAddParams().gt());
assertEquals(Double.valueOf(1d), jedis.zscore(bfoo, bb));
jedis.zadd(bfoo, 2d, bb, ZAddParams.zAddParams().gt());
assertEquals(Double.valueOf(2d), jedis.zscore(bfoo, bb));
}

@Test
Expand Down Expand Up @@ -568,48 +592,48 @@ public void zpopmax() {
jedis.zadd("foo", 10d, "b");
jedis.zadd("foo", 0.1d, "c");
jedis.zadd("foo", 2d, "d");

Tuple actual = jedis.zpopmax("foo");
Tuple expected = new Tuple("b", 10d);
assertEquals(expected, actual);

actual = jedis.zpopmax("foo");
expected = new Tuple("d", 2d);
assertEquals(expected, actual);

actual = jedis.zpopmax("foo");
expected = new Tuple("a", 1d);
assertEquals(expected, actual);

actual = jedis.zpopmax("foo");
expected = new Tuple("c", 0.1d);
assertEquals(expected, actual);

// Empty
actual = jedis.zpopmax("foo");
assertNull(actual);

// Binary
jedis.zadd(bfoo, 1d, ba);
jedis.zadd(bfoo, 10d, bb);
jedis.zadd(bfoo, 0.1d, bc);
jedis.zadd(bfoo, 2d, ba);

// First
actual = jedis.zpopmax(bfoo);
expected = new Tuple(bb, 10d);
assertEquals(expected, actual);

// Second
actual = jedis.zpopmax(bfoo);
expected = new Tuple(ba, 2d);
assertEquals(expected, actual);

// Third
actual = jedis.zpopmax(bfoo);
expected = new Tuple(bc, 0.1d);
assertEquals(expected, actual);

// Empty
actual = jedis.zpopmax(bfoo);
assertNull(actual);
Expand All @@ -622,35 +646,35 @@ public void zpopmaxWithCount() {
jedis.zadd("foo", 0.1d, "c");
jedis.zadd("foo", 2d, "d");
jedis.zadd("foo", 0.03, "e");

Set<Tuple> actual = jedis.zpopmax("foo", 2);
assertEquals(2, actual.size());

Set<Tuple> expected = new LinkedHashSet<Tuple>();
expected.add(new Tuple("b", 10d));
expected.add(new Tuple("d", 2d));
assertEquals(expected, actual);

actual = jedis.zpopmax("foo", 3);
assertEquals(3, actual.size());

expected.clear();
expected.add(new Tuple("a", 1d));
expected.add(new Tuple("c", 0.1d));
expected.add(new Tuple("e", 0.03d));
assertEquals(expected, actual);

// Empty
actual = jedis.zpopmax("foo", 1);
expected.clear();
assertEquals(expected, actual);

// Binary
jedis.zadd(bfoo, 1d, ba);
jedis.zadd(bfoo, 10d, bb);
jedis.zadd(bfoo, 0.1d, bc);
jedis.zadd(bfoo, 2d, ba);

// First
actual = jedis.zpopmax(bfoo, 1);
expected.clear();
Expand All @@ -662,19 +686,19 @@ public void zpopmaxWithCount() {
expected.clear();
expected.add(new Tuple(ba, 2d));
assertEquals(expected, actual);

// Last 2 (just 1, because 1 was overwritten)
actual = jedis.zpopmax(bfoo, 1);
expected.clear();
expected.add(new Tuple(bc, 0.1d));
assertEquals(expected, actual);

// Empty
actual = jedis.zpopmax(bfoo, 1);
expected.clear();
assertEquals(expected, actual);
}

@Test
public void zpopmin() {

Expand Down