void WhereClause(SingleNodeTree tree) { var conditions = new ConditionGroup(); tree.SetChild(conditions); Expect(16); Unary(conditions, false); while (StartOf(4)) { Unary(conditions, false); } }
void EvoQL() { if (StartOf(1)) { GetExpression expression = new GetExpression(); RootTree = expression; EqlClause(expression); } else if (StartOf(2)) { GetExpression expression = new GetExpression(); RootTree = expression; QlClause(expression); } else if (StartOf(3)) { GetExpression expression = new GetExpression(); RootTree = expression; ConditionGroup conditions = new ConditionGroup(); RootTree.SetChild(conditions); Unary(conditions, false); while (StartOf(4)) { Unary(conditions, false); } } else SynErr(44); }
void OptionalWhereClause(SingleNodeTree tree) { var conditions = new ConditionGroup(); tree.SetChild(conditions); if (la.kind == 16) { Get(); } Unary(conditions, false); while (StartOf(4)) { Unary(conditions, false); } }
void ComplexCondition(SingleNodeTree parent, SelectorExpression selector, bool? isAsOptional) { ConditionGroup group = new ConditionGroup(); parent.SetChild(group); ExpressionTreeBase addTo = group; SingleNodeTree condition = null; ConditionalExpression lastOperation = null; Expect(7); while (StartOf(4)) { lastOperation = lastOperation ?? new AndCondition(); MultiAdd(addTo, lastOperation); addTo = lastOperation; var nestedselector = new SelectorExpression(selector.NodeType, selector.Modifier, selector.Left); if (la.kind == 6 || la.kind == 36) { if (la.kind == 6) { Get(); } else { Get(); } if (la.kind == 17) { Get(); } NotCondition not = new NotCondition(); lastOperation.SetChild(not); lastOperation = not; } if (la.kind == 7) { ComplexCondition(lastOperation, nestedselector, isAsOptional); } else if (StartOf(6)) { Condition(lastOperation, nestedselector, isAsOptional); } else SynErr(56); if (la.kind == 13 || la.kind == 14) { Operation(out lastOperation); } else { lastOperation = null; } } Expect(8); }
void ConditionGroup(SingleNodeTree parent, bool? isAsOptional) { ConditionGroup group = new ConditionGroup(); parent.SetChild(group); ExpressionTreeBase addTo = group; SingleNodeTree condition = null; ConditionalExpression lastOperation = null; Expect(7); while (StartOf(4)) { lastOperation = lastOperation ?? new AndCondition(); MultiAdd(addTo, lastOperation); addTo = lastOperation; if (la.kind == 6 || la.kind == 36) { if (la.kind == 6) { Get(); } else { Get(); } if (la.kind == 17) { Get(); } NotCondition not = new NotCondition(); lastOperation.SetChild(not); lastOperation = not; } if (StartOf(6)) { Condition(lastOperation, null, isAsOptional); } else if (la.kind == 7) { ConditionGroup(lastOperation, isAsOptional); } else SynErr(54); if (la.kind == 13 || la.kind == 14) { Operation(out lastOperation); } else { lastOperation = null; } } if (lastOperation != null && lastOperation.Child == null) SemErr("Invalid Condition"); Expect(8); }
void HavingClause(GetExpression expression) { Expect(33); var having = new HavingExpression(); ConditionGroup conditions = new ConditionGroup(); expression.SetHaving(having); having.SetChild(conditions); Unary(conditions, false); while (StartOf(4)) { Unary(conditions, false); } }
public LogicalGroup(ConditionGroup group) { List<LogicalItem> subItems = new List<LogicalItem>(); Group = group; foreach (ExpressionTreeBase current in group.Children) { foreach (LogicalItem next in ConditionGroup.Convert(current)) { subItems.Add(next); } } SubItems = subItems.ToArray(); IEnumerable<SelectorTypes> types = SubItems.Select(x => x.SingleSelector).Distinct(); if (IsSingleSelector = types.Count() == 1 && !SubItems.OfType<LogicalGroup>().Any(x => !x.IsSingleSelector)) { SingleSelector = types.First(); } List<List<LogicalItem>> chains = GetChains(subItems); List<SelectorGroup> groups = new List<SelectorGroup>(); foreach (List<LogicalItem> chain in chains) { List<LogicalItem> unknownItems = new List<LogicalItem>(); SelectorTypes[] newTypes = chain.Select(x => x is LogicalGroup ? (((LogicalGroup)x).IsSingleSelector ? x.SingleSelector : SelectorTypes.Invalid) : x.SingleSelector).Distinct().ToArray(); foreach (SelectorTypes current in newTypes) { List<LogicalItem> items = new List<LogicalItem>(); for (int i = chain.Count - 1; i >= 0; i--) { LogicalItem item = chain[i]; SelectorTypes? selector = item is LogicalGroup ? (((LogicalGroup)item).IsSingleSelector ? (SelectorTypes?)item.SingleSelector : null) : item.SingleSelector; if (selector == null) { unknownItems.Insert(0, item); chain.RemoveAt(i); } else if (selector == current) { items.Insert(0, item); } } if (items.Count > 0) { groups.Add(new SelectorGroup(items, current)); } } if (unknownItems.Count > 0) { groups.Add(new SelectorGroup(unknownItems, null)); } } for (int i = groups.Count - 1; i >= 0; i--) { if (i > 0) { if (groups[i].Selector == groups[i - 1].Selector) { SelectorGroup upperGroup = groups[i]; SelectorGroup lowerGroup = groups[i - 1]; groups.RemoveAt(i); groups.RemoveAt(i - 1); List<LogicalItem> items = new List<LogicalItem>(); items.AddRange(lowerGroup.Children); items.AddRange(upperGroup.Children); SelectorGroup joinedGroup = new SelectorGroup(items, upperGroup.Selector); groups.Insert(i - 1, joinedGroup); } } } SelectorGroups = groups.ToArray(); }
public LogicalGroup(ConditionGroup group) { List <LogicalItem> subItems = new List <LogicalItem>(); Group = group; foreach (ExpressionTreeBase current in group.Children) { foreach (LogicalItem next in ConditionGroup.Convert(current)) { subItems.Add(next); } } SubItems = subItems.ToArray(); IEnumerable <SelectorTypes> types = SubItems.Select(x => x.SingleSelector).Distinct(); if (IsSingleSelector = types.Count() == 1 && !SubItems.OfType <LogicalGroup>().Any(x => !x.IsSingleSelector)) { SingleSelector = types.First(); } List <List <LogicalItem> > chains = GetChains(subItems); List <SelectorGroup> groups = new List <SelectorGroup>(); foreach (List <LogicalItem> chain in chains) { List <LogicalItem> unknownItems = new List <LogicalItem>(); SelectorTypes[] newTypes = chain.Select(x => x is LogicalGroup ? (((LogicalGroup)x).IsSingleSelector ? x.SingleSelector : SelectorTypes.Invalid) : x.SingleSelector).Distinct().ToArray(); foreach (SelectorTypes current in newTypes) { List <LogicalItem> items = new List <LogicalItem>(); for (int i = chain.Count - 1; i >= 0; i--) { LogicalItem item = chain[i]; SelectorTypes?selector = item is LogicalGroup ? (((LogicalGroup)item).IsSingleSelector ? (SelectorTypes?)item.SingleSelector : null) : item.SingleSelector; if (selector == null) { unknownItems.Insert(0, item); chain.RemoveAt(i); } else if (selector == current) { items.Insert(0, item); } } if (items.Count > 0) { groups.Add(new SelectorGroup(items, current)); } } if (unknownItems.Count > 0) { groups.Add(new SelectorGroup(unknownItems, null)); } } for (int i = groups.Count - 1; i >= 0; i--) { if (i > 0) { if (groups[i].Selector == groups[i - 1].Selector) { SelectorGroup upperGroup = groups[i]; SelectorGroup lowerGroup = groups[i - 1]; groups.RemoveAt(i); groups.RemoveAt(i - 1); List <LogicalItem> items = new List <LogicalItem>(); items.AddRange(lowerGroup.Children); items.AddRange(upperGroup.Children); SelectorGroup joinedGroup = new SelectorGroup(items, upperGroup.Selector); groups.Insert(i - 1, joinedGroup); } } } SelectorGroups = groups.ToArray(); }