Пример #1
0
        internal TableInfo NewWithUniqueAlias(List <string> usedAliases)
        {
            var currentAlias = alias ?? TableAccessor.AliasFromName(id.Last());
            var uniqueAlias  = MakeUnique(currentAlias, usedAliases);

            var res = new TableInfo(id, uniqueAlias);

            res.urn        = this.urn;
            res.columns    = this.columns;
            res.primaryKey = this.primaryKey;
            return(res);
        }
Пример #2
0
        static public bool Execute(DTE2 application)
        {
            Document doc = application.ActiveDocument;

            if (doc == null)
            {
                return(false);
            }
            TextDocument textDoc = doc.Object("TextDocument") as TextDocument;

            if (textDoc == null)
            {
                return(false);
            }

            var    editPoint = textDoc.StartPoint.CreateEditPoint();
            string text      = editPoint.GetText(textDoc.EndPoint);

            text = text.Replace(Environment.NewLine, "\n");
            int cursorPos = textDoc.Selection.ActivePoint.AbsoluteCharOffset - 1;

            string      body    = text.Substring(0, cursorPos);
            ContextInfo context = JoinParser.ParseContext(body);

            if (context == null)
            {
                return(false);
            }

            string database      = Common.Connection.GetActiveDatabase(body);
            var    tableAccessor = new TableAccessor(database);

            var contextDatabases = new HashSet <string>();

            foreach (TableInfo t in context.AllTables())
            {
                tableAccessor.ResolveTable(t);
                contextDatabases.Add(t.Database());
            }

            var rules = JoinParser.ParseCustomRules(Properties.Settings.Default.CustomRules);

            foreach (var rule in rules)
            {
                foreach (var t in rule.AllTables())
                {
                    tableAccessor.ResolveTable(t);
                }
            }
            foreach (var contextDatabase in contextDatabases)
            {
                rules.AddRange(tableAccessor.GetForeignKeyRules(contextDatabase));
            }
            foreach (var t1 in context.AllTables())
            {
                foreach (var t2 in context.AllTables())
                {
                    if (t1 != t2)
                    {
                        bool hasRule = false;
                        foreach (var rule in rules)
                        {
                            if (rule.Match(t1, t2))
                            {
                                hasRule = true;
                                break;
                            }
                        }
                        if (hasRule)
                        {
                            continue;
                        }
                        var generated = RuleGenerator.Create(t1, t2);
                        if (generated != null)
                        {
                            rules.AddRange(generated);
                        }
                    }
                }
            }

            var options = new List <Tuple <string, string, int> >();

            if (context.newTable != null)
            {
                foreach (var rule in rules)
                {
                    foreach (var table in context.joinedTables)
                    {
                        var applied = rule.Apply(table, context.newTable);
                        if (applied != null)
                        {
                            if (!context.hasGlue)
                            {
                                applied = "\n  on " + applied;
                            }
                            options.Add(Tuple.Create(applied, rule.name, rule.priority));
                        }
                    }
                }
            }
            else
            {
                var usedAliases = new List <string>();
                foreach (var table in context.joinedTables)
                {
                    usedAliases.Add(table.Alias());
                }
                foreach (var rule in rules)
                {
                    foreach (var table in context.joinedTables)
                    {
                        var matched = rule.Match(table);
                        if (matched != null)
                        {
                            matched = matched.NewWithUniqueAlias(usedAliases);
                            string applied = context.hasGlue ? "" : "\njoin ";
                            applied += matched.Def(database) + "\n  on ";
                            applied += rule.Apply(table, matched);
                            options.Add(Tuple.Create(applied, rule.name, rule.priority));
                        }
                    }
                }
            }

            if (options.Count == 0)
            {
                return(false);
            }

            var items = new List <Common.ChooseItem.Item>();

            foreach (var option in options)
            {
                var searchTerms = new List <Common.ChooseItem.SearchTerm>();
                searchTerms.Add(new Common.ChooseItem.SearchTerm(option.Item1, option.Item3 + 100));
                searchTerms.Add(new Common.ChooseItem.SearchTerm(option.Item2, option.Item3));
                items.Add(new Common.ChooseItem.Item(option.Item1, option.Item2, searchTerms.ToArray()));
            }

            Common.ChooseItem dialog = new Common.ChooseItem(items.ToArray(), null);
            PlaceFormAtCaret(application, dialog);
            if (dialog.ShowDialog() != System.Windows.Forms.DialogResult.OK)
            {
                return(false);
            }
            string result = dialog.Result();

            if (result.StartsWith("\n") && Regex.IsMatch(body, @"\n\s*$"))
            {
                result = result.Substring(1);
            }
            if (!Regex.IsMatch(result, @"^\s") && !Regex.IsMatch(body, @"\s$"))
            {
                result = " " + result;
            }
            result = result.Replace("\n", "\n" + context.fromIndent);
            result = result.Replace("\n", Environment.NewLine); // back to crlf
            textDoc.Selection.Insert(result);
            return(true);
        }