Exemplo n.º 1
0
        public static QueryPlanTree BuildTreeSummary(IQueryElement queryTree, QueryParameters queryParameters)
        {
            QueryStack queryStack = new QueryStack();
            int        childId    = 1;

            queryStack.AddElement(queryTree);
            QueryPlanTree queryPlanTree = new QueryPlanTree(childId, 0, queryTree, queryTree.ElementType, null, queryTree is AbstractLeaf ? ((AbstractLeaf)queryTree).GetValue() : "", queryTree.Cost(queryParameters), queryTree.Cardinality(queryParameters), queryTree.AccessType, queryTree.AccessObject);

            if (queryTree.GetComposite() != null)
            {
                queryPlanTree.Childrens = new List <QueryPlanTree>();
                foreach (var elements in queryTree.GetComposite().GetElements())
                {
                    foreach (var element in elements.Value)
                    {
                        queryStack.AddElement(element);

                        if (element.Optimize(queryParameters, queryStack))
                        {
                            return(null);
                        }

                        if (element.GetComposite()?.GetElements()?.Count > 0)
                        {
                            QueryPlanTree queryPlanTreeChild = new QueryPlanTree(++childId, 1, element, elements.Key, queryPlanTree, "", element.Cost(queryParameters), element.Cardinality(queryParameters), element.AccessType, element.AccessObject);
                            queryPlanTree.Childrens.Add(queryPlanTreeChild);
                            if (BuildTreeChilds(element, childId, queryPlanTreeChild, queryParameters, queryStack) < 0)
                            {
                                return(null);
                            }
                        }
                        else
                        {
                            QueryPlanTree queryPlanTreeChild = new QueryPlanTree(++childId, 1, element, elements.Key, queryPlanTree, element is AbstractLeaf ? ((AbstractLeaf)element).Value : "", element.Cost(queryParameters), element.Cardinality(queryParameters), element.AccessType, element.AccessObject);
                            queryPlanTree.Childrens.Add(queryPlanTreeChild);
                        }
                    }
                }
            }
            return(queryPlanTree);
        }