Beispiel #1
0
	void WhereClause(SingleNodeTree tree) {
		var conditions = new ConditionGroup(); tree.SetChild(conditions); 
		Expect(16);
		Unary(conditions, false);
		while (StartOf(4)) {
			Unary(conditions, false);
		}
	}
Beispiel #2
0
	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);
	}
Beispiel #3
0
	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);
		}
	}
Beispiel #4
0
	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);
	}
Beispiel #5
0
	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);
	}
Beispiel #6
0
	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);
		}
	}
Beispiel #7
0
            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();
            }
Beispiel #8
0
            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();
            }