SQLGenerator.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. using System.Collections.Generic;
  2. namespace FastReport.FastQueryBuilder
  3. {
  4. internal class SQLGenerator
  5. {
  6. private Query query;
  7. private List<Table> tableHasAlias = new List<Table>();
  8. public string qch;
  9. public SQLGenerator(Query qr)
  10. {
  11. query = qr;
  12. }
  13. public string getSql()
  14. {
  15. tableHasAlias.Clear();
  16. string result = "";
  17. result += getSelect();
  18. result += getFrom();
  19. result += getWhere();
  20. result += getGroup();
  21. result += getOrder();
  22. return result;
  23. }
  24. private string getGroup()
  25. {
  26. string result = "";
  27. foreach (Field fld in query.GroupedFields)
  28. {
  29. result += fld.getFullName(qch) + ", ";
  30. }
  31. if (result != "")
  32. return "GROUP BY " + result.Substring(0, result.Length - 2) + "\r\n";
  33. else
  34. return "";
  35. }
  36. private string getOrder()
  37. {
  38. string result = "";
  39. foreach (Field fld in query.SelectedFields)
  40. {
  41. if (!string.IsNullOrEmpty(fld.Order))
  42. result += fld.getFullName(qch) + " " + fld.Order + ", ";
  43. }
  44. if (result != "")
  45. return "ORDER BY " + result.Substring(0, result.Length - 2) + "\r\n";
  46. else
  47. return "";
  48. }
  49. private string getSelect()
  50. {
  51. if (query.SelectedFields.Count == 0)
  52. return "SELECT 1 ";
  53. string result = "";
  54. foreach (Field fld in query.SelectedFields)
  55. {
  56. if (!string.IsNullOrEmpty(fld.Func))
  57. result += fld.Func + '(' + fld.getFullName(qch) + ')';
  58. else
  59. result += fld.getFullName(qch);
  60. if (fld.Alias.Length != 0)
  61. result += " AS " + fld.Alias;
  62. result += ", ";
  63. }
  64. return "SELECT " + result.Remove(result.Length - 2) + "\r\n";
  65. }
  66. private string getJoin(Link lnk)
  67. {
  68. string result = QueryEnums.JoinTypesToStr[(int)lnk.Join] + " " +
  69. lnk.To.Table.getFromName(qch, !tableHasAlias.Contains(lnk.To.Table)) + " ON " +
  70. lnk.From.getFullName(qch, !tableHasAlias.Contains(lnk.From.Table)) +
  71. " " + QueryEnums.WhereTypesToStr[(int)lnk.Where] + " " +
  72. lnk.To.getFullName(qch, !tableHasAlias.Contains(lnk.To.Table)) + " \r\n";
  73. tableHasAlias.Add(lnk.To.Table);
  74. return result;
  75. }
  76. private string getFrom()
  77. {
  78. if (query.TableList.Count == 0)
  79. return "";
  80. string result = "";
  81. List<Table> tableList = new List<Table>();
  82. foreach (Table tbl in query.TableList)
  83. {
  84. tableList.Add(tbl);
  85. }
  86. foreach (Link lnk in query.LinkList)
  87. {
  88. if (lnk.Join != QueryEnums.JoinTypes.Where)
  89. {
  90. if (result == "")
  91. {
  92. result += lnk.From.Table.getFromName(qch) + " ";
  93. tableList.Remove(lnk.From.Table);
  94. result += getJoin(lnk);
  95. }
  96. else
  97. {
  98. result = "(" + result + ") " + getJoin(lnk);
  99. }
  100. tableList.Remove(lnk.To.Table);
  101. }
  102. else
  103. {
  104. if (!tableList.Contains(lnk.To.Table))
  105. {
  106. if (result != "")
  107. result += ", ";
  108. result += lnk.To.Table.getFromName(qch);
  109. tableList.Remove(lnk.To.Table);
  110. }
  111. }
  112. }
  113. foreach (Table tbl in tableList)
  114. {
  115. if (result != "")
  116. result += ", ";
  117. result += tbl.getFromName(qch);
  118. }
  119. return "FROM " + result + "\r\n";
  120. }
  121. private string getWhere()
  122. {
  123. string result = "";
  124. foreach (Field fld in query.SelectedFields)
  125. {
  126. if (!string.IsNullOrEmpty(fld.Filter))
  127. result += fld.getFullName(qch) + fld.Filter + " AND ";
  128. }
  129. if (query.LinkList.Count != 0)
  130. {
  131. foreach (Link lnk in query.LinkList)
  132. {
  133. string wop = "";
  134. if (lnk.Join == QueryEnums.JoinTypes.Where)
  135. {
  136. wop = QueryEnums.WhereTypesToStr[(int)lnk.Where];
  137. result += lnk.From.getFullName(qch) + " " + wop + " " + lnk.To.getFullName(qch) + " AND ";
  138. }
  139. }
  140. }
  141. if (result != "")
  142. {
  143. result = result.Substring(0, result.Length - 5);
  144. return "WHERE " + result + "\r\n";
  145. }
  146. return "";
  147. }
  148. }
  149. }