public override QueryNode BuildTree(QueryFieldSet fieldSet) { field_set = fieldSet; root = current_parent = new QueryListNode(Keyword.And); var last_was_term = false; while (true) { var token = Scan(); if (token.ID == TokenID.Unknown) { break; } token.Column = token_start_column; token.Line = token_start_line; // If we have two terms in a row, put an AND between them if (last_was_term && token.ID == TokenID.Term) { ParseToken(new QueryToken(TokenID.And)); } ParseToken(token); last_was_term = token.ID == TokenID.Term; } return(root.Trim()); }
public void TakeChildren(QueryListNode from) { foreach (var child in from.Children) { AddChild(child); } from.Children.Clear(); }
private void DepthPop() { // Avoid trying to pop more than is possible if (current_parent.Parent != null) { current_parent = current_parent.Parent; } }
private void ParseToken(QueryToken token) { switch (token.ID) { case TokenID.OpenParen: DepthPush(); break; case TokenID.CloseParen: DepthPop(); break; case TokenID.Not: NodePush(new QueryListNode(Keyword.Not)); break; case TokenID.Or: case TokenID.And: // Only push a node if the current_parent is not the same as this token if (current_parent.Keyword == Keyword.Not || current_parent.Keyword == (token.ID == TokenID.Or ? Keyword.And : Keyword.Or)) { var list = new QueryListNode(token.ID == TokenID.Or ? Keyword.Or : Keyword.And); var p = current_parent.Parent; if (p != null) { current_parent.Parent.RemoveChild(current_parent); } if (current_parent.Keyword == Keyword.Not || current_parent.ChildCount > 1) { list.AddChild(current_parent); } else { list.TakeChildren(current_parent); } current_parent = p; NodePush(list); } break; case TokenID.Term: NodePush(QueryTermNode.ParseUserQuery(field_set, token.Term)); break; } }
private void NodePush(QueryNode node) { if (current_parent == null && node is QueryListNode) { root = current_parent = node as QueryListNode; return; } if (current_parent.Keyword == Keyword.Not && current_parent.ChildCount == 1) { DepthPop(); } current_parent.AddChild(node); // If the node is a list, it's our new parent var list = node as QueryListNode; if (list != null) { current_parent = list; } }
public QueryNode(QueryListNode parent) { Parent = parent; Parent.AddChild(this); }
public QueryListNode(Keyword keyword, QueryListNode parent) : base(parent) { this.keyword = keyword; }
private QueryNode Parse(XmlElement node, QueryListNode parent) { if (node == null) { return(null); } QueryListNode list = null; //Console.WriteLine ("Parsing node: {0}", node.Name); switch (node.Name.ToLower()) { case "and": list = new QueryListNode(Keyword.And); break; case "or": list = new QueryListNode(Keyword.Or); break; case "not": list = new QueryListNode(Keyword.Not); break; default: var term = new QueryTermNode(); // Get the field (if any) that this term applies to if (node["field"] != null) { term.Field = field_set [node["field"].GetAttribute("name")]; } // Get the value term.Value = QueryValue.CreateFromXml(node, term.Field); // Get the operator from the term's name term.Operator = term.Value.OperatorSet [node.Name]; if (parent != null) { parent.AddChild(term); } return(term); } if (list != null) { if (parent != null) { parent.AddChild(list); } // Recursively parse the children of a QueryListNode foreach (XmlNode child in node.ChildNodes) { Parse(child as XmlElement, list); } } return(list); }
private void DepthPush() { current_parent = new QueryListNode(Keyword.And, current_parent); }