using System;
using System.Collections.Generic;
using System.Text;
namespace FastReport.FastQueryBuilder
{
class SQLGenerator
{
private Query query;
private List
tableHasAlias = new List
();
public string qch;
public SQLGenerator(Query qr)
{
query = qr;
}
public string getSql()
{
tableHasAlias.Clear();
string result = "";
result += getSelect();
result += getFrom();
result += getWhere();
result += getGroup();
result += getOrder();
return result;
}
private string getGroup()
{
string result = string.Empty;
foreach (Field fld in query.groupedFields)
result += fld.getFullName(qch) + ", ";
if (result.Length > 0)
return "GROUP BY " + result.Substring(0, result.Length - 2) + "\r\n";
else
return string.Empty;
}
private string getOrder()
{
string result = string.Empty;
foreach (Field fld in query.selectedFields)
if (fld.Order != null)
result += fld.getFullName(qch) + " " + fld.Order + ", ";
if (result.Length > 0)
return "ORDER BY " + result.Substring(0, result.Length - 2) + "\r\n";
else
return string.Empty;
}
private string getSelect()
{
if (query.selectedFields.Count == 0)
return string.Empty;
string result = "";
foreach (Field fld in query.selectedFields)
{
string tmp;
if (fld.Func != null)
tmp = fld.Func + '(' + fld.getFullName(qch) + ')';
else
tmp = fld.getFullName(qch);
result += tmp;
if (fld.Alias.Length != 0)
result += " AS " + fld.Alias;
result += ", ";
}
return "SELECT " + result.Remove(result.Length - 2) + "\r\n";
}
private bool ThereIsTableInJoin(Table table, List linkList)
{
foreach (Link lnk in linkList)
if ((lnk.from.table == table) || (lnk.to.table == table))
return true;
return false;
}
private string getJoin(Link lnk)
{
string result = QueryEnums.JoinTypesToStr[(int)lnk.join] + " " +
lnk.to.table.getFromName(qch, !tableHasAlias.Contains(lnk.to.table)) + " ON " +
lnk.from.getFullName(qch, !tableHasAlias.Contains(lnk.from.table)) +
" " + QueryEnums.WhereTypesToStr[1][(int)lnk.where] + " " +
lnk.to.getFullName(qch, !tableHasAlias.Contains(lnk.to.table)) + " \r\n";
tableHasAlias.Add(lnk.to.table);
return result;
}
private string getFrom()
{
if (query.tableList.Count == 0)
return string.Empty;
string result = "";
List
tableList = new List
();
foreach (Table tbl in query.tableList)
tableList.Add(tbl);
foreach (Link lnk in query.linkList)
{
if (lnk.join != QueryEnums.JoinTypes.Where)
{
if (result == string.Empty)
{
result += lnk.from.table.getFromName(qch) + " ";
tableList.Remove(lnk.from.table);
result += getJoin(lnk);
}
else
{
result = "(" + result + ") " + getJoin(lnk);
}
tableList.Remove(lnk.to.table);
}
else
{
if (!tableList.Contains(lnk.to.table))
{
if (result != string.Empty)
result += ", ";
result += lnk.to.table.getFromName(qch);
tableList.Remove(lnk.to.table);
}
}
}
foreach (Table tbl in tableList)
{
if (result != string.Empty)
result += ", ";
result += tbl.getFromName(qch);
}
return "FROM " + result + "\r\n";
}
private string getWhere()
{
string result = string.Empty;
foreach (Field fld in query.selectedFields)
if (fld.Filter != string.Empty)
result += fld.getFullName(qch) + fld.Filter + " AND ";
if (query.linkList.Count != 0)
{
foreach (Link lnk in query.linkList)
{
string wop = string.Empty;
if (lnk.join == QueryEnums.JoinTypes.Where)
{
wop = QueryEnums.WhereTypesToStr[1][(int)lnk.where];
result += lnk.from.getFullName(qch) + " " + wop + " " + lnk.to.getFullName(qch) + " AND ";
}
}
}
if (result != string.Empty)
{
result = result.Substring(0, result.Length - 5);
return "WHERE " + result + "\r\n";
}
else
return string.Empty;
}
}
}