From 820831f78dc5e9e6d471ccbb177c0a24b31e54b8 Mon Sep 17 00:00:00 2001 From: dengliming Date: Tue, 9 Mar 2021 22:08:25 +0800 Subject: [PATCH] Add support for ZADD GT/LT options --- .../clients/jedis/params/ZAddParams.java | 26 ++++++++ .../tests/commands/SortedSetCommandsTest.java | 64 +++++++++++++------ 2 files changed, 70 insertions(+), 20 deletions(-) diff --git a/src/main/java/redis/clients/jedis/params/ZAddParams.java b/src/main/java/redis/clients/jedis/params/ZAddParams.java index f59a449ee2..2838fae630 100644 --- a/src/main/java/redis/clients/jedis/params/ZAddParams.java +++ b/src/main/java/redis/clients/jedis/params/ZAddParams.java @@ -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() { } @@ -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 byteParams = new ArrayList<>(); byteParams.add(key); @@ -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); diff --git a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java index 694f0a438e..e0560f90bf 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java @@ -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); @@ -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 @@ -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); @@ -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 actual = jedis.zpopmax("foo", 2); assertEquals(2, actual.size()); - + Set expected = new LinkedHashSet(); 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(); @@ -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() {