diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java index d4aa2d9cc8..354217c548 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java @@ -79,6 +79,7 @@ * @author Chris Bono * @author Vikas Garg * @author John Blum + * @author Roman Osadchuk */ @SuppressWarnings("ConstantConditions") public abstract class LettuceConverters extends Converters { @@ -720,7 +721,7 @@ public static BitFieldArgs toBitFieldArgs(BitFieldSubCommands subCommands) { args = args.overflow(type); } - args = args.incrBy(bitFieldType, (int) subCommand.getOffset().getValue(), ((BitFieldIncrBy) subCommand).getValue()); + args = args.incrBy(bitFieldType, offset, ((BitFieldIncrBy) subCommand).getValue()); } } diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java index 1d96b83a2f..d6de0e360b 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -45,6 +45,8 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.data.domain.Range; @@ -110,6 +112,7 @@ * @author Andrey Shlykov * @author Hendrik Duerkop * @author Shyngys Sapraliyev + * @author Roman Osadchuk */ public abstract class AbstractConnectionIntegrationTests { @@ -3577,6 +3580,23 @@ void bitFieldIncrByWithOverflowShouldWorkCorrectly() { assertThat(results.get(3)).isNotNull(); } + @ParameterizedTest // DATAREDIS-2903 + @ValueSource(booleans = {false, true}) + void bitFieldIncrByAndThenGetShouldWorkCorrectly(boolean isMultipliedByTypeLengthOffset) { + var offset = isMultipliedByTypeLengthOffset + ? BitFieldSubCommands.Offset.offset(300L).multipliedByTypeLength() + : BitFieldSubCommands.Offset.offset(400L); + + actual.add(connection.bitfield(KEY_1, create().incr(INT_8).valueAt(offset).by(1L))); + actual.add(connection.bitfield(KEY_1, create().get(INT_8).valueAt(offset))); + + List results = getResults(); + + assertThat(results).hasSize(2) + // should return same results after INCRBY and GET operations for bitfield with same offset + .containsExactly(List.of(1L), List.of(1L)); + } + @Test // DATAREDIS-562 void bitfieldShouldAllowMultipleSubcommands() {