Beispiel #1
0
        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));
        }
Beispiel #2
0
        public static IssueQuery Create(string query)
        {
            var syntax     = QuerySyntax.Parse(query);
            var expression = BoundQuery.Create(syntax);

            return(Create(expression));
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        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));
        }
Beispiel #5
0
        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);
                }
Beispiel #6
0
        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);
        }
Beispiel #7
0
 internal CompiledQuery(BoundQuery query)
 {
     _query = query;
 }
Beispiel #8
0
 public BoundOrQuery(BoundQuery left, BoundQuery right)
 {
     Left  = left;
     Right = right;
 }
Beispiel #9
0
 public BoundNegatedQuery(BoundQuery query)
 {
     Query = query;
 }
Beispiel #10
0
        public static BoundQuery Optimize(BoundQuery query)
        {
            var optmizedRelation = Optimize(query.Relation);

            return(new BoundQuery(optmizedRelation, query.OutputColumns));
        }
Beispiel #11
0
        public static ShowPlan Build(string name, BoundQuery node)
        {
            var showPlanNode = Build(node);

            return(new ShowPlan(name, showPlanNode));
        }