public override System.Linq.Expressions.Expression Translate(Expression expression) { expression = OrderByRewriter.Rewrite(expression); expression = UnusedColumnRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); var rewritten = CrossApplyRewriter.Rewrite(expression); rewritten = CrossJoinRewriter.Rewrite(rewritten); if (rewritten != expression) { expression = rewritten; expression = UnusedColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = RedundantJoinRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); } expression = SkipToRowNumberRewriter.Rewrite(expression); expression = OrderByRewriter.Rewrite(expression); return(expression); }
public override Expression Translate(Expression expression) { // fix up any order-by's expression = OrderByRewriter.Rewrite(Language, expression); expression = base.Translate(expression); expression = SkipToNestedOrderByRewriter.Rewrite(Language, expression); expression = OrderByRewriter.Rewrite(Language, expression); expression = UnusedColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = ScalarSubqueryRewriter.Rewrite(Language, expression); return(expression); }
/// <summary> /// Provides language specific query translation. Use this to apply language specific rewrites or /// to make assertions/validations about the query. /// </summary> /// <param name="expression"></param> /// <returns></returns> public virtual Expression Translate(Expression expression) { // remove redundant layers again before cross apply rewrite expression = UnusedColumnRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); // convert cross-apply and outer-apply joins into inner and left-outer-joins if possible expression = CrossApplyRewriter.Reduce(expression); return(expression); }
public override Expression Translate(Expression expression) { bool hasRowNumberExpression; // fix up any order-by's expression = OrderByRewriter.Rewrite(this.Language, expression); expression = XmlToCursorExpressionRewriter.Rewrite(expression); // remove redundant layers again before cross apply rewrite expression = UnusedColumnRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = OneBasedIndexRewriter.Rewrite(expression); // convert cross-apply and outer-apply joins into inner & left-outer-joins if possible var rewritten = CrossApplyRewriter.Rewrite(this.language, expression); // convert cross joins into inner joins rewritten = CrossJoinRewriter.Rewrite(rewritten); if (rewritten != expression) { expression = rewritten; // do final reduction expression = UnusedColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = RedundantJoinRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); } // convert skip/take info into RowNumber pattern expression = SkipToRowNumberRewriter.Rewrite(expression, out hasRowNumberExpression); expression = SkipToNestedOrderByRewriter.Rewrite(this.Language, expression); expression = UnusedColumnRemover.Remove(expression); expression = WhereCountComparisonRewriter.Rewrite(expression); if (!hasRowNumberExpression) { expression = OrderByRewriter.Rewrite(this.Language, expression); expression = RedundantSubqueryRemover.Remove(expression); } expression = VfpCrossJoinIsolator.Isolate(expression); expression = ConditionalImmediateIfNullRemover.Remove(expression); expression = XmlToCursorJoinRewriter.Rewrite(expression); return(expression); }
static internal ProjectionExpression Flatten(ProjectionExpression proj, AliasGenerator aliasGenerator) { var result = (ProjectionExpression) new ChildProjectionFlattener(aliasGenerator).Visit(proj); if (result == proj) { return(result); } Expression columnCleaned = UnusedColumnRemover.Remove(result); Expression subqueryCleaned = RedundantSubqueryRemover.Remove(columnCleaned); return((ProjectionExpression)subqueryCleaned); }
public override Expression Translate(Expression expression) { // fix up any order-by's expression = OrderByRewriter.Rewrite(expression); expression = base.Translate(expression); expression = ThreeTopPagerRewriter.Rewrite(expression); expression = OrderByRewriter.Rewrite(expression); expression = UnusedColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = ScalarSubqueryRewriter.Rewrite(expression); return(expression); }
internal Expression Translate(Expression expression) { if (expression is ProjectionExpression projection) { return(projection); } expression = Evaluator.PartialEval(expression, CanBeEvaluatedLocally); expression = QueryBinder.Bind(this, expression); expression = ConstantEscaper.EscapeConstants(expression); expression = OrderByRewriter.Rewrite(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = UnusedColumnRemover.Remove(expression); expression = AggregateSimplifier.Simplify(expression); return(expression); }
public virtual Expression Translate(Expression expression) { expression = UnusedColumnRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); var rewritten = CrossApplyRewriter.Rewrite(expression); rewritten = CrossJoinRewriter.Rewrite(rewritten); if (rewritten != expression) { expression = rewritten; expression = UnusedColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = RedundantJoinRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); } return(expression); }
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); }
/// <summary> /// Do all query translations execpt building the execution plan /// </summary> /// <param name="expression"></param> /// <returns></returns> protected virtual ProjectionExpression Translate(Expression expression) { // pre-evaluate local sub-trees expression = Nequeo.Data.Linq.Provider.PartialEvaluator.Eval(expression, this.CanBeEvaluatedLocally); // apply mapping (binds LINQ operators too) expression = this.mapping.Translate(expression); // any policy specific translations or validations expression = this.policy.Translate(expression); // any language specific translations or validations expression = this.language.Translate(expression); // do final reduction expression = UnusedColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = RedundantJoinRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); return((ProjectionExpression)expression); }
/// <summary> /// Provides policy specific query translations. This is where choices about inclusion of related objects and how /// heirarchies are materialized affect the definition of the queries. /// </summary> /// <param name="expression"></param> /// <returns></returns> public virtual Expression Translate(Expression expression) { // add included relationships to client projection var rewritten = RelationshipIncluder.Include(this.Translator.Mapper, expression); if (rewritten != expression) { expression = rewritten; expression = UnusedColumnRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = RedundantJoinRemover.Remove(expression); } // convert any singleton (1:1 or n:1) projections into server-side joins (cardinality is preserved) rewritten = SingletonProjectionRewriter.Rewrite(this.Translator.Linguist.Language, expression); if (rewritten != expression) { expression = rewritten; expression = UnusedColumnRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = RedundantJoinRemover.Remove(expression); } // convert projections into client-side joins rewritten = ClientJoinedProjectionRewriter.Rewrite(this.Policy, this.Translator.Linguist.Language, expression); if (rewritten != expression) { expression = rewritten; expression = UnusedColumnRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = RedundantJoinRemover.Remove(expression); } return(expression); }
/// <summary> /// Apply mapping translations to this expression /// </summary> /// <param name="expression"></param> /// <returns></returns> public virtual Expression Translate(Expression expression) { // convert references to LINQ operators into query specific nodes expression = QueryBinder.Bind(this, expression); // move aggregate computations so they occur in same select as group-by expression = AggregateRewriter.Rewrite(expression); // do reduction so duplicate association's are likely to be clumped together expression = UnusedColumnRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = RedundantJoinRemover.Remove(expression); // convert references to association properties into correlated queries expression = RelationshipBinder.Bind(this, expression); // clean up after ourselves! (multiple references to same association property) expression = RedundantColumnRemover.Remove(expression); expression = RedundantJoinRemover.Remove(expression); return(expression); }
internal Expression GetExecutionPlan(Expression expression) { LambdaExpression lambda = expression as LambdaExpression; if (lambda != null) { expression = lambda.Body; } var translation = expression; translation = PartialEvaluator.Eval(expression, ExpressionHelper.CanBeEvaluatedLocally); translation = FunctionBinder.Bind(this, translation); //translation = PartialEvaluator.Eval(translation, ExpressionHelper.CanBeEvaluatedLocally); translation = QueryBinder.Bind(ExpressionBuilder, this, translation); translation = AggregateRewriter.Rewrite(Dialect, translation); translation = UnusedColumnRemover.Remove(translation); translation = RedundantColumnRemover.Remove(translation); translation = RedundantSubqueryRemover.Remove(translation); translation = RedundantJoinRemover.Remove(translation); var bound = RelationshipBinder.Bind(ExpressionBuilder, translation); if (bound != translation) { translation = bound; translation = RedundantColumnRemover.Remove(translation); translation = RedundantJoinRemover.Remove(translation); } translation = ComparisonRewriter.Rewrite(ExpressionBuilder, translation); var rewritten = RelationshipIncluder.Include(ExpressionBuilder, this, translation); if (rewritten != translation) { translation = rewritten; translation = UnusedColumnRemover.Remove(translation); translation = RedundantColumnRemover.Remove(translation); translation = RedundantSubqueryRemover.Remove(translation); translation = RedundantJoinRemover.Remove(translation); } rewritten = SingletonProjectionRewriter.Rewrite(this.ExpressionBuilder, translation); if (rewritten != translation) { translation = rewritten; translation = UnusedColumnRemover.Remove(translation); translation = RedundantColumnRemover.Remove(translation); translation = RedundantSubqueryRemover.Remove(translation); translation = RedundantJoinRemover.Remove(translation); } rewritten = ClientJoinedProjectionRewriter.Rewrite(this, translation); if (rewritten != translation) { translation = rewritten; translation = UnusedColumnRemover.Remove(translation); translation = RedundantColumnRemover.Remove(translation); translation = RedundantSubqueryRemover.Remove(translation); translation = RedundantJoinRemover.Remove(translation); } // translation = this.ExpressionBuilder.Translate(translation); var parameters = lambda != null ? lambda.Parameters : null; Expression provider = Find(expression, parameters, typeof(InternalDbContext)); if (provider == null) { Expression rootQueryable = Find(expression, parameters, typeof(IQueryable)); provider = Expression.Property(rootQueryable, typeof(IQueryable).GetProperty("Provider")); } return(ExecutionBuilder.Build(this.Dialect, this, translation, provider)); }