Exemplo n.º 1
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);
            }
        }
Exemplo n.º 2
0
        DbTable GetDbTable(ColumnParts parts)
        {
            foreach (DbColumn c in Query.columnHints)
            {
                if (c.name == parts.t.name)
                {
                    if (parts.alias == null)
                    {
                        return(c.table);
                    }
                    if (c.table.aliases.ContainsKey(parts.alias))
                    {
                        return(c.table);
                    }
                    candidateTables.AddIfNotExists(c.table, parts.t);
                }
            }

            DbTable dbTable = null;
            int     ct      = Query.Db.tablesByColumnName.ValueCount(parts.t.name);

            if (ct == 1)
            {
                dbTable = Query.Db.tablesByColumnName[parts.t.name];
            }
            foreach (DbTable tmp in Query.Db.tablesByColumnName.Each(parts.t.name))
            {
                candidateTables.AddIfNotExists(tmp, parts.t);
            }
            if (dbTable == null && parts.alias == null)
            {
                foreach (DbColumn c in Query.Db.activeColumns)
                {
                    if (c.name == parts.t.name)
                    {
                        return(c.table);
                    }
                }
            }

            if (dbTable == null && parts.alias != null)
            {
                ct = Query.Db.tablesByAlias.ValueCount(parts.alias);
                if (ct == 1 && Query.Db.tablesByAlias[parts.alias].columns.ContainsKey(parts.t.name))
                {
                    dbTable = Query.Db.tablesByAlias[parts.alias];
                }
                foreach (DbTable tmp in Query.Db.tablesByAlias.Each(parts.alias))
                {
                    if (tmp.columns.ContainsKey(parts.t.name))
                    {
                        candidateTables.AddIfNotExists(tmp, parts.t);
                    }
                }
            }

            /*
             * if(dbTable == null)
             * {
             *  ct = 0;
             *  match = null;
             *  foreach(DbTable t in Query.Db.activeTables)
             *  {
             *      if (t.columns.ContainsKey(parts.t.name))
             *      {
             *          match = t.columns[parts.t.name];
             *          ct++;
             *      }
             *  }
             *  if(ct == 1)
             *      dbTable = match.table;
             * }
             */

            return(dbTable);
        }