Guest User

Untitled

a guest
Jun 21st, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.56 KB | None | 0 0
  1. import java.util.LinkedHashSet;
  2.  
  3. public class QueryBuilder {
  4.  
  5. private String _select = "*";
  6. private String _tableName = "<table>";
  7. private QueryBuilder _from = null;
  8. private final LinkedHashSet<String> _joins = new LinkedHashSet<>();
  9. private Where _where;
  10. private String _orderBy = "";
  11. private int _index = 0;
  12. private int _limit = 0;
  13. private QueryBuilder _union = null;
  14. private boolean _union_all = false;
  15.  
  16. /**
  17. * Atributos de seleccion de la consulta.
  18. *
  19. * @param select atributos
  20. * @return
  21. */
  22. public QueryBuilder select(String... select) {
  23. StringBuilder sb = new StringBuilder();
  24. for (int i = 0; i < select.length; i++) {
  25. if (i > 0) sb.append(',');
  26. sb.append(select[i]);
  27. }
  28. _select = sb.toString();
  29. return this;
  30. }
  31.  
  32. /**
  33. * Genera la parte FROM de la consulta.
  34. *
  35. * @param tableName nombre de la tabla
  36. * @return
  37. */
  38. public QueryBuilder from(String tableName) {
  39. return from(tableName, null);
  40. }
  41.  
  42. /**
  43. * Genera la parte FROM de la consulta.
  44. *
  45. * @param as nombre de alias
  46. * @param from subQuery
  47. * @return
  48. */
  49. public QueryBuilder from(String as, QueryBuilder from) {
  50. _tableName = as;
  51. _from = from;
  52. return this;
  53. }
  54.  
  55. /**
  56. * Genera la parte JOIN de la consulta
  57. *
  58. * @param table table t2
  59. * @param condition t1.field = t2.field
  60. * @return
  61. */
  62. public QueryBuilder join(String table, String condition) {
  63. return join(table, condition, null);
  64. }
  65.  
  66. /**
  67. * Genera la parte JOIN de la consulta
  68. *
  69. * @param table table t2
  70. * @param condition t1.field = t2.field
  71. * @param type left, inner
  72. * @return
  73. */
  74. public QueryBuilder join(String table, String condition, String type/*LEFT*/) {
  75. final StringBuilder join = new StringBuilder();
  76. if (type != null) join.append(type).append(" ");
  77. join.append("JOIN ")
  78. .append(table.trim())
  79. .append(" ON ")
  80. .append(condition.trim())
  81. ;
  82. _joins.add(join.toString());
  83. return this;
  84. }
  85.  
  86. /**
  87. * Genera la parte ORDER BY de la consulta
  88. *
  89. * @param orderBy
  90. * @return
  91. */
  92. public QueryBuilder orderBy(String orderBy) {
  93. _orderBy = orderBy;
  94. return this;
  95. }
  96.  
  97. public QueryBuilder limit(int limit) {
  98. return limit(0, limit);
  99. }
  100.  
  101. public QueryBuilder limit(int index, int limit) {
  102. _index = index;
  103. _limit = limit;
  104. return this;
  105. }
  106.  
  107. public QueryBuilder union(QueryBuilder union) {
  108. return _union(false, union);
  109. }
  110.  
  111. public QueryBuilder unionAll(QueryBuilder union) {
  112. return _union(true, union);
  113. }
  114.  
  115. private QueryBuilder _union(boolean all, QueryBuilder union) {
  116. _union_all = all;
  117. _union = union;
  118. return this;
  119. }
  120.  
  121. @Override public String toString() {
  122. // SELECT:
  123. StringBuilder sql = new StringBuilder();
  124. sql.append("SELECT ").append(_select);
  125.  
  126. // FROM:
  127. sql.append("\nFROM ");
  128. if (_from != null) {
  129. sql.append("(\n").append(_from.toString()).append("\n) AS ");
  130. }
  131. sql.append(_tableName);
  132.  
  133. // JOIN:
  134. for (String join : _joins) {
  135. sql.append("\n").append(join);
  136. }
  137.  
  138. // WHERE:
  139. if (_where != null) {
  140. sql.append("\nWHERE ").append(_where.toString());
  141. }
  142.  
  143. // UNION:
  144. if (_union != null) {
  145. sql.append("\nUNION").append(_union_all ?" ALL\n" :"\n").append(_union.toString());
  146. }
  147.  
  148. // ORDER BY:
  149. if (_orderBy != null && !_orderBy.isEmpty()) {
  150. sql.append("\nORDER BY ").append(_orderBy);
  151. }
  152.  
  153. // LIMIT:
  154. if (_index > 0 && _limit > 0) {
  155. sql.append("\nLIMIT ").append(_index).append(",").append(_limit);
  156. } else if (_limit > 0) {
  157. sql.append("\nLIMIT ").append(_limit);
  158. }
  159.  
  160. return sql.toString();
  161. }
  162.  
  163. public Where where() {
  164. if (_where == null) _where = new Where(this);
  165. return _where;
  166. }
  167.  
  168. public static class Where {
  169. private final QueryBuilder qs;
  170. private final StringBuilder sql = new StringBuilder();
  171. private int countClauses = 0;
  172.  
  173. public Where(QueryBuilder querySelect) {
  174. qs = querySelect;
  175. }
  176.  
  177. public Where and() {
  178. if (countClauses > 0) {
  179. sql.append("\nAND");
  180. }
  181. return this;
  182. }
  183.  
  184. public Where or() {
  185. if (countClauses > 0) {
  186. sql.append("\nOR");
  187. }
  188. return this;
  189. }
  190.  
  191. public Where not() {
  192. sql.append(" NOT");
  193. return this;
  194. }
  195.  
  196. public Where clause(String columnName, String op, Object value) {
  197. sql.append(" ")
  198. .append(columnName.trim())
  199. .append(" ").append(op.trim()).append(" ")
  200. .append(toValue(value))
  201. ;
  202. countClauses++;
  203. return this;
  204. }
  205.  
  206. public Where like(String columnName, Object value) {
  207. return clause(columnName, "LIKE", value);
  208. }
  209.  
  210. public Where between(String columnName, Object low, Object high) {
  211. sql.append(" ")
  212. .append(columnName)
  213. .append(" BETWEEN ")
  214. .append(toValue(low))
  215. .append(" AND ")
  216. .append(toValue(high))
  217. ;
  218. countClauses++;
  219. return this;
  220. }
  221.  
  222. public Where in(String columnName, Object... values) {
  223. sql.append(" ");
  224. sql.append(columnName);
  225. sql.append(" IN (");
  226. for (int i = 0; i < values.length; i++) {
  227. if (i > 0) sql.append(", ");
  228. sql.append(toValue(values[i]));
  229. }
  230. sql.append(")");
  231. countClauses++;
  232. return this;
  233. }
  234.  
  235. public Where in(String columnName, QueryBuilder qs) {
  236. sql.append(" ")
  237. .append(columnName)
  238. .append(" IN (\n")
  239. .append(qs.toString())
  240. .append("\n)")
  241. ;
  242. countClauses++;
  243. return this;
  244. }
  245.  
  246. public Where exists(QueryBuilder qs) {
  247. // EXISTS (SELECT * FROM `producto` WHERE `id` = 0 )
  248. sql.append(" EXISTS (\n")
  249. .append(qs.toString())
  250. .append("\n)")
  251. ;
  252. countClauses++;
  253. return this;
  254. }
  255.  
  256. public Where str(String str) {
  257. sql.append(str);
  258. return this;
  259. }
  260.  
  261. public QueryBuilder endWhere() {
  262. return qs;
  263. }
  264.  
  265. @Override public String toString() {
  266. return sql.toString();
  267. }
  268.  
  269. public static String toValue(Object value) {
  270. if (value == null) {
  271. return "NULL ";
  272. } else {
  273. String newValue = value.toString().replace("'", "\\'");
  274. return new StringBuilder(newValue.length() + 2)
  275. .append('\'')
  276. .append(newValue)
  277. .append('\'')
  278. .toString();
  279. }
  280. }
  281. }
  282.  
  283. public static void main(String[] args) {
  284. QueryBuilder qs = new QueryBuilder()
  285. .select("*")
  286. .from("vmesacontrol")
  287. .where() // -->
  288. .and().between("CAST(fechaCaso as DATE)", "2018-04-14", "2018-06-30")
  289. .and().in("visible", 0, 1)
  290. .and().clause("idAgente", "=", 14)
  291. .and()
  292. .str("(\n")
  293. .like("cliente", "%ka%")
  294. .or().like("empresa", "%ka%")
  295. .str("\n)")
  296. .or().in("idCaso", new QueryBuilder()
  297. .select("idCaso")
  298. .from("vmesacontrol")
  299. .where() // -->
  300. .and().between("CAST(plazoPostergacion as DATE)", "2018-04-14", "2018-06-30")
  301. .and().in("visible", 0, 1, -1)
  302. .and().clause("idAgente", "=", 14)
  303. .and()
  304. .str("(\n")
  305. .like("cliente", "%ka%")
  306. .or().like("empresa", "%ka%")
  307. .str("\n)")
  308. .endWhere() // <--
  309. )
  310. .endWhere() // <--
  311. .orderBy("idCaso DESC");
  312.  
  313. System.out.println(qs.toString());
  314. }
  315. }
Add Comment
Please, Sign In to add comment