From 9a7eb2ea14e4104984bb03d58d1a0dfc84e05636 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Wed, 1 Sep 2021 15:35:14 +0300 Subject: [PATCH] Feature - added addLast() and addFirst() methods to RDeque, RDequeRx and RDequeReactive objects #3797 --- .../main/java/org/redisson/RedissonDeque.java | 26 +++++++++++++++++++ .../org/redisson/RedissonPriorityDeque.java | 20 ++++++++++++++ .../main/java/org/redisson/api/RDeque.java | 16 ++++++++++++ .../java/org/redisson/api/RDequeAsync.java | 16 ++++++++++++ .../java/org/redisson/api/RDequeReactive.java | 16 ++++++++++++ .../main/java/org/redisson/api/RDequeRx.java | 16 ++++++++++++ .../java/org/redisson/RedissonDequeTest.java | 10 +++++++ 7 files changed, 120 insertions(+) diff --git a/redisson/src/main/java/org/redisson/RedissonDeque.java b/redisson/src/main/java/org/redisson/RedissonDeque.java index 1354f3a99..08437c8c1 100644 --- a/redisson/src/main/java/org/redisson/RedissonDeque.java +++ b/redisson/src/main/java/org/redisson/RedissonDeque.java @@ -59,6 +59,32 @@ public class RedissonDeque extends RedissonQueue implements RDeque { return get(addLastIfExistsAsync(elements)); } + @Override + public int addFirst(V... elements) { + return get(addFirstAsync(elements)); + } + + @Override + public int addLast(V... elements) { + return get(addLastAsync(elements)); + } + + @Override + public RFuture addFirstAsync(V... elements) { + List args = new ArrayList<>(elements.length + 1); + args.add(getRawName()); + encode(args, Arrays.asList(elements)); + return commandExecutor.writeAsync(getRawName(), codec, RedisCommands.LPUSH, args.toArray()); + } + + @Override + public RFuture addLastAsync(V... elements) { + List args = new ArrayList<>(elements.length + 1); + args.add(getRawName()); + encode(args, Arrays.asList(elements)); + return commandExecutor.writeAsync(getRawName(), codec, RedisCommands.RPUSH, args.toArray()); + } + @Override public RFuture addFirstIfExistsAsync(V... elements) { List args = new ArrayList<>(elements.length + 1); diff --git a/redisson/src/main/java/org/redisson/RedissonPriorityDeque.java b/redisson/src/main/java/org/redisson/RedissonPriorityDeque.java index a68a086f3..24dc35f54 100644 --- a/redisson/src/main/java/org/redisson/RedissonPriorityDeque.java +++ b/redisson/src/main/java/org/redisson/RedissonPriorityDeque.java @@ -61,6 +61,26 @@ public class RedissonPriorityDeque extends RedissonPriorityQueue implement throw new UnsupportedOperationException("use add or put method"); } + @Override + public int addFirst(V... elements) { + throw new UnsupportedOperationException("use add or put method"); + } + + @Override + public int addLast(V... elements) { + throw new UnsupportedOperationException("use add or put method"); + } + + @Override + public RFuture addFirstAsync(V... elements) { + throw new UnsupportedOperationException("use add or put method"); + } + + @Override + public RFuture addLastAsync(V... elements) { + throw new UnsupportedOperationException("use add or put method"); + } + @Override public RFuture addFirstIfExistsAsync(V... elements) { throw new UnsupportedOperationException("use add or put method"); diff --git a/redisson/src/main/java/org/redisson/api/RDeque.java b/redisson/src/main/java/org/redisson/api/RDeque.java index 0a24a3335..a644fb75c 100644 --- a/redisson/src/main/java/org/redisson/api/RDeque.java +++ b/redisson/src/main/java/org/redisson/api/RDeque.java @@ -37,6 +37,14 @@ public interface RDeque extends Deque, RQueue, RDequeAsync { */ int addFirstIfExists(V... elements); + /** + * Adds elements at the head of deque. + * + * @param elements - elements to add + * @return length of the deque + */ + int addFirst(V... elements); + /** * Adds element at the tail of existing deque. * @@ -45,6 +53,14 @@ public interface RDeque extends Deque, RQueue, RDequeAsync { */ int addLastIfExists(V... elements); + /** + * Adds elements at the tail of deque. + * + * @param elements - elements to add + * @return length of the deque + */ + int addLast(V... elements); + /** * Retrieves and removes the tail elements of this queue. * Elements amount limited by limit param. diff --git a/redisson/src/main/java/org/redisson/api/RDequeAsync.java b/redisson/src/main/java/org/redisson/api/RDequeAsync.java index 20b79f8bf..5711afe19 100644 --- a/redisson/src/main/java/org/redisson/api/RDequeAsync.java +++ b/redisson/src/main/java/org/redisson/api/RDequeAsync.java @@ -36,6 +36,14 @@ public interface RDequeAsync extends RQueueAsync { */ RFuture addFirstIfExistsAsync(V... elements); + /** + * Adds elements at the head of deque. + * + * @param elements - elements to add + * @return length of the deque + */ + RFuture addFirstAsync(V... elements); + /** * Adds element at the tail of existing deque. * @@ -44,6 +52,14 @@ public interface RDequeAsync extends RQueueAsync { */ RFuture addLastIfExistsAsync(V... elements); + /** + * Adds elements at the tail of deque. + * + * @param elements - elements to add + * @return length of the deque + */ + RFuture addLastAsync(V... elements); + /** * Removes last occurrence of element o * diff --git a/redisson/src/main/java/org/redisson/api/RDequeReactive.java b/redisson/src/main/java/org/redisson/api/RDequeReactive.java index 7e260d8b3..b80dc3997 100644 --- a/redisson/src/main/java/org/redisson/api/RDequeReactive.java +++ b/redisson/src/main/java/org/redisson/api/RDequeReactive.java @@ -44,6 +44,22 @@ public interface RDequeReactive extends RQueueReactive { */ Mono addLastIfExists(V... elements); + /** + * Adds elements at the head of deque. + * + * @param elements - elements to add + * @return length of the deque + */ + Mono addFirst(V... elements); + + /** + * Adds elements at the tail of deque. + * + * @param elements - elements to add + * @return length of the deque + */ + Mono addLast(V... elements); + Flux descendingIterator(); /** diff --git a/redisson/src/main/java/org/redisson/api/RDequeRx.java b/redisson/src/main/java/org/redisson/api/RDequeRx.java index 2dcabeee7..8ee754d86 100644 --- a/redisson/src/main/java/org/redisson/api/RDequeRx.java +++ b/redisson/src/main/java/org/redisson/api/RDequeRx.java @@ -46,6 +46,22 @@ public interface RDequeRx extends RQueueRx { */ Single addLastIfExists(V... elements); + /** + * Adds elements at the head of deque. + * + * @param elements - elements to add + * @return length of the deque + */ + Single addFirst(V... elements); + + /** + * Adds elements at the tail of deque. + * + * @param elements - elements to add + * @return length of the deque + */ + Single addLast(V... elements); + Flowable descendingIterator(); /** diff --git a/redisson/src/test/java/org/redisson/RedissonDequeTest.java b/redisson/src/test/java/org/redisson/RedissonDequeTest.java index 659f9ed7e..d770ab9e7 100644 --- a/redisson/src/test/java/org/redisson/RedissonDequeTest.java +++ b/redisson/src/test/java/org/redisson/RedissonDequeTest.java @@ -140,6 +140,16 @@ public class RedissonDequeTest extends BaseTest { assertThat(queue).containsExactly(3, 2, 1); } + @Test + public void testAddFirstLastMulti() { + RDeque queue = redisson.getDeque("deque"); + queue.addAll(Arrays.asList(1, 2, 3, 4)); + queue.addFirst(0, 1, 0); + queue.addLast(10, 20, 10); + + assertThat(queue).containsExactly(0, 1, 0, 1, 2, 3, 4, 10, 20, 10); + } + @Test public void testAddFirst() { RDeque queue = redisson.getDeque("deque");