public SearchNodeList Parse() { var ret = new SearchNodeList(); if (!(this.Source == "")) { string[] parts = this.Source.Split('/'); const string NO_INDEX = @"^(\*|[a-z]+)$"; const string WITH_INDEX = @"^(\*|[a-z]+)\[[0-9]+\]$"; const string WITH_NAME = @"^(\*|[a-z]+)\[.+\]$"; foreach (var part in parts) { if (Regex.IsMatch(part, NO_INDEX)) { ret.Add(new SearchNode(this.KeywordToEnum(part))); } else if (Regex.IsMatch(part, WITH_INDEX)) { var _open = part.IndexOf('['); var _close = part.IndexOf(']'); var index_string = part.Substring(_open + 1, _close - (_open + 1)).Trim(); var index = int.Parse(index_string); ret.Add(new SearchNode(this.KeywordToEnum(part.Substring(0, _open)), index)); } else if (Regex.IsMatch(part, WITH_NAME)) { var _open = part.IndexOf('['); var _close = part.IndexOf(']'); var name = part.Substring(_open + 1, _close - (_open + 1)).Trim(); ret.Add(new SearchNode(this.KeywordToEnum(part.Substring(0, _open)), name)); } else { throw new Exception("Query expression contains errors."); } } } return(ret); }
public Node GetChild(params SearchNode[] parsed_search_expression) { if (parsed_search_expression.Length == 0) { return(null); } else if (parsed_search_expression.Length == 1) { return(this.GetNodeByType(parsed_search_expression[0])); } else { var rest_parts = new SearchNodeList(); rest_parts.AddRange(parsed_search_expression); var first_part = rest_parts[0]; rest_parts.RemoveAt(0); var first_result = this.GetNodeByType(first_part); if (first_result == null) { return(null); } return(first_result.GetChild(rest_parts.ToArray())); } }