Skip to content

Commit

Permalink
Improving SqlBuilder (#82)
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastienros committed Jan 18, 2018
1 parent e398c45 commit f0eb030
Show file tree
Hide file tree
Showing 10 changed files with 196 additions and 234 deletions.
9 changes: 7 additions & 2 deletions src/YesSql.Abstractions/ISqlBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
using System.Collections.Generic;
using System.Collections.Generic;

namespace YesSql
{
public interface ISqlBuilder
{
string Clause { get; }
Dictionary<string, object> Parameters { get; }
string Trail { get; set; }
string FormatColumn(string table, string column);
string GetSelector();
void InnerJoin(string table, string onTable, string onColumn, string toTable, string toColumn);
Expand All @@ -15,11 +14,17 @@ public interface ISqlBuilder
void Select();
void Selector(string selector);
void Selector(string table, string column);
void AddSelector(string select);
void InsertSelector(string select);
void Skip(int skip);
void Table(string table);
void Take(int take);
void ThenOrderBy(string orderBy);
void ThenOrderByDescending(string orderBy);
void Having(string having);
void GroupBy(string groupBy);
void Trail(string trail);
void ClearTrail();
string ToSqlString(ISqlDialect dialect, bool ignoreOrderBy = false);
void WhereAlso(string where);
}
Expand Down
193 changes: 161 additions & 32 deletions src/YesSql.Provider.Common/SqlBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Text;

namespace YesSql.Sql
Expand All @@ -10,11 +11,22 @@ public abstract class SqlBuilder : ISqlBuilder

protected string _clause;
protected string _table;
protected string _selector;

protected StringBuilder _join;
protected string _where;
protected string _order;
protected List<string> _select;
protected List<string> _join;
protected List<string> _where;
protected List<string> _group;
protected List<string> _having;
protected List<string> _order;
protected List<string> _trail;

protected List<string> SelectSegments => _select = _select ?? new List<string>();
protected List<string> JoinSegments => _join = _join ?? new List<string>();
protected List<string> WhereSegments => _where = _where ?? new List<string>();
protected List<string> GroupSegments => _group = _group ?? new List<string>();
protected List<string> HavingSegments => _having = _having ?? new List<string>();
protected List<string> OrderSegments => _order = _order ?? new List<string>();
protected List<string> TrailSegments => _trail = _trail ?? new List<string>();

protected int _skip;
protected int _count;
Expand Down Expand Up @@ -46,36 +58,50 @@ public void Take(int take)

public virtual void InnerJoin(string table, string onTable, string onColumn, string toTable, string toColumn)
{
if (_join == null)
{
_join = new StringBuilder();
}

_join.Append("inner join ").Append(_dialect.QuoteForTableName(_tablePrefix + table))
.Append(" on ").Append(_dialect.QuoteForTableName(_tablePrefix + onTable))
.Append(".").Append(_dialect.QuoteForColumnName(onColumn))
.Append(" = ").Append(_dialect.QuoteForTableName(_tablePrefix + toTable))
.Append(".").Append(_dialect.QuoteForColumnName(toColumn)).Append(" ");
JoinSegments.AddRange(new[] {
"INNER JOIN ", _dialect.QuoteForTableName(_tablePrefix + table),
" ON ", _dialect.QuoteForTableName(_tablePrefix + onTable), ".", _dialect.QuoteForColumnName(onColumn),
" = ", _dialect.QuoteForTableName(_tablePrefix + toTable), ".", _dialect.QuoteForColumnName(toColumn), " "
}
);
}

public void Select()
{
_clause = "select";
_clause = "SELECT";
}

public void Selector(string selector)
{
_selector = selector;
SelectSegments.Clear();
SelectSegments.Add(selector);
}

public void Selector(string table, string column)
{
_selector = FormatColumn(table, column);
Selector(FormatColumn(table, column));
}

public void AddSelector(string select)
{
SelectSegments.Add(select);
}

public void InsertSelector(string select)
{
SelectSegments.Insert(0, select);
}

public string GetSelector()
{
return _selector;
if (SelectSegments.Count == 1)
{
return SelectSegments[0];
}
else
{
return string.Join("", SelectSegments);
}
}

public virtual string FormatColumn(string table, string column)
Expand All @@ -90,39 +116,142 @@ public virtual string FormatColumn(string table, string column)

public virtual void WhereAlso(string where)
{
if (_where == null)
if (WhereSegments.Count > 0)
{
_where = where;
}
else
{
_where += " and " + where;
WhereSegments.Add(" AND ");
}

WhereSegments.Add(where);
}

public virtual void OrderBy(string orderBy)
{
_order = orderBy;
OrderSegments.Add(orderBy);
}

public virtual void OrderByDescending(string orderBy)
{
_order = orderBy + " desc";
OrderSegments.Add(orderBy);
OrderSegments.Add(" DESC");
}

public virtual void ThenOrderBy(string orderBy)
{
_order += ", " + orderBy;
OrderSegments.Add(", ");
OrderSegments.Add(orderBy);
}

public virtual void ThenOrderByDescending(string orderBy)
{
_order += ", " + orderBy + " desc";
OrderSegments.Add(", ");
OrderSegments.Add(orderBy);
OrderSegments.Add(" DESC");
}

public string Trail { get; set; }
public virtual void GroupBy(string orderBy)
{
GroupSegments.Add(orderBy);
}

public virtual void Having(string orderBy)
{
HavingSegments.Add(orderBy);
}

public virtual void Trail(string segment)
{
TrailSegments.Add(segment);
}

public virtual void ClearTrail()
{
TrailSegments.Clear();
}

public virtual string ToSqlString(ISqlDialect dialect, bool ignoreOrderBy = false)
{
if (String.Equals(_clause, "SELECT", StringComparison.OrdinalIgnoreCase))
{
if ((_skip != 0 || _count != 0))
{
dialect.Page(this, _skip, _count);
}

var sb = new StringBuilder();

sb.Append("SELECT ");

foreach (var s in _select)
{
sb.Append(s);
}

sb.Append(" FROM ").Append(_dialect.QuoteForTableName(_tablePrefix + _table));

if (_join != null)
{
sb.Append(" ");

foreach (var s in _join)
{
sb.Append(s);
}
}

if (_where != null)
{
sb.Append(" WHERE ");

foreach (var s in _where)
{
sb.Append(s);
}
}

if (_order != null && !ignoreOrderBy)
{
sb.Append(" ORDER BY ");

foreach (var s in _order)
{
sb.Append(s);
}
}

if (_group != null)
{
sb.Append(" GROUP BY ");

foreach (var s in _group)
{
sb.Append(s);
}
}

if (_having != null)
{
sb.Append(" HAVING ");

foreach (var s in _having)
{
sb.Append(s);
}
}

if (_trail != null)
{
sb.Append(" ");

foreach (var s in _trail)
{
sb.Append(s);
}
}

return sb.ToString();
}

public abstract string ToSqlString(ISqlDialect dialect, bool ignoreOrderBy = false);

return "";
}
}
}
18 changes: 9 additions & 9 deletions src/YesSql.Provider.MySql/MySqlDialect.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,16 +100,16 @@ public override string GetDropForeignKeyConstraintString(string name)

public override void Page(ISqlBuilder sqlBuilder, int offset, int limit)
{
if (offset == 0 && limit != 0)
if (limit != 0)
{
// Insert LIMIT clause after the select
var selector = sqlBuilder.GetSelector();
selector = " " + selector + " limit " + limit;
sqlBuilder.Selector(selector);
}
else if (offset != 0 || limit != 0)
{
sqlBuilder.Trail = "OFFSET " + offset + " ROWS FETCH FIRST " + limit + " ROWS ONLY";
sqlBuilder.Trail(" LIMIT ");
sqlBuilder.Trail(limit.ToString());

if (offset != 0)
{
sqlBuilder.Trail(" OFFSET ");
sqlBuilder.Trail(offset.ToString());
}
}
}

Expand Down
44 changes: 0 additions & 44 deletions src/YesSql.Provider.MySql/MySqlSqlBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using System;
using System.Text;
using YesSql.Sql;

namespace YesSql.Provider.MySql
Expand All @@ -9,47 +7,5 @@ public class MySqlSqlBuilder : SqlBuilder
public MySqlSqlBuilder(string tablePrefix, ISqlDialect dialect) : base(tablePrefix, dialect)
{
}

public override string ToSqlString(ISqlDialect dialect, bool ignoreOrderBy = false)
{
if (_clause == "select")
{
var sb = new StringBuilder();
sb
.Append(_clause).Append(" ").Append(_selector)
.Append(" from ").Append(_dialect.QuoteForTableName(_tablePrefix + _table));

if (_join != null)
{
sb.Append(" ").Append(_join.ToString());
}

if (_where != null)
{
sb.Append(" where ").Append(_where);
}

if (_order != null && !ignoreOrderBy)
{
sb.Append(" order by ").Append(_order);
}

if (!String.IsNullOrEmpty(Trail))
{
sb.Append(" ").Append(Trail);
}

if (_skip != 0 || _count != 0)
{
_selector = sb.ToString();
dialect.Page(this, _skip, _count);
sb.Clear();
sb.Append(_selector);
}
return sb.ToString();
}

return "";
}
}
}
12 changes: 4 additions & 8 deletions src/YesSql.Provider.PostgreSql/PostgreSqlDialect.cs
Original file line number Diff line number Diff line change
Expand Up @@ -114,22 +114,18 @@ public override string GetDropForeignKeyConstraintString(string name)

public override void Page(ISqlBuilder sqlBuilder, int offset, int limit)
{
var sb = new StringBuilder();

sb.Append(" limit ");
sqlBuilder.Trail(" limit ");

if (limit != 0)
{
sb.Append(limit);
sqlBuilder.Trail(limit.ToString());
}

if (offset != 0)
{
sb.Append(" offset ");
sb.Append(offset);
sqlBuilder.Trail(" offset ");
sqlBuilder.Trail(offset.ToString());
}

sqlBuilder.Trail = sb.ToString();
}

public override string QuoteForColumnName(string columnName)
Expand Down
Loading

0 comments on commit f0eb030

Please sign in to comment.