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); } }
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); }