/// <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 = PartialEvaluator.Eval(expression, CanBeEvaluatedLocally); // apply mapping (binds LINQ operators too) expression = mapping.Translate(expression); // any policy specific translations or validations expression = policy.Translate(expression); // any language specific translations or validations expression = language.Translate(expression); // do final reduction expression = UnusedColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = RedundantJoinRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); //HACK: Have to fix invalid COUNT/ORDER BY here expression = CountOrderByRemover.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 expression = RelationshipIncluder.Include(this, expression); 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) expression = SingletonProjectionRewriter.Rewrite(this.mapping.Language, expression); expression = UnusedColumnRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = RedundantJoinRemover.Remove(expression); // convert projections into client-side joins expression = ClientJoinedProjectionRewriter.Rewrite(this.mapping.Language, expression); expression = UnusedColumnRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = RedundantJoinRemover.Remove(expression); return(expression); }
public static Expression Optimize(Expression expression, Type typeForEnums, bool simplerPartialVal = true) { expression = ObjectOperandComparisonExpander.Expand(expression); expression = EnumTypeNormalizer.Normalize(expression, typeForEnums); expression = GroupByCollator.Collate(expression); expression = AggregateSubqueryRewriter.Rewrite(expression); expression = UnusedColumnRemover.Remove(expression); expression = RedundantColumnRemover.Remove(expression); expression = RedundantSubqueryRemover.Remove(expression); expression = FunctionCoalescer.Coalesce(expression); expression = ExistsSubqueryOptimizer.Optimize(expression); expression = RedundantBinaryExpressionsRemover.Remove(expression); if (simplerPartialVal) { expression = Evaluator.PartialEval(expression, c => c.NodeType != (ExpressionType)SqlExpressionType.ConstantPlaceholder && Evaluator.CanBeEvaluatedLocally(c)); } else { expression = Evaluator.PartialEval(expression); } expression = RedundantFunctionCallRemover.Remove(expression); expression = ConditionalEliminator.Eliminate(expression); expression = SqlExpressionCollectionOperationsExpander.Expand(expression); expression = SumAggregatesDefaultValueCoalescer.Coalesce(expression); expression = OrderByRewriter.Rewrite(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 & 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); } 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(this.Translator.Linguist.Language, 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 var bound = RelationshipBinder.Bind(this, expression); if (bound != expression) { expression = bound; // clean up after ourselves! (multiple references to same association property) expression = RedundantColumnRemover.Remove(expression); expression = RedundantJoinRemover.Remove(expression); } // rewrite comparison checks between entities and multi-valued constructs expression = ComparisonRewriter.Rewrite(this.Mapping, expression); return(expression); }
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); }
/// <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); }
public override Expression Translate(Expression expression) { // fix up any order-by's expression = OrderByRewriter.Rewrite(expression); expression = base.Translate(expression); expression = CrossJoinIsolator.Isolate(expression); expression = ThreeTopPagerRewriter.Rewrite(expression); expression = OrderByRewriter.Rewrite(expression); expression = UnusedColumnRemover.Remove(expression); expression = RedundantColumnRemover.Remove(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); }
/// <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)); }