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)); }
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); }