From 7b179480bd716393f0c792dba80b1b25c7d0038f Mon Sep 17 00:00:00 2001 From: Daniel Cohen Gindi Date: Thu, 23 Nov 2017 18:06:34 +0200 Subject: [PATCH] More OrderBy overloads to receive Phrase, values and stuff --- dg.Sql/Sql/Base Types/ValueWrapper.cs | 36 ++++++++- dg.Sql/Sql/Query/OrderBys.cs | 14 ++++ dg.Sql/Sql/QueryKeywords/OrderBy.cs | 109 ++++++++++++++++---------- 3 files changed, 117 insertions(+), 42 deletions(-) diff --git a/dg.Sql/Sql/Base Types/ValueWrapper.cs b/dg.Sql/Sql/Base Types/ValueWrapper.cs index 8ec3619f..ffba4245 100644 --- a/dg.Sql/Sql/Base Types/ValueWrapper.cs +++ b/dg.Sql/Sql/Base Types/ValueWrapper.cs @@ -15,6 +15,7 @@ public class ValueWrapper public ValueWrapper() { + this.Type = ValueObjectType.Value; } public ValueWrapper(string tableName, object value, ValueObjectType type) @@ -113,16 +114,47 @@ public string Build(ConnectorBase conn, Query relatedQuery = null) } else if (Type == ValueObjectType.Value) { - ret += @"(" + conn.PrepareValue(Value, relatedQuery) + @")"; + ret += "(" + conn.PrepareValue(Value, relatedQuery) + ")"; } else { - ret += Value; + ret += Value.ToString(); } return ret; } + public void Build(StringBuilder outputBuilder, ConnectorBase conn, Query relatedQuery = null) + { + if (Type == ValueObjectType.ColumnName) + { + if (TableName != null && TableName.Length > 0) + { + outputBuilder.Append(conn.WrapFieldName(TableName)); + outputBuilder.Append("."); + } + + outputBuilder.Append(conn.WrapFieldName(Value.ToString())); + } + else if (Type == ValueObjectType.Value) + { + if (Value is dg.Sql.Where) + { + outputBuilder.Append("("); + ((dg.Sql.Where)Value).BuildCommand(outputBuilder, true, conn, relatedQuery); + outputBuilder.Append(")"); + } + else + { + outputBuilder.Append("(" + conn.PrepareValue(Value, relatedQuery) + ")"); + } + } + else + { + outputBuilder.Append(Value.ToString()); + } + } + #endregion } } diff --git a/dg.Sql/Sql/Query/OrderBys.cs b/dg.Sql/Sql/Query/OrderBys.cs index b10bd948..a05c4b42 100644 --- a/dg.Sql/Sql/Query/OrderBys.cs +++ b/dg.Sql/Sql/Query/OrderBys.cs @@ -39,6 +39,20 @@ public Query OrderBy(string tableName, string columnName, SortDirection sortDire return this; } + public Query OrderBy(object value, ValueObjectType valueType, SortDirection sortDirection) + { + if (_ListOrderBy == null) _ListOrderBy = new OrderByList(); + _ListOrderBy.Add(new OrderBy(value, valueType, sortDirection)); + return this; + } + + public Query OrderBy(IPhrase phrase, SortDirection sortDirection) + { + if (_ListOrderBy == null) _ListOrderBy = new OrderByList(); + _ListOrderBy.Add(new OrderBy(phrase, sortDirection)); + return this; + } + private Query OrderBy(OrderBy orderBy) { if (_ListOrderBy == null) _ListOrderBy = new OrderByList(); diff --git a/dg.Sql/Sql/QueryKeywords/OrderBy.cs b/dg.Sql/Sql/QueryKeywords/OrderBy.cs index 43c610ff..1fbbf4aa 100644 --- a/dg.Sql/Sql/QueryKeywords/OrderBy.cs +++ b/dg.Sql/Sql/QueryKeywords/OrderBy.cs @@ -45,31 +45,60 @@ public void BuildCommand(StringBuilder outputBuilder, ConnectorBase conn, Query public class OrderBy { - public string TableName; - public object ColumnName; + public ValueWrapper Value = new ValueWrapper(); + + [Obsolete] + public string TableName + { + get { return Value.TableName; } + set { Value.TableName = value; } + } + + [Obsolete] + public object ColumnName + { + get { return Value.Value; } + set { Value.Value = value; } + } + public SortDirection SortDirection; internal bool Randomize = false; - internal bool IsLiteral = false; #region Constructors public OrderBy(string columnName, SortDirection sortDirection) { - this.ColumnName = columnName; + Value.Value = columnName; + Value.Type = ValueObjectType.ColumnName; this.SortDirection = sortDirection; } - public OrderBy(object columnName, SortDirection sortDirection, bool isLiteral) + public OrderBy(string tableName, string columnName, SortDirection sortDirection) { - this.ColumnName = columnName; + Value.TableName = tableName; + Value.Value = columnName; + Value.Type = ValueObjectType.ColumnName; this.SortDirection = sortDirection; - this.IsLiteral = isLiteral; } - public OrderBy(string tableName, string columnName, SortDirection sortDirection) + public OrderBy(object value, SortDirection sortDirection, bool isLiteral) + { + Value.Value = value; + Value.Type = isLiteral ? ValueObjectType.Literal : ValueObjectType.Value; + this.SortDirection = sortDirection; + } + + public OrderBy(object value, ValueObjectType valueType, SortDirection sortDirection) + { + Value.Value = value; + Value.Type = valueType; + this.SortDirection = sortDirection; + } + + public OrderBy(IPhrase phrase, SortDirection sortDirection) { - this.TableName = tableName; - this.ColumnName = columnName; + Value.Value = phrase; + Value.Type = ValueObjectType.Value; this.SortDirection = sortDirection; } @@ -85,11 +114,11 @@ public OrderByList Then(string columnName, SortDirection sortDirection) return list; } - public OrderByList Then(object columnName, SortDirection sortDirection, bool isLiteral) + public OrderByList Then(object value, SortDirection sortDirection, bool isLiteral) { var list = new OrderByList(); list.Add(this); - list.Add(new OrderBy(columnName, sortDirection, isLiteral)); + list.Add(new OrderBy(value, sortDirection, isLiteral)); return list; } @@ -101,8 +130,24 @@ public OrderByList Then(string tableName, string columnName, SortDirection sortD return list; } + public OrderByList Then(object value, ValueObjectType valueType, SortDirection sortDirection) + { + var list = new OrderByList(); + list.Add(this); + list.Add(new OrderBy(value, valueType, sortDirection)); + return list; + } + + public OrderByList Then(IPhrase phrase, SortDirection sortDirection) + { + var list = new OrderByList(); + list.Add(this); + list.Add(new OrderBy(phrase, sortDirection)); + return list; + } + #endregion - + public void BuildCommand(StringBuilder outputBuilder, ConnectorBase conn, Query relatedQuery, bool invert = false) { if (this.Randomize) @@ -123,42 +168,26 @@ public void BuildCommand(StringBuilder outputBuilder, ConnectorBase conn, Query break; case ConnectorBase.SqlServiceType.MSACCESS: - if (this.TableName != null) outputBuilder.Append(@"RND(" + conn.WrapFieldName(this.TableName) + @"." + conn.WrapFieldName(this.ColumnName.ToString()) + @")"); - else outputBuilder.Append(@"RND(" + conn.WrapFieldName(this.ColumnName.ToString()) + @")"); + if (Value != null) + { + outputBuilder.Append(@"RND(" + Value.Build(conn) + @")"); + } + else + { + outputBuilder.Append(@"RND(NULL)"); + } break; } } else { - if (conn.TYPE == ConnectorBase.SqlServiceType.MSACCESS && relatedQuery != null && relatedQuery.Schema != null && !this.IsLiteral) + if (conn.TYPE == ConnectorBase.SqlServiceType.MSACCESS && relatedQuery != null && relatedQuery.Schema != null && Value.Type != ValueObjectType.Literal) { - TableSchema.Column col = relatedQuery.Schema.Columns.Find(this.ColumnName.ToString()); + TableSchema.Column col = relatedQuery.Schema.Columns.Find(Value.Value.ToString()); if (col != null && col.ActualDataType == DataType.Boolean) outputBuilder.Append(@" NOT "); } - if (this.ColumnName is dg.Sql.IPhrase) - { - outputBuilder.Append(((dg.Sql.IPhrase)this.ColumnName).BuildPhrase(conn, relatedQuery)); - } - else if (this.ColumnName is dg.Sql.Where) - { - ((dg.Sql.Where)this.ColumnName).BuildCommand(outputBuilder, true, conn, relatedQuery); - } - else if (this.IsLiteral) - { - outputBuilder.Append(this.ColumnName); - } - else - { - if (this.TableName != null) - { - outputBuilder.Append(conn.WrapFieldName(this.TableName) + @"." + conn.WrapFieldName(this.ColumnName.ToString())); - } - else - { - outputBuilder.Append(conn.WrapFieldName(this.ColumnName.ToString())); - } - } + Value.Build(outputBuilder, conn); switch (this.SortDirection) {