Esempio n. 1
0
 public QueryPlanTree(QueryPlanTree old)
 {
     this.Id           = old.Id;
     this.ParentId     = old.ParentId;
     this.QueryElement = old.QueryElement;
     this.Parent       = old.Parent;
     this.ElementType  = old.ElementType;
     this.QueryElement = old.QueryElement;
     this.Value        = old.Value;
     this.Cost         = old.Cost;
     this.Cardinality  = old.Cardinality;
 }
Esempio n. 2
0
        public IQueryElement OptimizeQueryPlan(IQueryElement queryTree, QueryParameters queryParameters)
        {
            QueryPlanTree queryPlanTree = null;
            Stopwatch     sw            = new Stopwatch();

            sw.Start();

            do
            {
                queryPlanTree = BuildTreeSummary(queryTree, queryParameters);
            }while (queryPlanTree == null && sw.ElapsedMilliseconds < Settings.Settings.GetInstance().MaxTimeSearchingBestQueryPlan);

            return(queryPlanTree != null ? queryPlanTree.QueryElement : queryTree);
        }
Esempio n. 3
0
        public QueryPlan GetQueryPlan(IQueryElement queryTree, QueryParameters queryParameters)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();
            QueryPlanTree queryPlanTree = null;

            do
            {
                queryPlanTree = BuildTreeSummary(queryTree, queryParameters);
            }while (queryPlanTree == null && sw.ElapsedMilliseconds < Settings.Settings.GetInstance().MaxTimeSearchingBestQueryPlan);

            QueryPlan queryPlan = ConvertToQueryPlanSummary(queryPlanTree);

            return(queryPlan);
        }
Esempio n. 4
0
        public void TestQueryElementView()
        {
            DTOQuery inputQuery = new DTOQuery();

            inputQuery.QueryText = "Student where na==2 and bc==3;";
            IQueryAnalyzer analizer      = new EBNFQueryAnalyzer();
            var            queryTree     = analizer.ParseQuery(inputQuery);
            QueryPlanTree  queryPlanTree = QueryOptimizer.BuildTreeSummary(queryTree, new QueryParameters());

            // queryTree.GetComposite().elements[ElementType.SELECT];
            SelectStatement query_elements = (SelectStatement)analizer.ParseQuery(inputQuery);
            //  queryTree.GetComposite().GetElement(ElementType.WHERE).GetComposite().GetElement(ElementType.COMPERISION).GetComposite().GetElement(ElementType.LEFT_OPERAND).GetComposite().GetElement(ElementType.CLASS_PROPERTY);
            var elements = query_elements.GetElements();
            //var test = QueryOptimizer.findElementType(queryTree, ElementType.CLASS_PROPERTY);
            ClassProperty classProperty = new ClassProperty();

            Console.WriteLine(elements[ElementType.CLASS_NAME].ToString());
            SelectStatement s = new SelectStatement();
        }
Esempio n. 5
0
        public QueryPlan ConvertToQueryPlan(QueryPlanTree queryPlanTree, out int sumCost)
        {
            QueryPlan queryPlan = new QueryPlan(queryPlanTree.Id, queryPlanTree.ParentId, queryPlanTree.ElementType.ToString(), queryPlanTree.Value, queryPlanTree.Cost, queryPlanTree.Cardinality, queryPlanTree.AccessType.ToString(), queryPlanTree.AccessObject);

            int _sumCost = queryPlanTree.Cost;

            if (queryPlanTree.Childrens != null && queryPlanTree.Childrens.Count > 0)
            {
                queryPlan.Childrens = new List <QueryPlan>();
                foreach (QueryPlanTree queryPlanTreeChild in queryPlanTree.Childrens)
                {
                    var queryPlanConverted = ConvertToQueryPlan(queryPlanTreeChild, out sumCost);
                    _sumCost += sumCost;
                    queryPlan.Childrens.Add(queryPlanConverted);
                }
            }
            sumCost = _sumCost;
            return(queryPlan);
        }
Esempio n. 6
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);
        }
Esempio n. 7
0
        private static int BuildTreeChilds(IQueryElement queryTree, int parentId, QueryPlanTree parent, QueryParameters queryParameters, QueryStack queryStack)
        {
            int childID = parentId + 1;

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

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

                        if (element.GetComposite()?.GetElements()?.Count > 0)
                        {
                            QueryPlanTree queryPlanTreeChild = new QueryPlanTree(childID, parentId, element, elements.Key, parent, "", element.Cost(queryParameters), element.Cardinality(queryParameters), element.AccessType, element.AccessObject);
                            parent.Childrens.Add(queryPlanTreeChild);
                            childID = BuildTreeChilds(element, childID, queryPlanTreeChild, queryParameters, queryStack);
                            if (childID < 0)
                            {
                                return(childID);
                            }
                        }
                        else
                        {
                            parent.Childrens.Add(new QueryPlanTree(childID++, parentId, element, elements.Key, parent, element is AbstractLeaf ? ((AbstractLeaf)element).Value : "", element.Cost(queryParameters), element.Cardinality(queryParameters), element.AccessType, element.AccessObject));
                        }
                    }
                }
            }
            return(childID);
        }
Esempio n. 8
0
 public QueryPlanTree(int Id, int ParentId, IQueryElement QueryElement, ElementType ElementType, QueryPlanTree Parent, string Value, int Cost, int Cardinality, AccessType AccessType, string AccessObject)
 {
     this.Id           = Id;
     this.ParentId     = ParentId;
     this.QueryElement = QueryElement;
     this.Parent       = Parent;
     this.ElementType  = ElementType;
     this.QueryElement = QueryElement;
     this.Value        = Value;
     this.Cost         = Cost;
     this.Cardinality  = Cardinality;
     this.AccessType   = AccessType;
     this.AccessObject = AccessObject;
 }