Beispiel #1
0
        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);
        }
Beispiel #3
0
        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));
        }