private static void SetTreeOrder(List <SqlParseTree> trees) { string inputTreeTitle = "Input Tree"; SqlParseTree inputTree = trees.FirstOrDefault(t => t.TreeDescription == inputTreeTitle); if (inputTree != null) { trees.Remove(inputTree); trees.Insert(0, inputTree); } }
public static SqlParseTree Clone(SqlParseTree original) { if (original == null) { return(null); } SqlParseTree tree = new SqlParseTree(); tree.TreeDescription = original.TreeDescription; tree.RootNode = SqlParseTreeNode.Clone(original.RootNode); tree.OuterTreeText = original.OuterTreeText; tree.InnerTreeText = original.InnerTreeText; tree.BeginOffset = original.BeginOffset; tree.EndOffset = original.EndOffset; return(tree); }
public static ReadOnlyCollection <SqlParseTree> Parse(string treeText) { if (string.IsNullOrEmpty(treeText)) { return(new ReadOnlyCollection <SqlParseTree>(new List <SqlParseTree>())); } List <SqlParseTree> trees = new List <SqlParseTree>(); List <SqlParseTreeNode> nodes = new List <SqlParseTreeNode>(); SqlParseTree tree = null; StringBuilder sb = new StringBuilder(); using (StringReader reader = new StringReader(treeText)) { string line; int lineNumber = 0; SqlParseTreeNode previousNode = null; while ((line = reader.ReadLine()) != null) { if (line.StartsWith(_endMarker) && line.StartsWith(_ruleAppliedMarker) == false && tree != null) { // End of current tree reached. // TODO: determine offset at end tree.EndOffset = 0; tree.InnerTreeText = sb.ToString(); } else if (line.StartsWith(_beginMarker) || line.StartsWith(_ruleAppliedMarker)) { if (tree != null) { tree.RootNode = ConvertNodeListToTree(nodes); tree.InnerTreeText = sb.ToString(); trees.Add(tree); nodes = new List <SqlParseTreeNode>(); sb = new StringBuilder(); } tree = new SqlParseTree(); tree.OuterTreeText = treeText; tree.BeginOffset = 0; tree.TreeDescription = ExtractTreeDescription(line); } else if (line.StartsWith(" ") == false) { //throw new ApplicationException(string.Format("Unknown text {0} in parse tree text (no indentation?)", line)); } else { if ((line.Trim().Length > 0 && line.Trim().StartsWith("=") && previousNode != null) || (previousNode != null && previousNode.OperationName == "Exchange" && previousNode.Arguments == "Partition")) { // Continuation of previous line previousNode.Arguments += line; sb.AppendLine(line); } else { SqlParseTreeNode node = ParseSingleNode(line); node.SequenceNumber = lineNumber; nodes.Add(node); sb.AppendLine(line); previousNode = node; lineNumber++; } } } } if (tree != null) { tree.RootNode = ConvertNodeListToTree(nodes); tree.EndOffset = 0; tree.InnerTreeText = sb.ToString(); trees.Add(tree); } SetTreeOrder(trees); return(new ReadOnlyCollection <SqlParseTree>(trees)); }