Skip to content

Instantly share code, notes, and snippets.

@maurodx
Created March 29, 2011 14:44
Show Gist options
  • Save maurodx/892468 to your computer and use it in GitHub Desktop.
Save maurodx/892468 to your computer and use it in GitHub Desktop.
EventSourcing for RavenDB
[DisplayName("Aggregates/Network")]
public class NetworkEventsToNetwork : AbstractViewGenerator
{
public NetworkEventsToNetwork()
{
MapDefinition = docs => docs.Where(doc => doc["@metadata"]["Raven-Entity-Name"].ToString().Contains("Event"));
GroupByExtraction = source => source.Network;
ReduceDefinition = Reduce;
Indexes.Add("Network", FieldIndexing.NotAnalyzed);
AddField("Network");
}
private static IEnumerable<NetworkList> Reduce(IEnumerable<object> source)
{
foreach (var events in source
.GroupBy<dynamic, dynamic>(@event => @event.Network))
{
var list = new Dictionary<DateTime, Network>();
foreach (var time in events.Select(x => new { x.NetworkTimeStamp }).Distinct())
{
list.Add(time.NetworkTimeStamp,
new Network() { Name = (string)events.Key, TimeStamp = time.NetworkTimeStamp});
var network = list[time.NetworkTimeStamp];
foreach (var @event in GetOrderedRelevantEvents(events, time))
{
try
{
var x = @event.DomainEvent;
x.Handle(network);
network.TimeStamp = x.NetworkTimeStamp;
}
catch (Exception exception)
{
Debug.Print(exception.Message);
}
}
}
yield return new NetworkList
{
Network = events.Key.ToString(),
List = list
};
}
}
static IStoredEvent[] GetOrderedRelevantEvents(IGrouping<dynamic, dynamic> events, dynamic time)
{
var retrieved=
(
from e in events
orderby e.TimeStamp
let type = EventTypeOrNullIfUnexpected((object)e)
where type != null && e.NetworkTimeStamp <= time.NetworkTimeStamp
select (IStoredEvent)JsonConvert.DeserializeObject((string)e.Inner.ToString(), type)
).ToArray();
return retrieved;
}
static Type EventTypeOrNullIfUnexpected(dynamic e)
{
var type = Type.GetType((string)e["@metadata"]["Raven-Clr-Type"], true);
return type;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment