SQLGenerator.cs 5.5 KB

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