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); }
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); } } } }
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)); } } }
public int Different(TokenList list, bool onlySignificantOnes = false, int max = 1) { TokenList result; return(Difference(list, out result, onlySignificantOnes, max)); }
public TokenListVisitor(TokenType t, TokenList list = null) { tokens = list == null ? new TokenList() : list; types = new[] { t }; }
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); } }
public SelectColumnParser(Select s, QDict <DbTable, Token> c) { select = s; candidateTables = c; tokens = select.GetTokensWithin(null); }