Exemple #1
0
        public async Task WithinPartition_by_range_correctly_partitions_queries_by_int()
        {
            var id = Guid.NewGuid().ToString();

            await WriteEvents(i => new Event
            {
                SequenceNumber = i,
                Id             = id
            });

            var stream = Stream.PartitionedByRange <Event, int, int>(async(q, p) =>
            {
                using (var db = new AlluvialSqlTestsDbContext())
                {
                    return(await db.Events
                           .Where(e => e.Id == id)
                           .WithinPartition(e => e.SequenceNumber, p)
                           .ToArrayAsync());
                }
            });

            var catchup = stream.DistributeAmong(Partition.ByRange(0, 100).Among(5));

            var store = new InMemoryProjectionStore <int>();

            catchup.Subscribe(async(count, events) => events.Count, store);

            await catchup.RunSingleBatch();

            store.Select(x => x).Should().BeEquivalentTo(new[] { 20, 20, 20, 20, 20 });
        }
Exemple #2
0
 private static async Task WriteEvents(Func <int, Event> createEvent, int howMany = 100)
 {
     using (var db = new AlluvialSqlTestsDbContext())
     {
         for (var i = 1; i <= howMany; i++)
         {
             db.Events.Add(createEvent(i));
         }
         await db.SaveChangesAsync();
     }
 }
Exemple #3
0
        public async Task WithinPartition_by_range_correctly_partitions_queries_by_string()
        {
            var guid = Guid.NewGuid();

            var partitions = new[]
            {
                Partition.ByRange("", "mm"),
                Partition.ByRange("mm", "zz")
            };

            Values.AtoZ()
            .ToList()
            .ForEach(c =>
                     WriteEvents(i => new Event
            {
                SequenceNumber = i,
                Guid           = guid,
                Id             = c + "  " + Guid.NewGuid()
            }, 10).Wait());

            var stream = Stream.PartitionedByRange <Event, int, string>(async(q, p) =>
            {
                using (var db = new AlluvialSqlTestsDbContext())
                {
                    return(await db.Events
                           .Where(e => e.Guid == guid)
                           .WithinPartition(e => e.Id, p)
                           .ToArrayAsync());
                }
            });

            var catchup = stream.DistributeAmong(partitions);

            var store = new InMemoryProjectionStore <int>();

            catchup.Subscribe(async(count, events) => events.Count, store);

            await catchup.RunSingleBatch();

            store.Select(x => x).Should().BeEquivalentTo(new[] { 130, 130 });
        }