private static string[] GetNames(Bamboo.Query.Query.SelectStatement selectStatement) { string[] names = new string[1 + selectStatement.Joins.Count]; names[0] = selectStatement.From; System.Collections.IList joins = selectStatement.Joins; for (int i = 0; i < joins.Count; i++) { names[i + 1] = GetTableName(((Bamboo.Query.Query.JoinClause)joins[i]).RightColumn); } return(names); }
// This is without query optimization. private static Bamboo.Query.Planning.Node NaivePlan(object query, Bamboo.Query.Database database) { if (query is Bamboo.Query.Query.UnionStatement) { Bamboo.Query.Query.UnionStatement unionStatement = (Bamboo.Query.Query.UnionStatement)query; return(new UnionNode(NaivePlan(unionStatement.A, database), NaivePlan(unionStatement.B, database))); } else if (query is Bamboo.Query.Query.SelectStatement) { Bamboo.Query.Query.SelectStatement selectStatement = (Bamboo.Query.Query.SelectStatement)query; System.Collections.Hashtable tables = database.Lookup(GetNames(selectStatement)); // FROM string name = selectStatement.From; Bamboo.Query.Planning.Node node = new Bamboo.Query.Planning.TableScanNode(name, (Bamboo.Query.Table)tables[name]); // JOIN foreach (Bamboo.Query.Query.JoinClause joinClause in selectStatement.Joins) { name = GetTableName(joinClause.RightColumn); node = new Bamboo.Query.Planning.JoinNode(node, new Bamboo.Query.Planning.TableScanNode(name, (Bamboo.Query.Table)tables[name]), joinClause.LeftColumn, joinClause.RightColumn); } // WHERE if (selectStatement.Where != null) { node = new Bamboo.Query.Planning.WhereNode(node, selectStatement.Where); } // GROUP BY if (selectStatement.GroupBy.Count > 0) { node = new Bamboo.Query.Planning.GroupByNode(node, selectStatement.GroupBy, selectStatement.Select); } // SELECT node = new Bamboo.Query.Planning.SelectNode(node, selectStatement.Select); // ORDER BY if (selectStatement.OrderBy != null) { node = new Bamboo.Query.Planning.OrderByNode(node, selectStatement.OrderBy); } return(node); } else { throw new System.Exception("Invalid query."); } }
private static System.Collections.ICollection GetColumns(object query) { if (query is Bamboo.Query.Query.UnionStatement) { Bamboo.Query.Query.UnionStatement unionStatement = (Bamboo.Query.Query.UnionStatement)query; return(GetColumns(unionStatement.A)); } else if (query is Bamboo.Query.Query.SelectStatement) { Bamboo.Query.Query.SelectStatement selectStatement = (Bamboo.Query.Query.SelectStatement)query; System.Collections.ArrayList columns = new System.Collections.ArrayList(selectStatement.Select.Count); foreach (Bamboo.Query.Query.Column column in selectStatement.Select) { columns.Add(GetColumnName(column)); } return(columns); } else { throw new System.Exception("Invalid query."); } }