/// <inheritdoc/>
        protected override Provider VisitPredicateJoin(PredicateJoinProvider provider)
        {
            OnRecursionEntrance(provider);
            var left      = VisitCompilable(provider.Left);
            var right     = VisitCompilable(provider.Right);
            var predicate = (Expression <Func <Tuple, Tuple, bool> >)OnRecursionExit(provider);

            if (left == provider.Left && right == provider.Right)
            {
                return(provider);
            }
            return(new PredicateJoinProvider(left, right, predicate ?? provider.Predicate, provider.JoinType));
        }
 /// <summary>
 /// Visits <see cref="PredicateJoinProvider"/>.
 /// </summary>
 /// <param name="provider">Predicate join provider.</param>
 protected abstract Provider VisitPredicateJoin(PredicateJoinProvider provider);