Skip to content

Commit

Permalink
More OrderBy overloads to receive Phrase, values and stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
danielgindi committed Nov 23, 2017
1 parent 9d3dc0b commit 7b17948
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 42 deletions.
36 changes: 34 additions & 2 deletions dg.Sql/Sql/Base Types/ValueWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public class ValueWrapper

public ValueWrapper()
{
this.Type = ValueObjectType.Value;
}

public ValueWrapper(string tableName, object value, ValueObjectType type)
Expand Down Expand Up @@ -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
}
}
14 changes: 14 additions & 0 deletions dg.Sql/Sql/Query/OrderBys.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
109 changes: 69 additions & 40 deletions dg.Sql/Sql/QueryKeywords/OrderBy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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)
Expand All @@ -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)
{
Expand Down

0 comments on commit 7b17948

Please sign in to comment.