public static Expression Complete(Expression source, QueryBinder binder)
    {
        EntityCompleter pc = new EntityCompleter(binder);

        var result = pc.Visit(source);

        var expandedResul = QueryJoinExpander.ExpandJoins(result, binder, cleanRequests: true, binder.systemTime);

        return(expandedResul);
    }
    internal static Expression Optimize(Expression binded, QueryBinder binder, AliasGenerator aliasGenerator, HeavyProfiler.Tracer?log)
    {
        var isPostgres = Schema.Current.Settings.IsPostgres;


        log.Switch("Aggregate");
        Expression rewriten = AggregateRewriter.Rewrite(binded);

        log.Switch("DupHistory");
        Expression dupHistory = DuplicateHistory.Rewrite(rewriten, aliasGenerator);

        log.Switch("EntityCompleter");
        Expression completed = EntityCompleter.Complete(dupHistory, binder);

        log.Switch("AliasReplacer");
        Expression replaced = AliasProjectionReplacer.Replace(completed, aliasGenerator);

        log.Switch("OrderBy");
        Expression orderRewrited = OrderByRewriter.Rewrite(replaced);

        log.Switch("OrderBy");
        Expression lazyCastRemoved = SqlCastLazyRemover.Remove(orderRewrited);

        log.Switch("Rebinder");
        Expression rebinded = QueryRebinder.Rebind(lazyCastRemoved);

        log.Switch("UnusedColumn");
        Expression columnCleaned = UnusedColumnRemover.Remove(rebinded);

        log.Switch("Redundant");
        Expression subqueryCleaned = RedundantSubqueryRemover.Remove(columnCleaned);

        log.Switch("Condition");
        Expression rewriteConditions = isPostgres ? ConditionsRewriterPostgres.Rewrite(subqueryCleaned) : ConditionsRewriter.Rewrite(subqueryCleaned);

        log.Switch("Scalar");
        Expression scalar = ScalarSubqueryRewriter.Rewrite(rewriteConditions);

        return(scalar);
    }