diff --git a/src/main/java/org/springframework/data/redis/connection/ReactiveStreamCommands.java b/src/main/java/org/springframework/data/redis/connection/ReactiveStreamCommands.java index 2abf8ee14..7f90a7912 100644 --- a/src/main/java/org/springframework/data/redis/connection/ReactiveStreamCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/ReactiveStreamCommands.java @@ -57,6 +57,7 @@ import org.springframework.util.StringUtils; * @author Mark Paluch * @author Christoph Strobl * @author Tugdual Grall + * @author Dengliming * @since 2.2 */ public interface ReactiveStreamCommands { @@ -1402,10 +1403,30 @@ public interface ReactiveStreamCommands { * properties. * * @param count - * @param approximateTrimming * @return a new {@link TrimCommand} with {@literal count} applied. */ - public TrimCommand to(long count, boolean approximateTrimming) { + public TrimCommand to(long count) { + return new TrimCommand(getKey(), count, approximateTrimming); + } + + /** + * Applies approximate trimming. Constructs a new command instance with all previously configured properties. + * + * @return a new {@link TrimCommand} with {@literal approximateTrimming} applied. + * @since 2.4 + */ + public TrimCommand approximate() { + return approximate(true); + } + + /** + * Applies {@code approximateTrimming}. Constructs a new command instance with all previously configured properties. + * + * @param approximateTrimming + * @return a new {@link TrimCommand} with {@literal approximateTrimming} applied. + * @since 2.4 + */ + public TrimCommand approximate(boolean approximateTrimming) { return new TrimCommand(getKey(), count, approximateTrimming); } @@ -1441,13 +1462,15 @@ public interface ReactiveStreamCommands { * @param count length of the stream. * @param approximateTrimming the trimming must be performed in a approximated way in order to maximize performances. * @return {@link Mono} emitting the number of removed entries. + * @since 2.4 * @see Redis Documentation: XTRIM */ default Mono xTrim(ByteBuffer key, long count, boolean approximateTrimming) { Assert.notNull(key, "Key must not be null!"); - return xTrim(Mono.just(TrimCommand.stream(key).to(count, approximateTrimming))).next().map(NumericResponse::getOutput); + return xTrim(Mono.just(TrimCommand.stream(key).to(count).approximate(approximateTrimming))).next() + .map(NumericResponse::getOutput); } /** diff --git a/src/main/java/org/springframework/data/redis/connection/RedisStreamCommands.java b/src/main/java/org/springframework/data/redis/connection/RedisStreamCommands.java index f3d9270ad..016b1f575 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisStreamCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisStreamCommands.java @@ -40,6 +40,7 @@ import org.springframework.util.StringUtils; * @author Mark Paluch * @author Christoph Strobl * @author Tugdual Grall + * @author Dengliming * @see Redis Documentation - Streams * @since 2.2 */ @@ -136,7 +137,7 @@ public interface RedisStreamCommands { /** * Limit the size of the stream to the given maximum number of elements. - * + * * @return new instance of {@link XAddOptions}. */ public static XAddOptions maxlen(long maxlen) { @@ -145,7 +146,7 @@ public interface RedisStreamCommands { /** * Limit the size of the stream to the given maximum number of elements. - * + * * @return can be {@literal null}. */ @Nullable @@ -513,7 +514,7 @@ public interface RedisStreamCommands { /** * Obtain general information about the stream stored at the specified {@literal key}. - * + * * @param key the {@literal key} the stream is stored at. * @return {@literal null} when used in pipeline / transaction. * @since 2.3 @@ -881,6 +882,7 @@ public interface RedisStreamCommands { * @param count length of the stream. * @param approximateTrimming the trimming must be performed in a approximated way in order to maximize performances. * @return number of removed entries. {@literal null} when used in pipeline / transaction. + * @since 2.4 * @see Redis Documentation: XTRIM */ @Nullable diff --git a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java index 5fbae0dcd..7730abbeb 100644 --- a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java @@ -62,6 +62,7 @@ import org.springframework.util.CollectionUtils; * @author Mark Paluch * @author Ninad Divadkar * @author Tugdual Grall + * @author Dengliming * @see RedisCallback * @see RedisSerializer * @see StringRedisTemplate @@ -2467,7 +2468,7 @@ public interface StringRedisConnection extends RedisConnection { * @param count length of the stream. * @param approximateTrimming the trimming must be performed in a approximated way in order to maximize performances. * @return number of removed entries. {@literal null} when used in pipeline / transaction. - * @since 2.2 + * @since 2.4 * @see Redis Documentation: XTRIM */ @Nullable diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveStreamCommands.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveStreamCommands.java index b0d7f6b56..77a4fb308 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveStreamCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveStreamCommands.java @@ -54,6 +54,7 @@ import org.springframework.util.Assert; * * @author Mark Paluch * @author Tugdual Grall + * @author Dengliming * @since 2.2 */ class LettuceReactiveStreamCommands implements ReactiveStreamCommands { diff --git a/src/main/java/org/springframework/data/redis/core/BoundStreamOperations.java b/src/main/java/org/springframework/data/redis/core/BoundStreamOperations.java index 55f0d8353..03e576b25 100644 --- a/src/main/java/org/springframework/data/redis/core/BoundStreamOperations.java +++ b/src/main/java/org/springframework/data/redis/core/BoundStreamOperations.java @@ -19,12 +19,12 @@ import java.util.List; import java.util.Map; import org.springframework.data.domain.Range; +import org.springframework.data.redis.connection.RedisZSetCommands.Limit; import org.springframework.data.redis.connection.stream.Consumer; import org.springframework.data.redis.connection.stream.MapRecord; import org.springframework.data.redis.connection.stream.ReadOffset; import org.springframework.data.redis.connection.stream.RecordId; import org.springframework.data.redis.connection.stream.StreamReadOptions; -import org.springframework.data.redis.connection.RedisZSetCommands.Limit; import org.springframework.lang.Nullable; /** @@ -32,6 +32,7 @@ import org.springframework.lang.Nullable; * * @author Mark Paluch * @author Christoph Strobl + * @author Dengliming * @since 2.2 */ public interface BoundStreamOperations { @@ -215,6 +216,7 @@ public interface BoundStreamOperations { * @param count length of the stream. * @param approximateTrimming the trimming must be performed in a approximated way in order to maximize performances. * @return number of removed entries. {@literal null} when used in pipeline / transaction. + * @since 2.4 * @see Redis Documentation: XTRIM */ @Nullable diff --git a/src/main/java/org/springframework/data/redis/core/ReactiveStreamOperations.java b/src/main/java/org/springframework/data/redis/core/ReactiveStreamOperations.java index aa4280edb..509b2e26c 100644 --- a/src/main/java/org/springframework/data/redis/core/ReactiveStreamOperations.java +++ b/src/main/java/org/springframework/data/redis/core/ReactiveStreamOperations.java @@ -37,6 +37,7 @@ import org.springframework.util.Assert; * * @author Mark Paluch * @author Christoph Strobl + * @author Dengliming * @since 2.2 */ public interface ReactiveStreamOperations extends HashMapperProvider { @@ -551,6 +552,7 @@ public interface ReactiveStreamOperations extends HashMapperProvider< * @param count length of the stream. * @param approximateTrimming the trimming must be performed in a approximated way in order to maximize performances. * @return number of removed entries. + * @since 2.4 * @see Redis Documentation: XTRIM */ Mono trim(K key, long count, boolean approximateTrimming); diff --git a/src/main/java/org/springframework/data/redis/core/StreamOperations.java b/src/main/java/org/springframework/data/redis/core/StreamOperations.java index 9bff7be82..c2a2e1c53 100644 --- a/src/main/java/org/springframework/data/redis/core/StreamOperations.java +++ b/src/main/java/org/springframework/data/redis/core/StreamOperations.java @@ -36,6 +36,7 @@ import org.springframework.util.Assert; * * @author Mark Paluch * @author Christoph Strobl + * @author Dengliming * @since 2.2 */ public interface StreamOperations extends HashMapperProvider { @@ -532,6 +533,7 @@ public interface StreamOperations extends HashMapperProvider * @param count length of the stream. * @param approximateTrimming the trimming must be performed in a approximated way in order to maximize performances. * @return number of removed entries. {@literal null} when used in pipeline / transaction. + * @since 2.4 * @see Redis Documentation: XTRIM */ @Nullable diff --git a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java index 4075d70d6..3883607fd 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java @@ -30,7 +30,6 @@ import java.util.Properties; import java.util.Set; import java.util.concurrent.TimeUnit; -import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -122,7 +121,6 @@ public class DefaultStringRedisConnectionTests { MockitoAnnotations.initMocks(this); -// this.nativeConnection = mock(RedisConnection.class, withSettings().verboseLogging()); this.nativeConnection = mock(RedisConnection.class); this.connection = new DefaultStringRedisConnection(nativeConnection); bytesMap.put(fooBytes, barBytes); @@ -2052,7 +2050,7 @@ public class DefaultStringRedisConnectionTests { doReturn(1L).when(nativeConnection).xAck(any(byte[].class), any(String.class), eq(RecordId.of("1-1"))); actual.add(connection.xAck("key", "group", RecordId.of("1-1"))); - Assertions.assertThat(getResults()).containsExactly(1L); + assertThat(getResults()).containsExactly(1L); } @Test // DATAREDIS-864, DATAREDIS-1122 @@ -2062,7 +2060,7 @@ public class DefaultStringRedisConnectionTests { actual.add(connection .xAdd(StreamRecords.newRecord().in("stream-1").ofStrings(Collections.singletonMap("field", "value")))); - Assertions.assertThat(getResults()).containsExactly(RecordId.of("1-1")); + assertThat(getResults()).containsExactly(RecordId.of("1-1")); } @Test // DATAREDIS-864 @@ -2071,7 +2069,7 @@ public class DefaultStringRedisConnectionTests { doReturn(1L).when(nativeConnection).xDel(any(byte[].class), eq(RecordId.of("1-1"))); actual.add(connection.xDel("key", RecordId.of("1-1"))); - Assertions.assertThat(getResults()).containsExactly(1L); + assertThat(getResults()).containsExactly(1L); } @Test // DATAREDIS-864 @@ -2080,7 +2078,7 @@ public class DefaultStringRedisConnectionTests { doReturn("OK").when(nativeConnection).xGroupCreate(any(), any(), any()); actual.add(connection.xGroupCreate("key", ReadOffset.latest(), "consumer-group")); - Assertions.assertThat(getResults()).containsExactly("OK"); + assertThat(getResults()).containsExactly("OK"); } @Test // DATAREDIS-864 @@ -2092,7 +2090,7 @@ public class DefaultStringRedisConnectionTests { doReturn(Boolean.TRUE).when(nativeConnection).xGroupDelConsumer(eq(fooBytes), eq(consumer)); actual.add(connection.xGroupDelConsumer(foo, consumer)); - Assertions.assertThat(getResults()).containsExactly(Boolean.TRUE); + assertThat(getResults()).containsExactly(Boolean.TRUE); } @Test // DATAREDIS-864 @@ -2101,7 +2099,7 @@ public class DefaultStringRedisConnectionTests { doReturn(Boolean.TRUE).when(nativeConnection).xGroupDestroy(any(), any()); actual.add(connection.xGroupDestroy("key", "comsumer-group")); - Assertions.assertThat(getResults()).containsExactly(Boolean.TRUE); + assertThat(getResults()).containsExactly(Boolean.TRUE); } @Test // DATAREDIS-864 @@ -2110,7 +2108,7 @@ public class DefaultStringRedisConnectionTests { doReturn(1L).when(nativeConnection).xLen(any()); actual.add(connection.xLen("key")); - Assertions.assertThat(getResults()).containsExactly(1L); + assertThat(getResults()).containsExactly(1L); } @Test // DATAREDIS-864 @@ -2121,7 +2119,7 @@ public class DefaultStringRedisConnectionTests { actual.add(connection.xRange("stream-1", org.springframework.data.domain.Range.unbounded(), Limit.unlimited())); - Assertions.assertThat(getResults()).containsExactly( + assertThat(getResults()).containsExactly( Collections.singletonList(StreamRecords.newRecord().in(bar2).withId("stream-1").ofStrings(stringMap))); } @@ -2133,7 +2131,7 @@ public class DefaultStringRedisConnectionTests { .when(nativeConnection).xRead(any(), any()); actual.add(connection.xReadAsString(StreamReadOptions.empty(), StreamOffset.create("stream-1", ReadOffset.latest()))); - Assertions.assertThat(getResults()).containsExactly( + assertThat(getResults()).containsExactly( Collections.singletonList(StreamRecords.newRecord().in(bar2).withId("stream-1").ofStrings(stringMap))); } @@ -2144,7 +2142,7 @@ public class DefaultStringRedisConnectionTests { .when(nativeConnection).xReadGroup(any(), any(), any()); actual.add(connection.xReadGroupAsString(Consumer.from("groupe", "one"), StreamReadOptions.empty(), StreamOffset.create("stream-1", ReadOffset.latest()))); - Assertions.assertThat(getResults()).containsExactly( + assertThat(getResults()).containsExactly( Collections.singletonList(StreamRecords.newRecord().in(bar2).withId("stream-1").ofStrings(stringMap))); } @@ -2156,26 +2154,26 @@ public class DefaultStringRedisConnectionTests { actual.add(connection.xRevRange("stream-1", org.springframework.data.domain.Range.unbounded(), Limit.unlimited())); - Assertions.assertThat(getResults()).containsExactly( + assertThat(getResults()).containsExactly( Collections.singletonList(StreamRecords.newRecord().in(bar2).withId("stream-1").ofStrings(stringMap))); } @Test // DATAREDIS-864 public void xTrimShouldDelegateAndConvertCorrectly() { - doReturn(1L).when(nativeConnection).xTrim(any(), anyLong()); + doReturn(1L).when(nativeConnection).xTrim(any(), anyLong(), eq(false)); actual.add(connection.xTrim("key", 2L)); - Assertions.assertThat(getResults()).containsExactly(1L); + assertThat(getResults()).containsExactly(1L); } - @Test + @Test // DATAREDIS-1085 public void xTrimApproximateShouldDelegateAndConvertCorrectly() { doReturn(1L).when(nativeConnection).xTrim(any(), anyLong(), anyBoolean()); actual.add(connection.xTrim("key", 2L, true)); - Assertions.assertThat(getResults()).containsExactly(1L); + assertThat(getResults()).containsExactly(1L); } protected List getResults() {