diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java index 84a525cfc..f3b0c4e47 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java @@ -1019,6 +1019,7 @@ public class LettuceConnection extends AbstractRedisConnection { // INTEGER COMMAND_OUTPUT_TYPE_MAPPING.put(BITCOUNT, IntegerOutput.class); COMMAND_OUTPUT_TYPE_MAPPING.put(BITOP, IntegerOutput.class); + COMMAND_OUTPUT_TYPE_MAPPING.put(BITPOS, IntegerOutput.class); COMMAND_OUTPUT_TYPE_MAPPING.put(DBSIZE, IntegerOutput.class); COMMAND_OUTPUT_TYPE_MAPPING.put(DECR, IntegerOutput.class); COMMAND_OUTPUT_TYPE_MAPPING.put(DECRBY, IntegerOutput.class); diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveStringCommands.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveStringCommands.java index 9e4fefe61..9f2bde004 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveStringCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveStringCommands.java @@ -16,10 +16,6 @@ package org.springframework.data.redis.connection.lettuce; import io.lettuce.core.SetArgs; -import io.lettuce.core.codec.ByteArrayCodec; -import io.lettuce.core.output.IntegerOutput; -import io.lettuce.core.protocol.CommandArgs; -import io.lettuce.core.protocol.CommandType; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -36,8 +32,6 @@ import org.springframework.data.redis.connection.ReactiveRedisConnection.MultiVa import org.springframework.data.redis.connection.ReactiveRedisConnection.NumericResponse; import org.springframework.data.redis.connection.ReactiveRedisConnection.RangeCommand; import org.springframework.data.redis.connection.ReactiveStringCommands; -import org.springframework.data.redis.connection.convert.Converters; -import org.springframework.data.redis.connection.lettuce.LettuceReactiveRedisConnection.ByteBufferCodec; import org.springframework.util.Assert; /** @@ -383,17 +377,20 @@ class LettuceReactiveStringCommands implements ReactiveStringCommands { return Flux.from(commands).flatMap(command -> { - Mono result = cmd.bitpos(command.getKey(), command.getBit()); + Mono result; + Range range = command.getRange(); - if (command.getRange().getLowerBound().isBounded()) { + if (range.getLowerBound().isBounded()) { - result = cmd.bitpos(command.getKey(), command.getBit(), command.getRange().getLowerBound().getValue().get()); + result = cmd.bitpos(command.getKey(), command.getBit(), getLowerValue(range)); - if (command.getRange().getUpperBound().isBounded()) { - result = cmd.bitpos(command.getKey(), command.getBit(), command.getRange().getLowerBound().getValue().get(), - command.getRange().getUpperBound().getValue().get()); + if (range.getUpperBound().isBounded()) { + result = cmd.bitpos(command.getKey(), command.getBit(), getLowerValue(range), getUpperValue(range)); } + } else { + result = cmd.bitpos(command.getKey(), command.getBit()); } + return result.map(respValue -> new NumericResponse<>(command, respValue)); }); }); @@ -417,4 +414,14 @@ class LettuceReactiveStringCommands implements ReactiveStringCommands { protected LettuceReactiveRedisConnection getConnection() { return connection; } + + private static > T getUpperValue(Range range) { + return range.getUpperBound().getValue() + .orElseThrow(() -> new IllegalArgumentException("Range does not contain upper bound value!")); + } + + private static > T getLowerValue(Range range) { + return range.getLowerBound().getValue() + .orElseThrow(() -> new IllegalArgumentException("Range does not contain lower bound value!")); + } } diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceStringCommands.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceStringCommands.java index c92b86367..46c571187 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceStringCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceStringCommands.java @@ -684,34 +684,32 @@ class LettuceStringCommands implements RedisStringCommands { if (isPipelined() || isQueueing()) { RedisFuture futureResult; + RedisClusterAsyncCommands connection = getAsyncConnection(); + if (range.getLowerBound().isBounded()) { if (range.getUpperBound().isBounded()) { - futureResult = getAsyncConnection().bitpos(key, bit, range.getLowerBound().getValue().get(), - range.getUpperBound().getValue().get()); + futureResult = connection.bitpos(key, bit, getLowerValue(range), getUpperValue(range)); } else { - - futureResult = getAsyncConnection().bitpos(key, bit, range.getLowerBound().getValue().get()); + futureResult = connection.bitpos(key, bit, getLowerValue(range)); } - } else { - futureResult = getAsyncConnection().bitpos(key, bit); + futureResult = connection.bitpos(key, bit); } if (isPipelined()) { - pipeline(connection.newLettuceResult(futureResult)); + pipeline(this.connection.newLettuceResult(futureResult)); } else if (isQueueing()) { - transaction(connection.newLettuceResult(futureResult)); + transaction(this.connection.newLettuceResult(futureResult)); } return null; } if (range.getLowerBound().isBounded()) { if (range.getUpperBound().isBounded()) { - return getConnection().bitpos(key, bit, range.getLowerBound().getValue().get(), - range.getUpperBound().getValue().get()); + return getConnection().bitpos(key, bit, getLowerValue(range), getUpperValue(range)); } - return getConnection().bitpos(key, bit, range.getLowerBound().getValue().get()); + return getConnection().bitpos(key, bit, getLowerValue(range)); } return getConnection().bitpos(key, bit); @@ -771,4 +769,14 @@ class LettuceStringCommands implements RedisStringCommands { private DataAccessException convertLettuceAccessException(Exception ex) { return connection.convertLettuceAccessException(ex); } + + private static > T getUpperValue(Range range) { + return range.getUpperBound().getValue() + .orElseThrow(() -> new IllegalArgumentException("Range does not contain upper bound value!")); + } + + private static > T getLowerValue(Range range) { + return range.getLowerBound().getValue() + .orElseThrow(() -> new IllegalArgumentException("Range does not contain lower bound value!")); + } } diff --git a/src/main/java/org/springframework/data/redis/core/RedisCommand.java b/src/main/java/org/springframework/data/redis/core/RedisCommand.java index 987891798..6c51c596b 100644 --- a/src/main/java/org/springframework/data/redis/core/RedisCommand.java +++ b/src/main/java/org/springframework/data/redis/core/RedisCommand.java @@ -41,7 +41,7 @@ public enum RedisCommand { BGSAVE("r", 0, 0), // BITCOUNT("r", 1, 3), // BITOP("rw", 3), // - BITPOS("r", 2), // + BITPOS("r", 2, 4), // BLPOP("rw", 2), // BRPOP("rw", 2), // BRPOPLPUSH("rw", 3), //