Beispiel #1
0
        // 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.");
            }
        }
Beispiel #2
0
        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.");
            }
        }