public SelectStatement Where(SelectColumn selectColumn, Operator @operator, string value1, string value2)
        {
            WhereColumn whereColumn = new WhereColumn(selectColumn.Join, selectColumn.ColumnDef, selectColumn.Statement, @operator, value1, value2);

            WhereColumns.Add(whereColumn);

            return(this);
        }
        public SelectStatement SelectCustom(string statement, string type, string alias, ColumnType columnType = ColumnType.SelectWhereOrderBy, string[] dependentOnAliases = null, bool isVisible = true, int sortOrder = 0)
        {
            ColumnDef columnDef = new ColumnDef(null, alias, type, 0, false, false, null);

            SelectColumn selectColumn = new SelectColumn(null, columnDef, alias, columnType, dependentOnAliases, isVisible, sortOrder, Aggregates.None, null, null, statement);

            SelectColumns.Add(selectColumn);

            return(this);
        }
        private void GetJoinAndColumnDef(string column, Action <Join, ColumnDef> action)
        {
            string alias = null;
            string name;

            if (column.Contains("."))
            {
                alias = column.Split('.')[0];
                name  = column.Split('.')[1];
            }
            else
            {
                name = column;

                var allColumnDefs = _builder.ColumnDefs
                                    .Join(Joins, j => j.ObjectDef, cd => cd.ObjectDef, (cd, j) => new { Join = j, ColumnDef = cd })
                                    .Where(item => item.ColumnDef.Name == name)
                                    .ToList();

                if (allColumnDefs.Count == 1)
                {
                    alias = allColumnDefs[0].Join.Alias;
                }
                else if (allColumnDefs.Count(item => item.ColumnDef.IsPrimaryKey) == 1)
                {
                    alias = allColumnDefs.Single(item => item.ColumnDef.IsPrimaryKey).Join.Alias;
                }
            }

            Join      join      = Joins.Single(item => item.Alias == alias);
            ColumnDef columnDef = null;

            if (join.SelectStatement != null)
            {
                SelectColumn selectColumn = join.SelectStatement.SelectColumns.Single(item => item.Alias == name);

                if (selectColumn.AggregateColumnDef != null)
                {
                    columnDef = selectColumn.AggregateColumnDef;
                }
                else
                {
                    throw new NotImplementedException();
                }
            }
            else
            {
                columnDef = _builder.ColumnDefs.Single(item => item.ObjectDef == join.ObjectDef && item.Name == name);
            }

            action(join, columnDef);
        }
        public SelectStatement OrderBy(string alias)
        {
            SelectColumn selectColumn = SelectColumns.Single(item => item.Alias == alias);

            if (Math.Abs(selectColumn.OrderByIndex) == 1)
            {
                selectColumn.OrderByIndex = -selectColumn.OrderByIndex;
            }
            else
            {
                selectColumn.OrderByIndex = 1;

                int so = 2;
                foreach (SelectColumn sc in SelectColumns
                         .Where(item => item.Alias != alias && item.OrderByIndex != 0)
                         .OrderBy(item => Math.Abs(item.OrderByIndex)))
                {
                    sc.OrderByIndex = so++ *(sc.OrderByIndex > 0 ? 1 : -1);
                }
            }

            return(this);
        }
        public SelectStatement Select(string column, string alias = null, ColumnType columnType = ColumnType.SelectWhereOrderBy, bool isVisible = true, int sortOrder = 0, Aggregates aggregate = Aggregates.None, string isNull = null, SelectStatement optionsSelectStatement = null)
        {
            GetJoinAndColumnDef(column, (join, columnDef) =>
            {
                if (String.IsNullOrEmpty(alias))
                {
                    alias = columnDef.Name;
                }

                ColumnDef aggregateColumnDef = null;

                if (aggregate != Aggregates.None)
                {
                    string type = "";

                    if (aggregate == Aggregates.Count)
                    {
                        type = "int";
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }

                    aggregateColumnDef = new ColumnDef(null, alias, type, 0, true, false, null);
                }

                isVisible = isVisible && ((columnType & ColumnType.Identifier) == ColumnType.Identifier || (columnType & ColumnType.Select) == ColumnType.Select);

                SelectColumn selectColumn = new SelectColumn(@join, columnDef, alias, columnType, null, isVisible, sortOrder, aggregate, aggregateColumnDef, isNull, optionsSelectStatement: optionsSelectStatement);

                SelectColumns.Add(selectColumn);
            });

            return(this);
        }