Universley.OrleansContrib.S.../Provider/RedisStreamSequenceToken.cs
Samson Amaugo 8f54e0b69a done
2024-06-26 16:50:33 +01:00

53 lines
1.7 KiB
C#

using Orleans;
using Orleans.Streams;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Provider
{
[GenerateSerializer]
internal class RedisStreamSequenceToken : StreamSequenceToken
{
[Id(0)]
public override long SequenceNumber { get; protected set; }
[Id(1)]
public override int EventIndex { get ; protected set ; }
public RedisStreamSequenceToken(RedisValue id)
{
var split = id.ToString().Split("-");
SequenceNumber = long.Parse(split[0]);
EventIndex = int.Parse(split[1]);
}
public RedisStreamSequenceToken(long sequenceNumber, int eventIndex)
{
SequenceNumber = sequenceNumber;
EventIndex = eventIndex;
}
public override int CompareTo(StreamSequenceToken other)
{
if(other is null) throw new ArgumentNullException(nameof(other));
if(other is RedisStreamSequenceToken token)
{
if(SequenceNumber == token.SequenceNumber)
{
return EventIndex.CompareTo(token.EventIndex);
}
return SequenceNumber.CompareTo(token.SequenceNumber);
}
throw new ArgumentException("Invalid token type", nameof(other));
}
public override bool Equals(StreamSequenceToken other)
{
var token = other as RedisStreamSequenceToken;
return token != null && SequenceNumber == token.SequenceNumber && EventIndex == token.EventIndex;
}
}
}