public IEnumerable <ShowPlan> GetShowPlanSteps() { var bindingResult = Binder.Bind(SyntaxTree.Root, DataContext); if (GetDiagnostics(bindingResult).Any()) { yield break; } var inputQuery = GetBoundQuery(bindingResult.BoundRoot); yield return(ShowPlanBuilder.Build(Resources.ShowPlanUnoptimized, inputQuery)); var relation = inputQuery.Relation; foreach (var rewriter in Optimizer.GetOptimizationSteps()) { var step = rewriter.RewriteRelation(relation); if (step != relation) { var stepName = string.Format(Resources.ShowPlanStepFmt, rewriter.GetType().Name); var stepQuery = new BoundQuery(step, inputQuery.OutputColumns); yield return(ShowPlanBuilder.Build(stepName, stepQuery)); } relation = step; } var ouputQuery = new BoundQuery(relation, inputQuery.OutputColumns); yield return(ShowPlanBuilder.Build(Resources.ShowPlanOptimized, ouputQuery)); }
public static IssueQuery Create(string query) { var syntax = QuerySyntax.Parse(query); var expression = BoundQuery.Create(syntax); return(Create(expression)); }
private static ShowPlanNode BuildQueryRelation(BoundQuery node) { var properties = Enumerable.Empty <KeyValuePair <string, string> >(); var children = new[] { Build(node.Relation) }; var slots = string.Join(@", ", node.OutputColumns.Select(v => v.Name)); return(new ShowPlanNode(@"Query " + slots, properties, children)); }
private static IssueQuery Create(BoundQuery node) { var filters = new List <IssueFilter>(); foreach (var or in FlattenOrs(node)) { var filter = CreateFilter(or); filters.Add(filter); } return(new IssueQuery(filters)); }
private static IEnumerable <BoundQuery> FlattenAnds(BoundQuery node) { var stack = new Stack <BoundQuery>(); var result = new List <BoundQuery>(); stack.Push(node); while (stack.Count > 0) { var n = stack.Pop(); if (n is not BoundAndQuery and) { result.Add(n); }
private static IssueFilter CreateFilter(BoundQuery node) { var result = new IssueFilter(); foreach (var and in FlattenAnds(node)) { switch (and) { case BoundKevValueQuery kevValueExpression: Apply(result, kevValueExpression); break; case BoundTextQuery textExpression: Apply(result, textExpression); break; default: throw new Exception($"Unexpected node {and.GetType()}"); } } return(result); }
internal CompiledQuery(BoundQuery query) { _query = query; }
public BoundOrQuery(BoundQuery left, BoundQuery right) { Left = left; Right = right; }
public BoundNegatedQuery(BoundQuery query) { Query = query; }
public static BoundQuery Optimize(BoundQuery query) { var optmizedRelation = Optimize(query.Relation); return(new BoundQuery(optmizedRelation, query.OutputColumns)); }
public static ShowPlan Build(string name, BoundQuery node) { var showPlanNode = Build(node); return(new ShowPlan(name, showPlanNode)); }