Skip to content

Commit b1b0d29

Browse files
committed
add minId overloads
1 parent 1a4c66d commit b1b0d29

File tree

10 files changed

+71
-1
lines changed

10 files changed

+71
-1
lines changed

src/StackExchange.Redis/Interfaces/IDatabase.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2775,6 +2775,16 @@ IEnumerable<SortedSetEntry> SortedSetScan(
27752775
/// <remarks><seealso href="https://redis.io/topics/streams-intro"/></remarks>
27762776
long StreamTrim(RedisKey key, int maxLength, bool useApproximateMaxLength = false, CommandFlags flags = CommandFlags.None);
27772777

2778+
/// <summary>
2779+
/// Trim the stream to a specified minimum timestamp.
2780+
/// </summary>
2781+
/// <param name="key">The key of the stream.</param>
2782+
/// <param name="minId">All entries less than minId will be removed.</param>
2783+
/// <param name="flags">The flags to use for this operation.</param>
2784+
/// <returns>The number of messages removed from the stream.</returns>
2785+
/// <remarks><seealso href="https://redis.io/topics/streams-intro"/></remarks>
2786+
long StreamTrim(RedisKey key, RedisValue minId, CommandFlags flags);
2787+
27782788
/// <summary>
27792789
/// If key already exists and is a string, this command appends the value at the end of the string.
27802790
/// If key does not exist it is created and set as an empty string, so APPEND will be similar to SET in this special case.

src/StackExchange.Redis/Interfaces/IDatabaseAsync.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,9 @@ IAsyncEnumerable<SortedSetEntry> SortedSetScanAsync(
672672
/// <inheritdoc cref="IDatabase.StreamTrim(RedisKey, int, bool, CommandFlags)"/>
673673
Task<long> StreamTrimAsync(RedisKey key, int maxLength, bool useApproximateMaxLength = false, CommandFlags flags = CommandFlags.None);
674674

675+
/// <inheritdoc cref="IDatabase.StreamTrim(RedisKey, RedisValue, CommandFlags)"/>
676+
Task<long> StreamTrimAsync(RedisKey key, RedisValue minId, CommandFlags flags);
677+
675678
/// <inheritdoc cref="IDatabase.StringAppend(RedisKey, RedisValue, CommandFlags)"/>
676679
Task<long> StringAppendAsync(RedisKey key, RedisValue value, CommandFlags flags = CommandFlags.None);
677680

src/StackExchange.Redis/KeyspaceIsolation/KeyPrefixed.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,9 @@ public Task<RedisStream[]> StreamReadGroupAsync(StreamPosition[] streamPositions
642642
public Task<long> StreamTrimAsync(RedisKey key, int maxLength, bool useApproximateMaxLength = false, CommandFlags flags = CommandFlags.None) =>
643643
Inner.StreamTrimAsync(ToInner(key), maxLength, useApproximateMaxLength, flags);
644644

645+
public Task<long> StreamTrimAsync(RedisKey key, RedisValue minId, CommandFlags flags) =>
646+
Inner.StreamTrimAsync(ToInner(key), minId, flags);
647+
645648
public Task<long> StringAppendAsync(RedisKey key, RedisValue value, CommandFlags flags = CommandFlags.None) =>
646649
Inner.StringAppendAsync(ToInner(key), value, flags);
647650

src/StackExchange.Redis/KeyspaceIsolation/KeyPrefixedDatabase.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,9 @@ public RedisStream[] StreamReadGroup(StreamPosition[] streamPositions, RedisValu
624624
public long StreamTrim(RedisKey key, int maxLength, bool useApproximateMaxLength = false, CommandFlags flags = CommandFlags.None) =>
625625
Inner.StreamTrim(ToInner(key), maxLength, useApproximateMaxLength, flags);
626626

627+
public long StreamTrim(RedisKey key, RedisValue minId, CommandFlags flags) =>
628+
Inner.StreamTrim(ToInner(key), minId, flags);
629+
627630
public long StringAppend(RedisKey key, RedisValue value, CommandFlags flags = CommandFlags.None) =>
628631
Inner.StringAppend(ToInner(key), value, flags);
629632

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
#nullable enable
1+
#nullable enable
2+
StackExchange.Redis.IDatabase.StreamTrim(StackExchange.Redis.RedisKey key, StackExchange.Redis.RedisValue minId, StackExchange.Redis.CommandFlags flags) -> long
3+
StackExchange.Redis.IDatabaseAsync.StreamTrimAsync(StackExchange.Redis.RedisKey key, StackExchange.Redis.RedisValue minId, StackExchange.Redis.CommandFlags flags) -> System.Threading.Tasks.Task<long>!

src/StackExchange.Redis/RedisDatabase.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3007,6 +3007,20 @@ public Task<long> StreamTrimAsync(RedisKey key, int maxLength, bool useApproxima
30073007
return ExecuteAsync(msg, ResultProcessor.Int64);
30083008
}
30093009

3010+
public long StreamTrim(RedisKey key, RedisValue minId, CommandFlags flags = CommandFlags.None)
3011+
{
3012+
var values = new[] { StreamConstants.MinId, minId };
3013+
var msg = Message.Create(Database, flags, RedisCommand.XTRIM, key, values);
3014+
return ExecuteSync(msg, ResultProcessor.Int64);
3015+
}
3016+
3017+
public Task<long> StreamTrimAsync(RedisKey key, RedisValue minId, CommandFlags flags = CommandFlags.None)
3018+
{
3019+
var values = new[] { StreamConstants.MinId, minId };
3020+
var msg = Message.Create(Database, flags, RedisCommand.XTRIM, key, values);
3021+
return ExecuteAsync(msg, ResultProcessor.Int64);
3022+
}
3023+
30103024
public long StringAppend(RedisKey key, RedisValue value, CommandFlags flags = CommandFlags.None)
30113025
{
30123026
var msg = Message.Create(Database, flags, RedisCommand.APPEND, key, value);

src/StackExchange.Redis/StreamConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ internal static class StreamConstants
5959
internal static readonly RedisValue SetId = "SETID";
6060

6161
internal static readonly RedisValue MaxLen = "MAXLEN";
62+
internal static readonly RedisValue MinId = "MINID";
6263

6364
internal static readonly RedisValue MkStream = "MKSTREAM";
6465

tests/StackExchange.Redis.Tests/KeyPrefixedDatabaseTests.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,6 +1202,13 @@ public void StreamTrim()
12021202
mock.Received().StreamTrim("prefix:key", 1000, true, CommandFlags.None);
12031203
}
12041204

1205+
[Fact]
1206+
public void StreamTrimMinId()
1207+
{
1208+
prefixed.StreamTrim("key", 1111111111, CommandFlags.None);
1209+
mock.Received().StreamTrim("prefix:key", 1111111111, CommandFlags.None);
1210+
}
1211+
12051212
[Fact]
12061213
public void StringAppend()
12071214
{

tests/StackExchange.Redis.Tests/KeyPrefixedTests.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,6 +1118,13 @@ public async Task StreamTrimAsync()
11181118
await mock.Received().StreamTrimAsync("prefix:key", 1000, true, CommandFlags.None);
11191119
}
11201120

1121+
[Fact]
1122+
public async Task StreamTrimMinIdAsync()
1123+
{
1124+
await prefixed.StreamTrimAsync("key", 1111111111, CommandFlags.None);
1125+
await mock.Received().StreamTrimAsync("prefix:key", 1111111111, CommandFlags.None);
1126+
}
1127+
11211128
[Fact]
11221129
public async Task StringAppendAsync()
11231130
{

tests/StackExchange.Redis.Tests/StreamTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1916,6 +1916,26 @@ public void StreamTrimLength()
19161916
Assert.Equal(1, len);
19171917
}
19181918

1919+
[Fact]
1920+
public void StreamTrimMinId()
1921+
{
1922+
using var conn = Create(require: RedisFeatures.v5_0_0);
1923+
1924+
var db = conn.GetDatabase();
1925+
var key = Me();
1926+
1927+
// Add a couple items and check length.
1928+
db.StreamAdd(key, "field1", "value1", 1111111110);
1929+
db.StreamAdd(key, "field2", "value2", 1111111111);
1930+
db.StreamAdd(key, "field3", "value3", 1111111112);
1931+
1932+
var numRemoved = db.StreamTrim(key, 1111111111, CommandFlags.None);
1933+
var len = db.StreamLength(key);
1934+
1935+
Assert.Equal(2, numRemoved);
1936+
Assert.Equal(1, len);
1937+
}
1938+
19191939
[Fact]
19201940
public void StreamVerifyLength()
19211941
{

0 commit comments

Comments
 (0)