예제 #1
0
        protected int GetIndex(Bamboo.Query.Query.Column column, System.Collections.IEnumerable columnCoordinates)
        {
            //TODO DELETE
            //if (column is Bamboo.Query.Query.FunctionColumn)
            //{
            //    Bamboo.Query.Query.FunctionColumn functionColumn = (Bamboo.Query.Query.FunctionColumn)column;

            //    string name = functionColumn.Function + "(" + functionColumn.Identifier + ")";
            //    foreach (ColumnCoordinate columnCoordinate in columnCoordinates)
            //    {
            //        if (columnCoordinate.Name.Equals(name))
            //        {
            //            return columnCoordinate.Index;
            //        }
            //    }
            //}
            //else
            //{
            foreach (ColumnCoordinate columnCoordinate in columnCoordinates)
            {
                if (columnCoordinate.Name.Equals(column.Identifier))
                {
                    return(columnCoordinate.Index);
                }
            }
            //}
            throw new System.Exception("Column does not exist: " + column.Identifier);
        }
예제 #2
0
        private static string GetColumnName(Bamboo.Query.Query.Column column)
        {
            if (column.Alias != null && column.Alias.Length > 0)
            {
                return(column.Alias);
            }
            else if (column.Identifier.IndexOf("(") != -1)
            {
                string identifier       = column.Identifier;
                string function         = identifier.Substring(0, identifier.IndexOf("("));
                int    start            = identifier.IndexOf("(") + 1;
                string columnIdentifier = identifier.Substring(start, identifier.Length - (start + 1));

                if (columnIdentifier.IndexOf(".") != -1)
                {
                    return(columnIdentifier.Substring(columnIdentifier.LastIndexOf(".") + 1));
                }
                else
                {
                    return(columnIdentifier);
                }
            }
            else
            {
                if (column.Identifier.IndexOf(".") != -1)
                {
                    return(column.Identifier.Substring(column.Identifier.LastIndexOf(".") + 1));
                }
                else
                {
                    return(column.Identifier);
                }
            }
        }
예제 #3
0
        public GroupByNode(Bamboo.Query.Planning.Node node, System.Collections.IList groupBy, System.Collections.IList select)
        {
            this._node = node;

            int[] indexes = GetIndexes(groupBy, this._node.ColumnCoordinates);
            Bamboo.Query.Aggregators.Aggregator[] aggregators = GetAggregators(select);

            this._indexes     = indexes;
            this._aggregators = aggregators;

            ColumnCoordinate[] columnCoordinates = new ColumnCoordinate[groupBy.Count + aggregators.Length];
            int i;

            for (i = 0; i < groupBy.Count; i++)
            {
                Bamboo.Query.Query.Column column = (Bamboo.Query.Query.Column)groupBy[i];
                columnCoordinates[i] = new ColumnCoordinate(column.Identifier, i);
            }
            foreach (Bamboo.Query.Query.Column column in select)
            {
                if (column.Identifier.IndexOf("(") != -1)
                {
                    string identifier       = column.Identifier;
                    string function         = identifier.Substring(0, identifier.IndexOf("("));
                    int    start            = identifier.IndexOf("(") + 1;
                    string columnIdentifier = identifier.Substring(start, identifier.Length - (start + 1));
                    columnCoordinates[i] = new ColumnCoordinate(function + "(" + columnIdentifier + ")", i);
                    i++;
                }
            }
            this._columnCoordinates = columnCoordinates;
        }
예제 #4
0
        //TODO
        private static Bamboo.Query.Query.Column CreateColumn(string identifier, string alias, string from)
        {
            if (identifier.IndexOf(".") == -1)
            {
                //TODO do a check.
                //if (joins.Count > 0)
                //{
                //    throw new System.Exception("Invalid column name: " + identifier);
                //}

                if (identifier.IndexOf("(") == -1)
                {
                    identifier = from + "." + identifier;
                }
                else
                {
                    string function         = identifier.Substring(0, identifier.IndexOf("("));
                    int    start            = identifier.IndexOf("(") + 1;
                    string columnIdentifier = identifier.Substring(start, identifier.Length - (start + 1));

                    identifier = function + "(" + from + "." + columnIdentifier + ")";
                }
            }
            Bamboo.Query.Query.Column column = new Bamboo.Query.Query.Column(identifier, alias);
            return(column);
        }
예제 #5
0
        public SelectNode(Bamboo.Query.Planning.Node node, System.Collections.IList select)
        {
            this._node    = node;
            this._indexes = GetIndexes(select, this._node.ColumnCoordinates);

            ColumnCoordinate[] columnCoordinates = new ColumnCoordinate[select.Count];
            for (int i = 0; i < columnCoordinates.Length; i++)
            {
                Bamboo.Query.Query.Column column = (Bamboo.Query.Query.Column)select[i];
                columnCoordinates[i] = new ColumnCoordinate(column.Identifier, i);
            }
            this._columnCoordinates = columnCoordinates;
        }
예제 #6
0
        private static string GetTableName(Bamboo.Query.Query.Column column)
        {
            string identifier = column.Identifier;

            if (identifier.IndexOf(".") != -1)
            {
                return(identifier.Substring(0, identifier.IndexOf(".")));
            }
            else
            {
                return("");
            }
        }
예제 #7
0
        private static System.Collections.IList GetGroupBy(System.Collections.ArrayList tokens, string from)
        {
            System.Collections.ArrayList groupBy = new System.Collections.ArrayList();

            foreach (string token in tokens)
            {
                if (!token.Equals(","))
                {
                    Bamboo.Query.Query.Column column = CreateColumn(token, from);
                    groupBy.Add(column);
                }
            }

            return(groupBy);
        }
예제 #8
0
        private static Bamboo.Query.Query.JoinClause GetJoin(System.Collections.ArrayList tokens)
        {
            System.Text.StringBuilder Table        = new System.Text.StringBuilder();
            System.Text.StringBuilder OnColumn     = new System.Text.StringBuilder();
            System.Text.StringBuilder EqualsColumn = new System.Text.StringBuilder();
            System.Text.StringBuilder current      = Table;

            for (int i = 0; i < tokens.Count; i++)
            {
                string token = (string)tokens[i];

                if (token.ToUpper().Equals("ON"))
                {
                    current = OnColumn;
                }
                else if (token.ToUpper().Equals("="))
                {
                    current = EqualsColumn;
                }
                else
                {
                    current.Append(token);
                }
            }



            string tableName = Table.ToString();

            //ON
            Bamboo.Query.Query.Column onColumn = CreateJoinColumn(OnColumn.ToString());
            //=
            Bamboo.Query.Query.Column equalsColumn = CreateJoinColumn(EqualsColumn.ToString());

            if (tableName.Equals(GetTableName(onColumn)))
            {
                return(new Bamboo.Query.Query.JoinClause(equalsColumn, onColumn));
            }
            else if (tableName.Equals(GetTableName(equalsColumn)))
            {
                return(new Bamboo.Query.Query.JoinClause(onColumn, equalsColumn));
            }
            else
            {
                throw new System.Exception("Invalid join.");
            }
        }
예제 #9
0
        private Bamboo.Query.Aggregators.Aggregator ToAggregator(Bamboo.Query.Query.Column column)
        {
            string identifier       = column.Identifier;
            string aggregator       = identifier.Substring(0, identifier.IndexOf("("));
            int    start            = identifier.IndexOf("(") + 1;
            string columnIdentifier = identifier.Substring(start, identifier.Length - (start + 1));

            switch (aggregator.ToUpper())
            {
            case "SUM":
            {
                return(new Bamboo.Query.Aggregators.SumDoubleAggregator(GetIndex(new Bamboo.Query.Query.Column(columnIdentifier), this._node.ColumnCoordinates)));
            }

            case "SUMINT":
            {
                return(new Bamboo.Query.Aggregators.SumIntAggregator(GetIndex(new Bamboo.Query.Query.Column(columnIdentifier), this._node.ColumnCoordinates)));
            }

            case "SUMDOUBLE":
            {
                return(new Bamboo.Query.Aggregators.SumDoubleAggregator(GetIndex(new Bamboo.Query.Query.Column(columnIdentifier), this._node.ColumnCoordinates)));
            }

            case "COUNT":
            {
                return(new Bamboo.Query.Aggregators.CountAggregator(GetIndex(new Bamboo.Query.Query.Column(columnIdentifier), this._node.ColumnCoordinates)));
            }

            case "INC":
            {
                return(new Bamboo.Query.Aggregators.IncrementAggregator());
            }

            default:
            {
                throw new System.Exception("Unknown function: " + aggregator);
            }
            }
        }
예제 #10
0
        private static void GenerateSelect(SelectStatement query, System.Text.StringBuilder stringBuilder)
        {
            if (query.Select.Count == 0)
            {
                return;
            }

            stringBuilder.Append("SELECT");
            stringBuilder.Append(" ");
            for (int i = 0; i < query.Select.Count; i++)
            {
                Bamboo.Query.Query.Column column = (Bamboo.Query.Query.Column)query.Select[i];

                if (i != 0)
                {
                    stringBuilder.Append(", ");
                }

                // TODO Watch out for functions.
                Escape(stringBuilder, column.Identifier);
            }
        }
예제 #11
0
 public NotEqualsPredicate(Bamboo.Query.Query.Column column, object value)
 {
     this._column = column;
     this._value  = value;
 }
예제 #12
0
 public JoinClause(Bamboo.Query.Query.Column leftColumn, Bamboo.Query.Query.Column rightColumn)
 {
     this._leftColumn  = leftColumn;
     this._rightColumn = rightColumn;
 }
예제 #13
0
 public GreaterThanPredicate(Bamboo.Query.Query.Column column, System.IComparable value)
 {
     this._column = column;
     this._value  = value;
 }
예제 #14
0
        public JoinNode(Bamboo.Query.Planning.Node leftNode, Bamboo.Query.Planning.Node rightNode, Bamboo.Query.Query.Column leftColumn, Bamboo.Query.Query.Column rightColumn)
        {
            this._leftNode      = leftNode;
            this._rightNode     = rightNode;
            this._leftRowIndex  = GetIndex(leftColumn, this._leftNode.ColumnCoordinates);
            this._rightRowIndex = GetIndex(rightColumn, this._rightNode.ColumnCoordinates);

            System.Collections.IEnumerable leftNodeColumnCoordinates  = this._leftNode.ColumnCoordinates;
            System.Collections.IEnumerable rightNodeColumnCoordinates = this._rightNode.ColumnCoordinates;

            int length = 0;

            foreach (ColumnCoordinate columnCoordinate in leftNodeColumnCoordinates)
            {
                object ignore = columnCoordinate;
                length++;
            }
            foreach (ColumnCoordinate columnCoordinate in rightNodeColumnCoordinates)
            {
                object ignore = columnCoordinate;
                length++;
            }

            ColumnCoordinate[] columnCoordinates = new ColumnCoordinate[length];
            int i = 0;

            foreach (ColumnCoordinate columnCoordinate in leftNodeColumnCoordinates)
            {
                columnCoordinates[i] = new ColumnCoordinate(columnCoordinate.Name, i);
                i++;
            }
            foreach (ColumnCoordinate columnCoordinate in rightNodeColumnCoordinates)
            {
                columnCoordinates[i] = new ColumnCoordinate(columnCoordinate.Name, i);
                i++;
            }
            this._columnCoordinates = columnCoordinates;
        }