Skip to content

Commit 39b992f

Browse files
authored
support reading from last message from stream with xread (#2725)
* support reading from last message from stream with xread * recover previous formatting * add redisversion and use it in integration tests
1 parent 61c13c2 commit 39b992f

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

src/StackExchange.Redis/RedisFeatures.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ namespace StackExchange.Redis
4040
v6_0_6 = new Version(6, 0, 6),
4141
v6_2_0 = new Version(6, 2, 0),
4242
v7_0_0_rc1 = new Version(6, 9, 240), // 7.0 RC1 is version 6.9.240
43-
v7_2_0_rc1 = new Version(7, 1, 240); // 7.2 RC1 is version 7.1.240
43+
v7_2_0_rc1 = new Version(7, 1, 240), // 7.2 RC1 is version 7.1.240
44+
v7_4_0_rc1 = new Version(7, 4, 240); // 7.4 RC1 is version 7.4.240
4445

4546
private readonly Version version;
4647

tests/StackExchange.Redis.Tests/StreamTests.cs

+61
Original file line numberDiff line numberDiff line change
@@ -1511,6 +1511,24 @@ public void StreamReadEmptyStreams()
15111511
Assert.Equal(0, len2);
15121512
}
15131513

1514+
[Fact]
1515+
public void StreamReadLastMessage()
1516+
{
1517+
using var conn = Create(require: RedisFeatures.v7_4_0_rc1);
1518+
var db = conn.GetDatabase();
1519+
var key1 = Me();
1520+
1521+
// Read the entire stream from the beginning.
1522+
db.StreamRead(key1, "0-0");
1523+
db.StreamAdd(key1, "field2", "value2");
1524+
db.StreamAdd(key1, "fieldLast", "valueLast");
1525+
var entries = db.StreamRead(key1, "+");
1526+
1527+
Assert.NotNull(entries);
1528+
Assert.True(entries.Length > 0);
1529+
Assert.Equal(new[] { new NameValueEntry("fieldLast", "valueLast") }, entries[0].Values);
1530+
}
1531+
15141532
[Fact]
15151533
public void StreamReadExpectedExceptionInvalidCountMultipleStream()
15161534
{
@@ -1590,6 +1608,49 @@ public void StreamReadMultipleStreams()
15901608
Assert.Equal(id4, streams[1].Entries[1].Id);
15911609
}
15921610

1611+
[Fact]
1612+
public void StreamReadMultipleStreamsLastMessage()
1613+
{
1614+
using var conn = Create(require: RedisFeatures.v7_4_0_rc1);
1615+
1616+
var db = conn.GetDatabase();
1617+
var key1 = Me() + "a";
1618+
var key2 = Me() + "b";
1619+
1620+
var id1 = db.StreamAdd(key1, "field1", "value1");
1621+
var id2 = db.StreamAdd(key1, "field2", "value2");
1622+
var id3 = db.StreamAdd(key2, "field3", "value3");
1623+
var id4 = db.StreamAdd(key2, "field4", "value4");
1624+
1625+
var streamList = new[] { new StreamPosition(key1, "0-0"), new StreamPosition(key2, "0-0") };
1626+
db.StreamRead(streamList);
1627+
1628+
var streams = db.StreamRead(streamList);
1629+
1630+
db.StreamAdd(key1, "field5", "value5");
1631+
db.StreamAdd(key1, "field6", "value6");
1632+
db.StreamAdd(key2, "field7", "value7");
1633+
db.StreamAdd(key2, "field8", "value8");
1634+
1635+
streamList = new[] { new StreamPosition(key1, "+"), new StreamPosition(key2, "+") };
1636+
1637+
streams = db.StreamRead(streamList);
1638+
1639+
Assert.NotNull(streams);
1640+
Assert.True(streams.Length == 2);
1641+
1642+
var stream1 = streams.Where(e => e.Key == key1).First();
1643+
Assert.NotNull(stream1.Entries);
1644+
Assert.True(stream1.Entries.Length > 0);
1645+
Assert.Equal(new[] { new NameValueEntry("field6", "value6") }, stream1.Entries[0].Values);
1646+
1647+
var stream2 = streams.Where(e => e.Key == key2).First();
1648+
Assert.NotNull(stream2.Entries);
1649+
Assert.True(stream2.Entries.Length > 0);
1650+
Assert.Equal(new[] { new NameValueEntry("field8", "value8") }, stream2.Entries[0].Values);
1651+
}
1652+
1653+
15931654
[Fact]
15941655
public void StreamReadMultipleStreamsWithCount()
15951656
{

0 commit comments

Comments
 (0)