Пример #1
0
 public LeftAntiSemiNestedLoopsIterator(Iterator left, Iterator right, IteratorPredicate predicate, IteratorPredicate passthruPredicate)
 {
     _left              = left;
     _right             = right;
     _predicate         = predicate;
     _passthruPredicate = passthruPredicate;
 }
Пример #2
0
        public void Iterators_ProbingLeftSemiNestedLoops_MatchesRows()
        {
            var leftRows = new object[, ]
            {
                { 1, "1-Left" },
                { 2, "2-Left-A" },
                { 2, "2-Left-B" },
                { 3, "3-Left" },
                { 4, "4-Left" },
                { 5, "5-Left" }
            };

            var rightRows = new object[] { 2, 3, 3, 5 };

            var expected = new object[, ]
            {
                { 1, "1-Left", false },
                { 2, "2-Left-A", true },
                { 2, "2-Left-B", true },
                { 3, "3-Left", true },
                { 4, "4-Left", false },
                { 5, "5-Left", true }
            };

            using (var left = new MockedIterator(leftRows))
                using (var right = new MockedIterator(rightRows))
                {
                    var iteratorPredicate = new IteratorPredicate(() => Equals(left.RowBuffer[0], right.RowBuffer[0]));

                    using (var iterator = new ProbingLeftSemiNestedLoopsIterator(left, right, iteratorPredicate))
                    {
                        AssertProduces(iterator, expected);
                    }
                }
        }
Пример #3
0
        public void Iterators_LeftAntiSemiNestedLoops_NoReadsOnRight_WhenPassthruIsTrue()
        {
            var leftRows  = new object[] { 1, 2, 3, 4, 5 };
            var rightRows = new object[] { 1, 2, 3 };
            var expected  = new object[] { 2, 4, 5 };

            using (var left = new MockedIterator(leftRows))
                using (var right = new MockedIterator(rightRows))
                {
                    var iteratorPredicate = new IteratorPredicate(() => Equals(left.RowBuffer[0], right.RowBuffer[0]));
                    var passthru          = new IteratorPredicate(() => (int)left.RowBuffer[0] % 2 == 0);

                    using (var iterator = new LeftAntiSemiNestedLoopsIterator(left, right, iteratorPredicate, passthru))
                    {
                        AssertProduces(iterator, expected);
                    }

                    Assert.Equal(1, left.TotalOpenCount);
                    Assert.Equal(5, left.TotalReadCount);
                    Assert.Equal(1, left.DisposalCount);

                    Assert.Equal(3, right.TotalOpenCount);
                    Assert.Equal(7, right.TotalReadCount);
                    Assert.Equal(1, right.DisposalCount);
                }
        }
        internal void Iterators_HashMatch_MatchesDuplicates(BoundHashMatchOperator logicalOperator)
        {
            var buildRows = new object[] { 1, 2, 3 };
            var probeRows = new object[, ]
            {
                { 1, "First" },
                { 2, "Second1" },
                { 2, "Second2" },
                { 3, "Third" }
            };
            var expected = new object[, ]
            {
                { 1, 1, "First" },
                { 2, 2, "Second1" },
                { 2, 2, "Second2" },
                { 3, 3, "Third" }
            };

            using (var build = new MockedIterator(buildRows))
                using (var probe = new MockedIterator(probeRows))
                {
                    var rowBuffer = new HashMatchRowBuffer(build.RowBuffer.Count, probe.RowBuffer.Count);
                    var remainder = new IteratorPredicate(() => true);

                    using (var iterator = new HashMatchIterator(logicalOperator, build, probe, 0, 0, remainder, rowBuffer))
                    {
                        AssertProduces(iterator, expected);
                    }
                }
        }
Пример #5
0
 public ProbingLeftSemiNestedLoopsIterator(Iterator left, Iterator right, IteratorPredicate predicate)
 {
     _left      = left;
     _right     = right;
     _predicate = predicate;
     _rowBuffer = new ProbedRowBuffer(left.RowBuffer);
 }
 public LeftOuterNestedLoopsIterator(Iterator left, Iterator right, IteratorPredicate predicate, IteratorPredicate passthruPredicate)
 {
     _left              = left;
     _right             = right;
     _predicate         = predicate;
     _passthruPredicate = passthruPredicate;
     _rowBuffer         = new LeftOuterNestedLoopsRowBuffer(_left.RowBuffer, _right.RowBuffer);
 }
 public InnerNestedLoopsIterator(Iterator left, Iterator right, IteratorPredicate predicate, IteratorPredicate passthruPredicate)
 {
     _left              = left;
     _right             = right;
     _predicate         = predicate;
     _passthruPredicate = passthruPredicate;
     RowBuffer          = new CombinedRowBuffer(left.RowBuffer, right.RowBuffer);
 }
Пример #8
0
 public HashMatchIterator(BoundHashMatchOperator logicalOperator, Iterator build, Iterator probe, int buildIndex, int probeIndex, IteratorPredicate remainder, HashMatchRowBuffer rowBuffer)
 {
     _logicalOperator = logicalOperator;
     _build           = build;
     _probe           = probe;
     _buildIndex      = buildIndex;
     _probeIndex      = probeIndex;
     _remainder       = remainder;
     _rowBuffer       = rowBuffer;
 }
        internal void Iterators_HashMatch_ForwardsProperly(BoundHashMatchOperator logicalOperator)
        {
            var buildRows = new object[] { 1, 2 };
            var probeRows = new object[] { 2, 3 };

            using (var build = new MockedIterator(buildRows))
                using (var probe = new MockedIterator(probeRows))
                {
                    const int passCount = 2;

                    var rowBuffer = new HashMatchRowBuffer(build.RowBuffer.Count, probe.RowBuffer.Count);
                    var remainder = new IteratorPredicate(() => true);

                    using (var iterator = new HashMatchIterator(logicalOperator, build, probe, 0, 0, remainder, rowBuffer))
                    {
                        for (var i = 0; i < passCount; i++)
                        {
                            iterator.Open();

                            Assert.True(iterator.Read());
                            Assert.Equal(2, iterator.RowBuffer[0]);
                            Assert.Equal(2, iterator.RowBuffer[1]);

                            if (logicalOperator == BoundHashMatchOperator.RightOuter ||
                                logicalOperator == BoundHashMatchOperator.FullOuter)
                            {
                                Assert.True(iterator.Read());
                                Assert.Equal(null, iterator.RowBuffer[0]);
                                Assert.Equal(3, iterator.RowBuffer[1]);
                            }

                            if (logicalOperator == BoundHashMatchOperator.LeftOuter ||
                                logicalOperator == BoundHashMatchOperator.FullOuter)
                            {
                                Assert.True(iterator.Read());
                                Assert.Equal(1, iterator.RowBuffer[0]);
                                Assert.Equal(null, iterator.RowBuffer[1]);
                            }

                            Assert.False(iterator.Read());
                        }
                    }

                    var inputs = new[] { build, probe };

                    foreach (var input in inputs)
                    {
                        Assert.Equal(passCount, input.TotalOpenCount);
                        Assert.Equal(passCount * 2, input.TotalReadCount);
                        Assert.Equal(1, input.DisposalCount);
                    }
                }
        }
Пример #10
0
        public void Iterators_ProbingLeftSemiNestedLoops_ReturnsEmpty_WhenLeftIsEmpty()
        {
            var leftRows  = new object[0];
            var rightRows = new object[0];

            using (var left = new MockedIterator(leftRows))
                using (var right = new MockedIterator(rightRows))
                {
                    var iteratorPredicate = new IteratorPredicate(() => true);

                    using (var iterator = new ProbingLeftSemiNestedLoopsIterator(left, right, iteratorPredicate))
                    {
                        AssertEmpty(iterator);
                    }
                }
        }
        internal void Iterators_HashMatch_ReturnsEmpty_IfBuildIsEmpty(BoundHashMatchOperator logicalOperator)
        {
            var buildRows = new object[0];
            var probeRows = new object[] { 2, 3 };

            using (var build = new MockedIterator(buildRows))
                using (var probe = new MockedIterator(probeRows))
                {
                    var rowBuffer = new HashMatchRowBuffer(build.RowBuffer.Count, probe.RowBuffer.Count);
                    var remainder = new IteratorPredicate(() => true);

                    using (var iterator = new HashMatchIterator(logicalOperator, build, probe, 0, 0, remainder, rowBuffer))
                    {
                        AssertEmpty(iterator);
                    }
                }
        }
Пример #12
0
        public void Iterators_InnerNestedLoops_ReturnsEmpty_WhenLeftAndRightIsEmpty()
        {
            var rows      = new object[0];
            var rightRows = new object[] { 1, 2, 3 };

            using (var left = new MockedIterator(rows))
                using (var right = new MockedIterator(rightRows))
                {
                    var iteratorPredicate = new IteratorPredicate(() => true);
                    var passthru          = new IteratorPredicate(() => false);

                    using (var iterator = new InnerNestedLoopsIterator(left, right, iteratorPredicate, passthru))
                    {
                        AssertEmpty(iterator);
                    }
                }
        }
        internal void Iterators_HashMatch_DoesNotMatchNulls(BoundHashMatchOperator logicalOperator)
        {
            var buildRows = new object[, ]
            {
                { null, "Foo" }
            };
            var probeRows = new object[, ]
            {
                { null, "Bar" }
            };

            using (var build = new MockedIterator(buildRows))
                using (var probe = new MockedIterator(probeRows))
                {
                    var rowBuffer = new HashMatchRowBuffer(build.RowBuffer.Count, probe.RowBuffer.Count);
                    var remainder = new IteratorPredicate(() => true);

                    using (var iterator = new HashMatchIterator(logicalOperator, build, probe, 0, 0, remainder, rowBuffer))
                    {
                        iterator.Open();

                        if (logicalOperator == BoundHashMatchOperator.RightOuter ||
                            logicalOperator == BoundHashMatchOperator.FullOuter)
                        {
                            Assert.True(iterator.Read());
                            Assert.Equal(null, iterator.RowBuffer[0]);
                            Assert.Equal(null, iterator.RowBuffer[1]);
                            Assert.Equal(null, iterator.RowBuffer[2]);
                            Assert.Equal("Bar", iterator.RowBuffer[3]);
                        }

                        if (logicalOperator == BoundHashMatchOperator.LeftOuter ||
                            logicalOperator == BoundHashMatchOperator.FullOuter)
                        {
                            Assert.True(iterator.Read());
                            Assert.Equal(null, iterator.RowBuffer[0]);
                            Assert.Equal("Foo", iterator.RowBuffer[1]);
                            Assert.Equal(null, iterator.RowBuffer[2]);
                            Assert.Equal(null, iterator.RowBuffer[3]);
                        }

                        Assert.False(iterator.Read());
                    }
                }
        }
Пример #14
0
        public void Iterators_LeftAntiSemiNestedLoops_ReturnsLeft_WhenRightEmpty()
        {
            var leftRows  = new object[] { 1, 2, 3 };
            var rightRows = new object[0];
            var expected  = leftRows;

            using (var left = new MockedIterator(leftRows))
                using (var right = new MockedIterator(rightRows))
                {
                    var iteratorPredicate = new IteratorPredicate(() => true);
                    var passthru          = new IteratorPredicate(() => false);

                    using (var iterator = new LeftAntiSemiNestedLoopsIterator(left, right, iteratorPredicate, passthru))
                    {
                        AssertProduces(iterator, expected);
                    }
                }
        }
Пример #15
0
        public void Iterators_LeftAntiSemiNestedLoops_ReturnsLeft_WhenRightIsNonEmpty_UnlessPassthruIsTrue()
        {
            var leftRows  = new object[] { 1, 2, 3 };
            var rightRows = new object[] { 1 };
            var expected  = new object[] { 2 };

            using (var left = new MockedIterator(leftRows))
                using (var right = new MockedIterator(rightRows))
                {
                    var iteratorPredicate = new IteratorPredicate(() => true);
                    var passthru          = new IteratorPredicate(() => Equals(left.RowBuffer[0], 2));

                    using (var iterator = new LeftAntiSemiNestedLoopsIterator(left, right, iteratorPredicate, passthru))
                    {
                        AssertProduces(iterator, expected);
                    }
                }
        }
        public void Iterators_LeftOuterNestedLoops_MatchesRows()
        {
            var leftRows = new object[, ]
            {
                { 1, "1-Left" },
                { 2, "2-Left-A" },
                { 2, "2-Left-B" },
                { 3, "3-Left" },
                { 4, "4-Left" },
                { 5, "5-Left" }
            };

            var rightRows = new object[, ]
            {
                { 2, "2-Right" },
                { 3, "3-Right-A" },
                { 3, "3-Right-B" },
                { 5, "5-Right" }
            };

            var expected = new object[, ]
            {
                { 1, "1-Left", null, null },
                { 2, "2-Left-A", 2, "2-Right" },
                { 2, "2-Left-B", 2, "2-Right" },
                { 3, "3-Left", 3, "3-Right-A" },
                { 3, "3-Left", 3, "3-Right-B" },
                { 4, "4-Left", null, null },
                { 5, "5-Left", 5, "5-Right" }
            };

            using (var left = new MockedIterator(leftRows))
                using (var right = new MockedIterator(rightRows))
                {
                    var iteratorPredicate = new IteratorPredicate(() => Equals(left.RowBuffer[0], right.RowBuffer[0]));
                    var passthru          = new IteratorPredicate(() => false);

                    using (var iterator = new LeftOuterNestedLoopsIterator(left, right, iteratorPredicate, passthru))
                    {
                        AssertProduces(iterator, expected);
                    }
                }
        }
Пример #17
0
        public void Iterators_ProbingLeftSemiNestedLoops_ReturnsLeft_WhenRightIsEmpty()
        {
            var leftRows  = new object[] { 1, 2, 3 };
            var rightRows = new object[0];
            var expected  = new object[, ]
            {
                { 1, false },
                { 2, false },
                { 3, false }
            };

            using (var left = new MockedIterator(leftRows))
                using (var right = new MockedIterator(rightRows))
                {
                    var iteratorPredicate = new IteratorPredicate(() => true);

                    using (var iterator = new ProbingLeftSemiNestedLoopsIterator(left, right, iteratorPredicate))
                    {
                        AssertProduces(iterator, expected);
                    }
                }
        }
        internal void Iterators_HashMatch_ReturnsBuild_IfProbeIsEmpty(BoundHashMatchOperator logicalOperator)
        {
            var buildRows = new object[] { 1, 2 };
            var probeRows = new object[0];
            var expected  = new object[, ]
            {
                { 1, null },
                { 2, null }
            };

            using (var build = new MockedIterator(buildRows))
                using (var probe = new MockedIterator(probeRows))
                {
                    var rowBuffer = new HashMatchRowBuffer(build.RowBuffer.Count, probe.RowBuffer.Count);
                    var remainder = new IteratorPredicate(() => true);

                    using (var iterator = new HashMatchIterator(logicalOperator, build, probe, 0, 0, remainder, rowBuffer))
                    {
                        AssertProduces(iterator, expected);
                    }
                }
        }
        public void Iterators_LeftOuterNestedLoops_ReturnsLeft_WhenPredicateIsFalse()
        {
            var leftRows  = new object[] { 1, 2, 3 };
            var rightRows = new object[0];
            var expected  = new object[, ]
            {
                { 1, null },
                { 2, null },
                { 3, null }
            };

            using (var left = new MockedIterator(leftRows))
                using (var right = new MockedIterator(rightRows))
                {
                    var iteratorPredicate = new IteratorPredicate(() => false);
                    var passthru          = new IteratorPredicate(() => false);

                    using (var iterator = new LeftOuterNestedLoopsIterator(left, right, iteratorPredicate, passthru))
                    {
                        AssertProduces(iterator, expected);
                    }
                }
        }
Пример #20
0
 public AssertIterator(Iterator input, IteratorPredicate predicate, string message)
 {
     _input     = input;
     _predicate = predicate;
     _message   = message;
 }
Пример #21
0
 public FilterIterator(Iterator input, IteratorPredicate predicate)
 {
     _input     = input;
     _predicate = predicate;
 }
        internal void Iterators_HashMatch_MatchesWithRemainder(BoundHashMatchOperator logicalOperator)
        {
            var buildRows = new object[, ]
            {
                { 1, 1 },
                { 1, 2 },
                { 2, 1 },
                { 2, 2 },
                { 3, 1 }
            };

            var probeRows = new object[, ]
            {
                { 0, 0, "Unmatched1" },
                { 1, 1, "Project1-Task-1" },
                { 1, 2, "Project1-Task-2" },
                { 1, 3, "Unmatched2" },
                { 2, 1, "Project2-Task-1" },
            };

            using (var build = new MockedIterator(buildRows))
                using (var probe = new MockedIterator(probeRows))
                {
                    // Layout:
                    // 0               | 1            | 2               | 3            | 4
                    // ----------------+--------------+-----------------+--------------+---------------
                    // build.ProjectId | build.TaskId | probe.ProjectId | probe.TaskId | probe.TaskName

                    var rowBuffer = new HashMatchRowBuffer(build.RowBuffer.Count, probe.RowBuffer.Count);
                    var remainder = new IteratorPredicate(() => Equals(rowBuffer[1], rowBuffer[3]));

                    using (var iterator = new HashMatchIterator(logicalOperator, build, probe, 0, 0, remainder, rowBuffer))
                    {
                        iterator.Open();

                        if (logicalOperator == BoundHashMatchOperator.RightOuter ||
                            logicalOperator == BoundHashMatchOperator.FullOuter)
                        {
                            Assert.True(iterator.Read());
                            Assert.Equal(null, iterator.RowBuffer[0]);
                            Assert.Equal(null, iterator.RowBuffer[1]);
                            Assert.Equal(0, iterator.RowBuffer[2]);
                            Assert.Equal(0, iterator.RowBuffer[3]);
                            Assert.Equal("Unmatched1", iterator.RowBuffer[4]);
                        }

                        Assert.True(iterator.Read());
                        Assert.Equal(1, iterator.RowBuffer[0]);
                        Assert.Equal(1, iterator.RowBuffer[1]);
                        Assert.Equal(1, iterator.RowBuffer[2]);
                        Assert.Equal(1, iterator.RowBuffer[3]);
                        Assert.Equal("Project1-Task-1", iterator.RowBuffer[4]);

                        Assert.True(iterator.Read());
                        Assert.Equal(1, iterator.RowBuffer[0]);
                        Assert.Equal(2, iterator.RowBuffer[1]);
                        Assert.Equal(1, iterator.RowBuffer[2]);
                        Assert.Equal(2, iterator.RowBuffer[3]);
                        Assert.Equal("Project1-Task-2", iterator.RowBuffer[4]);

                        if (logicalOperator == BoundHashMatchOperator.RightOuter ||
                            logicalOperator == BoundHashMatchOperator.FullOuter)
                        {
                            Assert.True(iterator.Read());
                            Assert.Equal(null, iterator.RowBuffer[0]);
                            Assert.Equal(null, iterator.RowBuffer[1]);
                            Assert.Equal(1, iterator.RowBuffer[2]);
                            Assert.Equal(3, iterator.RowBuffer[3]);
                            Assert.Equal("Unmatched2", iterator.RowBuffer[4]);
                        }

                        Assert.True(iterator.Read());
                        Assert.Equal(2, iterator.RowBuffer[0]);
                        Assert.Equal(1, iterator.RowBuffer[1]);
                        Assert.Equal(2, iterator.RowBuffer[2]);
                        Assert.Equal(1, iterator.RowBuffer[3]);
                        Assert.Equal("Project2-Task-1", iterator.RowBuffer[4]);

                        if (logicalOperator == BoundHashMatchOperator.LeftOuter ||
                            logicalOperator == BoundHashMatchOperator.FullOuter)
                        {
                            Assert.True(iterator.Read());
                            Assert.Equal(2, iterator.RowBuffer[0]);
                            Assert.Equal(2, iterator.RowBuffer[1]);
                            Assert.Equal(null, iterator.RowBuffer[2]);
                            Assert.Equal(null, iterator.RowBuffer[3]);
                            Assert.Equal(null, iterator.RowBuffer[4]);

                            Assert.True(iterator.Read());
                            Assert.Equal(3, iterator.RowBuffer[0]);
                            Assert.Equal(1, iterator.RowBuffer[1]);
                            Assert.Equal(null, iterator.RowBuffer[2]);
                            Assert.Equal(null, iterator.RowBuffer[3]);
                            Assert.Equal(null, iterator.RowBuffer[4]);
                        }

                        Assert.False(iterator.Read());
                    }
                }
        }