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; }
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); }
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); }
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(); }
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); }
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); }
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); }
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; }