示例#1
0
        public override TokenList GetChildren()
        {
            TokenList children = new TokenList();

            children.Add(select);
            children.Add(from);
            children.Add(where);
            children.Add(group);
            children.Add(order);
            children.Add(limit);

            if (children.Count == 0)
            {
                foreach (Query q in queries)
                {
                    children.Add(q);
                }
            }


            return(children);
        }
示例#2
0
        public override void Build()
        {
            TokenList fromTokens = GetTokensWithin();

            for (int i = 0; i < tables.tokens.Count - 1; i++)
            {
                Table     leftTable  = tables[i] as Table;
                Table     rightTable = tables[i + 1] as Table;
                TokenList joinTokens = fromTokens.GetNextTokens(leftTable, new[] { TokenType.Keyword }, null, rightTable.startOffset);
                string    joinType   = joinTokens.GetNames();
                Token     onToken    = fromTokens.GetNearestTokenAfter(rightTable, TokenType.Keyword, "on");
                if (joinType.Contains("join") && onToken != null)
                {
                    joinTokens.Add(onToken);
                    TokenList joinExpression = fromTokens.GetNextTokens(onToken,
                                                                        new[] { TokenType.Literal, TokenType.Operator, TokenType.Column }, null, rightExtent);
                    if (joinExpression.Count > 0)
                    {
                        leftTable.AddJoin(joinType, rightTable, joinTokens, joinExpression);
                    }
                }
            }
        }
示例#3
0
        void FindColumns(bool includeParents)
        {
            TableList tablesInScope = GetTablesInScope(includeParents);
            TokenList tokenList     = tokens.GetTokensWithin(this, new[] { TokenType.Identifier });

            foreach (Token t in tokenList.tokens)
            {
                DbColumn   dbColumn = null;
                Column     column   = null;
                Table      table    = null;
                string     alias    = null;
                Identifier tAlias   = t.GetPrevToken(TokenType.Identifier) as Identifier;
                if (tAlias != null && tAlias.charAfter == '.' && t.charBefore == '.')
                {
                    alias = tAlias.name;
                }
                if (alias != null)
                {
                    table = tablesInScope.GetTableForAlias(alias, t.name);
                }

                /*
                 * if(alias != null)
                 * {
                 *  foreach (string tableName in Db.GetPossibleTablesForAlias(alias))
                 *  {
                 *      if(Db.tables[tableName].columns.ContainsKey(t.name))
                 *  }
                 *      sc.AddColumnsInTable(t, alias);
                 *
                 * }
                 *
                 * if (table == null && select != null)
                 * {
                 *  foreach (DbTable dbTable in select.candidateTables.Keys)
                 *  {
                 *      table = tablesInScope.GetTableForDbTableColumn(dbTable, t.name);
                 *      if (table != null)
                 *          break;
                 *  }
                 * }
                 */

                if (table == null)
                {
                    foreach (Table tabl in tablesInScope.tokens)
                    {
                        if (tabl.dbTable != null && tabl.dbTable.columns.ContainsKey(t.name))
                        {
                            if (alias == null || tabl.dbTable.aliases.ContainsKey(alias))
                            {
                                table = tabl;
                                break;
                            }
                        }
                    }
                }
                if (table != null)
                {
                    if (table.dbTable != null)
                    {
                        dbColumn = table.dbTable.columns[t.name];
                    }
                    else if (table.subquery != null)
                    {
                        column = table.subquery.GetSelectColumn(t.name, alias);
                    }
                    AddColumnToQuery(new Column(t as Identifier, tAlias, table, dbColumn));
                }
            }
        }
示例#4
0
        public int Different(TokenList list, bool onlySignificantOnes = false, int max = 1)
        {
            TokenList result;

            return(Difference(list, out result, onlySignificantOnes, max));
        }
示例#5
0
 public TokenListVisitor(TokenType t, TokenList list = null)
 {
     tokens = list == null ? new TokenList() : list;
     types  = new[] { t };
 }
示例#6
0
        public void Parse(ColumnParts parts)
        {
            TokenList elements = tokens.GetTokensWithin(select, parts.start, parts.end);

            if (elements.Count <= 0 || elements.Count > 4)
            {
                return;
            }
            else if (elements.Count == 1)
            {
                parts.t = elements[0] as Identifier;
            }
            else if (elements.Count == 2)
            {
                if (elements[0].charAfter == '.' && elements[1].charBefore == '.')
                {
                    parts.tTableAlias = elements[0] as Identifier;
                    parts.t           = elements[1] as Identifier;
                }
                else
                {
                    parts.t = elements[0] as Identifier;
                }
            }
            else if (elements.Count == 3)
            {
                parts.tTableAlias  = elements[0] as Identifier;
                parts.t            = elements[1] as Identifier;
                parts.tColumnAlias = elements[2] as Identifier;
            }
            else if (elements.Count == 4)
            {
                parts.tTableAlias  = elements[0] as Identifier;
                parts.t            = elements[1] as Identifier;
                parts.tAs          = elements[2] as Keyword;
                parts.tColumnAlias = elements[3] as Identifier;
            }
            else
            {
                throw new ArgumentException();
            }
            if (parts.t == null)
            {
                return;
            }

            if (elements.Count == 1)
            {
                if (parts.t.charAfter == '.')
                {
                    if (Query.rootQuery.expression.Substring(parts.t.rightExtent).StartsWith(".*"))
                    {
                        Table t = select.parentQuery.from.tables.GetTableForAlias(parts.t.name);
                        if (t != null)
                        {
                            AddColumn(new Column(parts.t, t));
                            return;
                        }
                    }
                }
            }


            if (parts.tTableAlias != null && parts.tTableAlias.charAfter == '.' && parts.t.charBefore == '.' && select.parentQuery.from != null)
            {
                parts.alias = parts.tTableAlias.name;
            }
            if (parts.alias != null && select.parentQuery.from != null)
            {
                parts.table = select.parentQuery.from.tables.GetTableForAlias(parts.alias, parts.t.name);
            }
            if (parts.table == null && parts.t != null && select.parentQuery.from != null)
            {
                parts.table = select.parentQuery.from.tables.GetTableForColumnName(parts.t.name, parts.alias);
            }
            if (parts.table == null)
            {
                parts.dbTable = GetDbTable(parts);
            }

            if (parts.table != null)
            {
                AddColumn(new Column(parts.tAs, parts.tColumnAlias, parts.t, parts.tTableAlias, parts.table));
            }
            else if (parts.dbTable != null)
            {
                AddColumn(new Column(parts.tAs, parts.tColumnAlias, parts.t, parts.tTableAlias, parts.dbTable, parts.alias));
            }
            else
            {
                strays.Add(parts);
            }
        }
示例#7
0
 public SelectColumnParser(Select s, QDict <DbTable, Token> c)
 {
     select          = s;
     candidateTables = c;
     tokens          = select.GetTokensWithin(null);
 }