diff --git a/redisson/src/main/java/org/redisson/RedissonDeque.java b/redisson/src/main/java/org/redisson/RedissonDeque.java index aaec26b20..415c35753 100644 --- a/redisson/src/main/java/org/redisson/RedissonDeque.java +++ b/redisson/src/main/java/org/redisson/RedissonDeque.java @@ -49,6 +49,26 @@ public class RedissonDeque extends RedissonQueue implements RDeque { super(codec, commandExecutor, name, redisson); } + @Override + public int addFirstIfExists(V... elements) { + return get(addFirstIfExistsAsync(elements)); + } + + @Override + public int addLastIfExists(V... elements) { + return get(addLastIfExistsAsync(elements)); + } + + @Override + public RFuture addFirstIfExistsAsync(V... elements) { + return commandExecutor.writeAsync(getName(), codec, RedisCommands.LPUSHX, getName(), encode(elements)); + } + + @Override + public RFuture addLastIfExistsAsync(V... elements) { + return commandExecutor.writeAsync(getName(), codec, RedisCommands.RPUSHX, getName(), encode(elements)); + } + @Override public void addFirst(V e) { get(addFirstAsync(e)); diff --git a/redisson/src/main/java/org/redisson/RedissonObject.java b/redisson/src/main/java/org/redisson/RedissonObject.java index 8df0ba917..56cd417a7 100644 --- a/redisson/src/main/java/org/redisson/RedissonObject.java +++ b/redisson/src/main/java/org/redisson/RedissonObject.java @@ -241,9 +241,17 @@ public abstract class RedissonObject implements RObject { public Codec getCodec() { return codec; } - + + protected List encode(Object... values) { + List result = new ArrayList<>(values.length); + for (Object object : values) { + result.add(encode(object)); + } + return result; + } + protected List encode(Collection values) { - List result = new ArrayList(values.size()); + List result = new ArrayList<>(values.size()); for (Object object : values) { result.add(encode(object)); } diff --git a/redisson/src/main/java/org/redisson/RedissonPriorityDeque.java b/redisson/src/main/java/org/redisson/RedissonPriorityDeque.java index bc5ce961a..c65dc3ea3 100644 --- a/redisson/src/main/java/org/redisson/RedissonPriorityDeque.java +++ b/redisson/src/main/java/org/redisson/RedissonPriorityDeque.java @@ -48,6 +48,22 @@ public class RedissonPriorityDeque extends RedissonPriorityQueue implement super(codec, commandExecutor, name, redisson); } + public int addFirstIfExists(V... elements) { + throw new UnsupportedOperationException("use add or put method"); + } + + public int addLastIfExists(V... elements) { + throw new UnsupportedOperationException("use add or put method"); + } + + public RFuture addFirstIfExistsAsync(V... elements) { + throw new UnsupportedOperationException("use add or put method"); + } + + public RFuture addLastIfExistsAsync(V... elements) { + throw new UnsupportedOperationException("use add or put method"); + } + public RFuture addFirstAsync(V e) { throw new UnsupportedOperationException("use add or put method"); } @@ -55,7 +71,7 @@ public class RedissonPriorityDeque extends RedissonPriorityQueue implement public RFuture addLastAsync(V e) { throw new UnsupportedOperationException("use add or put method"); } - + @Override public void addFirst(V e) { 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 a63cc9dd7..7989310b4 100644 --- a/redisson/src/main/java/org/redisson/api/RDeque.java +++ b/redisson/src/main/java/org/redisson/api/RDeque.java @@ -27,6 +27,22 @@ import java.util.List; */ public interface RDeque extends Deque, RQueue, RDequeAsync { + /** + * Adds element at the head of existing deque. + * + * @param elements - elements to add + * @return length of the list + */ + int addFirstIfExists(V... elements); + + /** + * Adds element at the tail of existing deque. + * + * @param elements - elements to add + * @return length of the list + */ + int addLastIfExists(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 7958d0710..7c56b1a98 100644 --- a/redisson/src/main/java/org/redisson/api/RDequeAsync.java +++ b/redisson/src/main/java/org/redisson/api/RDequeAsync.java @@ -26,6 +26,22 @@ import java.util.List; */ public interface RDequeAsync extends RQueueAsync { + /** + * Adds element at the head of existing deque. + * + * @param elements - elements to add + * @return length of the list + */ + RFuture addFirstIfExistsAsync(V... elements); + + /** + * Adds element at the tail of existing deque. + * + * @param elements - elements to add + * @return length of the list + */ + RFuture addLastIfExistsAsync(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 46fae3017..0f7cb1064 100644 --- a/redisson/src/main/java/org/redisson/api/RDequeReactive.java +++ b/redisson/src/main/java/org/redisson/api/RDequeReactive.java @@ -27,6 +27,22 @@ import reactor.core.publisher.Mono; */ public interface RDequeReactive extends RQueueReactive { + /** + * Adds element at the head of existing deque. + * + * @param elements - elements to add + * @return length of the list + */ + Mono addFirstIfExists(V... elements); + + /** + * Adds element at the tail of existing deque. + * + * @param elements - elements to add + * @return length of the list + */ + Mono addLastIfExists(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 9661baf9a..354651a27 100644 --- a/redisson/src/main/java/org/redisson/api/RDequeRx.java +++ b/redisson/src/main/java/org/redisson/api/RDequeRx.java @@ -29,6 +29,22 @@ import io.reactivex.Single; */ public interface RDequeRx extends RQueueRx { + /** + * Adds element at the head of existing deque. + * + * @param elements - elements to add + * @return length of the list + */ + Single addFirstIfExists(V... elements); + + /** + * Adds element at the tail of existing deque. + * + * @param elements - elements to add + * @return length of the list + */ + Single addLastIfExists(V... elements); + Flowable descendingIterator(); /** diff --git a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java index eeb5d1b1a..5d6a46969 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -230,11 +230,13 @@ public interface RedisCommands { RedisCommand RPOP = new RedisCommand("RPOP"); RedisCommand LPUSH = new RedisCommand("LPUSH", new IntegerReplayConvertor()); + RedisCommand LPUSHX = new RedisCommand("LPUSHX", new IntegerReplayConvertor()); RedisCommand LPUSH_BOOLEAN = new RedisCommand("LPUSH", new TrueReplayConvertor()); RedisStrictCommand LPUSH_VOID = new RedisStrictCommand("LPUSH", new VoidReplayConvertor()); RedisCommand> LRANGE = new RedisCommand>("LRANGE", new ObjectListReplayDecoder()); RedisCommand> LRANGE_SET = new RedisCommand>("LRANGE", new ObjectSetReplayDecoder()); RedisCommand RPUSH = new RedisCommand("RPUSH", new IntegerReplayConvertor()); + RedisCommand RPUSHX = new RedisCommand("RPUSHX", new IntegerReplayConvertor()); RedisCommand RPUSH_BOOLEAN = new RedisCommand("RPUSH", new TrueReplayConvertor()); RedisCommand RPUSH_VOID = new RedisCommand("RPUSH", new VoidReplayConvertor());