Exemplo n.º 1
0
        public virtual IAccumulator Join(IAccumulator inner)
        {
            if (inner.HighestBoundColumnIndex < HighestBoundColumnIndex)
            {
                // Swap the join order
                return(inner.Join(this));
            }

            // Inner needs to be materialized to allow rewinds
            if (inner is VirtualizingAccumulator)
            {
                inner = (inner as VirtualizingAccumulator).Materialize();
            }

            bool haveOverlap = false;

            for (int i = 0; i < IsBound.Length && !haveOverlap; i++)
            {
                haveOverlap = IsBound[i] && inner.IsBound[i];
            }

            if (!haveOverlap)
            {
                return(Product(inner));
            }
            var sortedOuter = Sort(Columns.Where((x, i) => IsBound[i] && inner.IsBound[i]));
            var sortedInner = inner.Sort(Columns.Where((x, i) => IsBound[i] && inner.IsBound[i]));

            return(JoinSorted(sortedOuter, sortedInner));
        }
Exemplo n.º 2
0
        public virtual IAccumulator Join(IAccumulator inner)
        {
            if (inner.HighestBoundColumnIndex < HighestBoundColumnIndex)
            {
                // Swap the join order
                return inner.Join(this);
            }

            // Inner needs to be materialized to allow rewinds
            if (inner is VirtualizingAccumulator)
            {
                inner = (inner as VirtualizingAccumulator).Materialize();
            }
            
            bool haveOverlap = false;
            for(int i = 0; i < IsBound.Length && !haveOverlap; i++)
            {
                haveOverlap = IsBound[i] && inner.IsBound[i];
            }

            if (!haveOverlap)
            {
                return Product(inner);
            }
            var sortedOuter = Sort(Columns.Where((x, i) => IsBound[i] && inner.IsBound[i]));
            var sortedInner = inner.Sort(Columns.Where((x, i) => IsBound[i] && inner.IsBound[i]));
            return JoinSorted(sortedOuter, sortedInner);

        }