public void SumSessionWindow()
        {
            var input = new PartitionedStreamEvent <int, double>[]
            {
                PartitionedStreamEvent.CreatePoint(0, 0, 1.0),
                PartitionedStreamEvent.CreatePoint(0, 1, 2.0),
                PartitionedStreamEvent.CreatePoint(0, 2, 3.0),
                PartitionedStreamEvent.CreatePoint(0, 5, 4.0),
                PartitionedStreamEvent.CreatePoint(0, 6, 5.0),
                PartitionedStreamEvent.CreatePoint(0, 9, 6.0),
            };

            var expected = new PartitionedStreamEvent <int, double>[]
            {
                PartitionedStreamEvent.CreateStart(0, 0, 1.0),
                PartitionedStreamEvent.CreateEnd(0, 1, 0, 1.0),
                PartitionedStreamEvent.CreateStart(0, 1, 3.0),
                PartitionedStreamEvent.CreateEnd(0, 2, 1, 3.0),
                PartitionedStreamEvent.CreateStart(0, 2, 6.0),
                PartitionedStreamEvent.CreateEnd(0, 4, 2, 6.0),
                PartitionedStreamEvent.CreateStart(0, 5, 4.0),
                PartitionedStreamEvent.CreateEnd(0, 6, 5, 4.0),
                PartitionedStreamEvent.CreateStart(0, 6, 9.0),
                PartitionedStreamEvent.CreateEnd(0, 8, 6, 9.0),
                PartitionedStreamEvent.CreateStart(0, 9, 6.0),
                PartitionedStreamEvent.CreateEnd(0, 11, 9, 6.0),
                PartitionedStreamEvent.CreateLowWatermark <int, double>(StreamEvent.InfinitySyncTime),
            };

            var output = SessionWindowSum(input, 2, 5).ToArray();

            Assert.IsTrue(expected.SequenceEqual(output));
        }
        public void PassThroughOutOfOrderWithPunctuation2()
        {
            var input = new PartitionedStreamEvent <int, int>[]
            {
                PartitionedStreamEvent.CreateStart(3, 3, 3),
                PartitionedStreamEvent.CreatePunctuation <int, int>(3, 10),
                PartitionedStreamEvent.CreateStart(2, 2, 2),
                PartitionedStreamEvent.CreatePunctuation <int, int>(2, 10),
                PartitionedStreamEvent.CreateStart(1, 1, 1),
                PartitionedStreamEvent.CreatePunctuation <int, int>(1, 10),
                PartitionedStreamEvent.CreateStart(0, 0, 0),
                PartitionedStreamEvent.CreatePunctuation <int, int>(0, 10),
            };
            var expected = new PartitionedStreamEvent <int, int>[]
            {
                PartitionedStreamEvent.CreateStart(3, 3, 3),
                PartitionedStreamEvent.CreatePunctuation <int, int>(3, 10),
                PartitionedStreamEvent.CreateStart(2, 2, 2),
                PartitionedStreamEvent.CreatePunctuation <int, int>(2, 10),
                PartitionedStreamEvent.CreateStart(1, 1, 1),
                PartitionedStreamEvent.CreatePunctuation <int, int>(1, 10),
                PartitionedStreamEvent.CreateStart(0, 0, 0),
                PartitionedStreamEvent.CreatePunctuation <int, int>(0, 10),
                PartitionedStreamEvent.CreateLowWatermark <int, int>(StreamEvent.InfinitySyncTime),
            };

            var output = Passthrough(input).ToList();

            Assert.IsTrue(expected.SequenceEqual(output));
        }
Example #3
0
        public void DisjointUnionNegativeWatermarkRepro()
        {
            const int leftKey  = 1;
            const int rightKey = 2;
            var       left     = new Subject <PartitionedStreamEvent <int, int> >();
            var       right    = new Subject <PartitionedStreamEvent <int, int> >();

            var qc         = new QueryContainer();
            var leftInput  = qc.RegisterInput(left);
            var rightInput = qc.RegisterInput(right);

            var actualOutput = new List <PartitionedStreamEvent <int, int> >();
            var inputs       = new IStreamable <PartitionKey <int>, int>[] { leftInput, rightInput };
            var union        = new MultiUnionStreamable <PartitionKey <int>, int>(inputs, guaranteedDisjoint: true);
            var egress       = qc.RegisterOutput(union).ForEachAsync(o => actualOutput.Add(o));
            var process      = qc.Restore();

            left.OnNext(PartitionedStreamEvent.CreatePoint(leftKey, 100, 1));
            right.OnNext(PartitionedStreamEvent.CreatePoint(rightKey, 100, 1));

            process.Flush();

            left.OnCompleted();
            right.OnCompleted();

            var expected = new PartitionedStreamEvent <int, int>[]
            {
                PartitionedStreamEvent.CreatePoint(leftKey, 100, 1),
                PartitionedStreamEvent.CreatePoint(rightKey, 100, 1),
                PartitionedStreamEvent.CreateLowWatermark <int, int>(StreamEvent.InfinitySyncTime),
            };

            Assert.IsTrue(expected.SequenceEqual(actualOutput));
        }
        public void AverageSessionWindow()
        {
            var input = new PartitionedStreamEvent <int, double>[]
            {
                PartitionedStreamEvent.CreateStart(0, 0, 0.0),
                PartitionedStreamEvent.CreateStart(0, 1, 1.0),
                PartitionedStreamEvent.CreateStart(0, 2, 2.0),
                PartitionedStreamEvent.CreateStart(0, 8, 4.0),
                PartitionedStreamEvent.CreateStart(0, 9, 7.0),
                PartitionedStreamEvent.CreateStart(1, 1, 1.0),
                PartitionedStreamEvent.CreateStart(1, 2, 2.0),
                PartitionedStreamEvent.CreateStart(1, 3, 3.0),
                PartitionedStreamEvent.CreateStart(2, 8, 2.0),
                PartitionedStreamEvent.CreateStart(2, 20, 3.0),
                PartitionedStreamEvent.CreateStart(2, 22, 4.0),
                PartitionedStreamEvent.CreateStart(3, 3, 3.0),
                PartitionedStreamEvent.CreateStart(3, 4, 4.0),
                PartitionedStreamEvent.CreateStart(3, 5, 5.0),
            };

            var expected = new PartitionedStreamEvent <int, double>[]
            {
                PartitionedStreamEvent.CreateStart(0, 0, 0.0),
                PartitionedStreamEvent.CreateEnd(0, 1, 0, 0.0),
                PartitionedStreamEvent.CreateStart(0, 1, 0.5),
                PartitionedStreamEvent.CreateEnd(0, 2, 1, 0.5),
                PartitionedStreamEvent.CreateStart(0, 2, 1.0),
                PartitionedStreamEvent.CreateEnd(0, 7, 2, 1.0),
                PartitionedStreamEvent.CreateStart(0, 8, 4.0),
                PartitionedStreamEvent.CreateEnd(0, 9, 8, 4.0),
                PartitionedStreamEvent.CreateStart(1, 1, 1.0),
                PartitionedStreamEvent.CreateEnd(1, 2, 1, 1.0),
                PartitionedStreamEvent.CreateStart(1, 2, 1.5),
                PartitionedStreamEvent.CreateEnd(1, 3, 2, 1.5),
                PartitionedStreamEvent.CreateStart(2, 8, 2.0),
                PartitionedStreamEvent.CreateEnd(2, 13, 8, 2.0),
                PartitionedStreamEvent.CreateStart(2, 20, 3.0),
                PartitionedStreamEvent.CreateEnd(2, 22, 20, 3.0),
                PartitionedStreamEvent.CreateStart(3, 3, 3.0),
                PartitionedStreamEvent.CreateEnd(3, 4, 3, 3.0),
                PartitionedStreamEvent.CreateStart(3, 4, 3.5),
                PartitionedStreamEvent.CreateEnd(3, 5, 4, 3.5),
                PartitionedStreamEvent.CreateStart(0, 9, 5.5),
                PartitionedStreamEvent.CreateEnd(0, 14, 9, 5.5),
                PartitionedStreamEvent.CreateStart(1, 3, 2.0),
                PartitionedStreamEvent.CreateEnd(1, 8, 3, 2.0),
                PartitionedStreamEvent.CreateStart(2, 22, 3.5),
                PartitionedStreamEvent.CreateEnd(2, 27, 22, 3.5),
                PartitionedStreamEvent.CreateStart(3, 5, 4.0),
                PartitionedStreamEvent.CreateEnd(3, 10, 5, 4.0),
                PartitionedStreamEvent.CreateLowWatermark <int, double>(StreamEvent.InfinitySyncTime),
            };

            var output = SessionWindowAverage(input, 5, 10);

            Assert.IsTrue(expected.SequenceEqual(output));
        }
        public void Union0()
        {
            var input1 = new PartitionedStreamEvent <int, double>[]
            {
                PartitionedStreamEvent.CreateStart(0, 0, 0.0),
                PartitionedStreamEvent.CreateStart(0, 1, 1.0),
                PartitionedStreamEvent.CreateStart(0, 2, 2.0),
                PartitionedStreamEvent.CreateStart(1, 1, 1.0),
                PartitionedStreamEvent.CreateStart(1, 2, 2.0),
                PartitionedStreamEvent.CreateStart(1, 3, 3.0),
                PartitionedStreamEvent.CreateStart(2, 2, 2.0),
                PartitionedStreamEvent.CreateStart(2, 3, 3.0),
                PartitionedStreamEvent.CreateStart(2, 4, 4.0),
            };

            var input2 = new PartitionedStreamEvent <int, double>[]
            {
                PartitionedStreamEvent.CreateStart(2, 0, 0.0),
                PartitionedStreamEvent.CreateStart(2, 1, 1.0),
                PartitionedStreamEvent.CreateStart(2, 2, 2.0),
                PartitionedStreamEvent.CreateStart(1, 1, 1.0),
                PartitionedStreamEvent.CreateStart(1, 2, 2.0),
                PartitionedStreamEvent.CreateStart(1, 3, 3.0),
                PartitionedStreamEvent.CreateStart(0, 2, 2.0),
                PartitionedStreamEvent.CreateStart(0, 3, 3.0),
                PartitionedStreamEvent.CreateStart(0, 4, 4.0),
            };

            var output = Union(input1, input2).ToArray();

            var expected = new PartitionedStreamEvent <int, double>[]
            {
                PartitionedStreamEvent.CreateStart(0, 0, 0.0),
                PartitionedStreamEvent.CreateStart(2, 0, 0.0),
                PartitionedStreamEvent.CreateStart(2, 1, 1.0),
                PartitionedStreamEvent.CreateStart(2, 2, 2.0),
                PartitionedStreamEvent.CreateStart(2, 2, 2.0),
                PartitionedStreamEvent.CreateStart(2, 3, 3.0),
                PartitionedStreamEvent.CreateStart(2, 4, 4.0),
                PartitionedStreamEvent.CreateStart(1, 1, 1.0),
                PartitionedStreamEvent.CreateStart(1, 1, 1.0),
                PartitionedStreamEvent.CreateStart(1, 2, 2.0),
                PartitionedStreamEvent.CreateStart(1, 2, 2.0),
                PartitionedStreamEvent.CreateStart(1, 3, 3.0),
                PartitionedStreamEvent.CreateStart(1, 3, 3.0),
                PartitionedStreamEvent.CreateStart(0, 1, 1.0),
                PartitionedStreamEvent.CreateStart(0, 2, 2.0),
                PartitionedStreamEvent.CreateStart(0, 2, 2.0),
                PartitionedStreamEvent.CreateStart(0, 3, 3.0),
                PartitionedStreamEvent.CreateStart(0, 4, 4.0),
                PartitionedStreamEvent.CreateLowWatermark <int, double>(StreamEvent.InfinitySyncTime),
            };

            Assert.IsTrue(expected.SequenceEqual(output));
        }
        public void PassThroughEmpty()
        {
            var input = Array.Empty <PartitionedStreamEvent <int, int> >();

            var expected = new PartitionedStreamEvent <int, int>[]
            {
                PartitionedStreamEvent.CreateLowWatermark <int, int>(StreamEvent.InfinitySyncTime),
            };
            var output = Passthrough(input).ToList();

            Assert.IsTrue(expected.SequenceEqual(output));
        }
        public void AverageGeneral()
        {
            var input = new PartitionedStreamEvent <int, double>[]
            {
                PartitionedStreamEvent.CreateStart(0, 0, 0.0),
                PartitionedStreamEvent.CreateStart(0, 1, 1.0),
                PartitionedStreamEvent.CreateStart(0, 2, 2.0),
                PartitionedStreamEvent.CreateStart(1, 1, 1.0),
                PartitionedStreamEvent.CreateStart(1, 2, 2.0),
                PartitionedStreamEvent.CreateStart(1, 3, 3.0),
                PartitionedStreamEvent.CreateStart(2, 2, 2.0),
                PartitionedStreamEvent.CreateStart(2, 3, 3.0),
                PartitionedStreamEvent.CreateStart(2, 4, 4.0),
                PartitionedStreamEvent.CreateStart(3, 3, 3.0),
                PartitionedStreamEvent.CreateStart(3, 4, 4.0),
                PartitionedStreamEvent.CreateStart(3, 5, 5.0),
            };

            var expected = new PartitionedStreamEvent <int, double>[]
            {
                PartitionedStreamEvent.CreateStart(0, 0, 0.0),
                PartitionedStreamEvent.CreateEnd(0, 1, 0, 0.0),
                PartitionedStreamEvent.CreateStart(0, 1, 0.5),
                PartitionedStreamEvent.CreateEnd(0, 2, 1, 0.5),
                PartitionedStreamEvent.CreateStart(1, 1, 1.0),
                PartitionedStreamEvent.CreateEnd(1, 2, 1, 1.0),
                PartitionedStreamEvent.CreateStart(1, 2, 1.5),
                PartitionedStreamEvent.CreateEnd(1, 3, 2, 1.5),
                PartitionedStreamEvent.CreateStart(2, 2, 2.0),
                PartitionedStreamEvent.CreateEnd(2, 3, 2, 2.0),
                PartitionedStreamEvent.CreateStart(2, 3, 2.5),
                PartitionedStreamEvent.CreateEnd(2, 4, 3, 2.5),
                PartitionedStreamEvent.CreateStart(3, 3, 3.0),
                PartitionedStreamEvent.CreateEnd(3, 4, 3, 3.0),
                PartitionedStreamEvent.CreateStart(3, 4, 3.5),
                PartitionedStreamEvent.CreateEnd(3, 5, 4, 3.5),
                PartitionedStreamEvent.CreateStart(0, 2, 1.0),
                PartitionedStreamEvent.CreateStart(1, 3, 2.0),
                PartitionedStreamEvent.CreateStart(2, 4, 3.0),
                PartitionedStreamEvent.CreateStart(3, 5, 4.0),
                PartitionedStreamEvent.CreateLowWatermark <int, double>(StreamEvent.InfinitySyncTime),
            };

            var output = AverageGeneral(input).ToList();

            Assert.IsTrue(expected.SequenceEqual(output));
        }
        public void AverageTumblingWindow()
        {
            var input = new PartitionedStreamEvent <int, double>[]
            {
                PartitionedStreamEvent.CreateStart(0, 0, 0.0),
                PartitionedStreamEvent.CreateStart(0, 1, 1.0),
                PartitionedStreamEvent.CreateStart(0, 2, 2.0),
                PartitionedStreamEvent.CreateStart(1, 1, 1.0),
                PartitionedStreamEvent.CreateStart(1, 2, 2.0),
                PartitionedStreamEvent.CreateStart(1, 3, 3.0),
                PartitionedStreamEvent.CreateStart(2, 2, 2.0),
                PartitionedStreamEvent.CreateStart(2, 3, 3.0),
                PartitionedStreamEvent.CreateStart(2, 4, 4.0),
                PartitionedStreamEvent.CreateStart(3, 3, 3.0),
                PartitionedStreamEvent.CreateStart(3, 4, 4.0),
                PartitionedStreamEvent.CreateStart(3, 5, 5.0),
            };

            var expected = new PartitionedStreamEvent <int, double>[]
            {
                PartitionedStreamEvent.CreateInterval(0, 0, 1, 0.0),
                PartitionedStreamEvent.CreateInterval(0, 1, 2, 1.0),
                PartitionedStreamEvent.CreateInterval(1, 1, 2, 1.0),
                PartitionedStreamEvent.CreateInterval(1, 2, 3, 2.0),
                PartitionedStreamEvent.CreateInterval(2, 2, 3, 2.0),
                PartitionedStreamEvent.CreateInterval(2, 3, 4, 3.0),
                PartitionedStreamEvent.CreateInterval(3, 3, 4, 3.0),
                PartitionedStreamEvent.CreateInterval(3, 4, 5, 4.0),
                PartitionedStreamEvent.CreateInterval(0, 2, 3, 2.0),
                PartitionedStreamEvent.CreateInterval(1, 3, 4, 3.0),
                PartitionedStreamEvent.CreateInterval(2, 4, 5, 4.0),
                PartitionedStreamEvent.CreateInterval(3, 5, 6, 5.0),
                PartitionedStreamEvent.CreateLowWatermark <int, double>(StreamEvent.InfinitySyncTime),
            };

            var output = TumblingWindow(input);

            Assert.IsTrue(expected.SequenceEqual(output));
        }