You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

OracleGenerator.java 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. @VaadinApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.data.util.sqlcontainer.query.generator;
  5. import java.util.List;
  6. import com.vaadin.data.Container.Filter;
  7. import com.vaadin.data.util.sqlcontainer.query.OrderBy;
  8. import com.vaadin.data.util.sqlcontainer.query.generator.filter.QueryBuilder;
  9. @SuppressWarnings("serial")
  10. public class OracleGenerator extends DefaultSQLGenerator {
  11. public OracleGenerator() {
  12. }
  13. /**
  14. * Construct an OracleSQLGenerator with the specified identifiers for start
  15. * and end of quoted strings. The identifiers may be different depending on
  16. * the database engine and it's settings.
  17. *
  18. * @param quoteStart
  19. * the identifier (character) denoting the start of a quoted
  20. * string
  21. * @param quoteEnd
  22. * the identifier (character) denoting the end of a quoted string
  23. */
  24. public OracleGenerator(String quoteStart, String quoteEnd) {
  25. super(quoteStart, quoteEnd);
  26. }
  27. /*
  28. * (non-Javadoc)
  29. *
  30. * @see com.vaadin.addon.sqlcontainer.query.generator.DefaultSQLGenerator#
  31. * generateSelectQuery(java.lang.String, java.util.List,
  32. * com.vaadin.addon.sqlcontainer.query.FilteringMode, java.util.List, int,
  33. * int, java.lang.String)
  34. */
  35. @Override
  36. public StatementHelper generateSelectQuery(String tableName,
  37. List<Filter> filters, List<OrderBy> orderBys, int offset,
  38. int pagelength, String toSelect) {
  39. if (tableName == null || tableName.trim().equals("")) {
  40. throw new IllegalArgumentException("Table name must be given.");
  41. }
  42. /* Adjust offset and page length parameters to match "row numbers" */
  43. offset = pagelength > 1 ? ++offset : offset;
  44. pagelength = pagelength > 1 ? --pagelength : pagelength;
  45. toSelect = toSelect == null ? "*" : toSelect;
  46. StatementHelper sh = new StatementHelper();
  47. StringBuffer query = new StringBuffer();
  48. /* Row count request is handled here */
  49. if ("COUNT(*)".equalsIgnoreCase(toSelect)) {
  50. query.append(String.format(
  51. "SELECT COUNT(*) AS %s FROM (SELECT * FROM %s",
  52. QueryBuilder.quote("rowcount"), tableName));
  53. if (filters != null && !filters.isEmpty()) {
  54. query.append(QueryBuilder.getWhereStringForFilters(filters, sh));
  55. }
  56. query.append(")");
  57. sh.setQueryString(query.toString());
  58. return sh;
  59. }
  60. /* SELECT without row number constraints */
  61. if (offset == 0 && pagelength == 0) {
  62. query.append("SELECT ").append(toSelect).append(" FROM ")
  63. .append(tableName);
  64. if (filters != null) {
  65. query.append(QueryBuilder.getWhereStringForFilters(filters, sh));
  66. }
  67. if (orderBys != null) {
  68. for (OrderBy o : orderBys) {
  69. generateOrderBy(query, o, orderBys.indexOf(o) == 0);
  70. }
  71. }
  72. sh.setQueryString(query.toString());
  73. return sh;
  74. }
  75. /* Remaining SELECT cases are handled here */
  76. query.append(String
  77. .format("SELECT * FROM (SELECT x.*, ROWNUM AS %s FROM (SELECT %s FROM %s",
  78. QueryBuilder.quote("rownum"), toSelect, tableName));
  79. if (filters != null) {
  80. query.append(QueryBuilder.getWhereStringForFilters(filters, sh));
  81. }
  82. if (orderBys != null) {
  83. for (OrderBy o : orderBys) {
  84. generateOrderBy(query, o, orderBys.indexOf(o) == 0);
  85. }
  86. }
  87. query.append(String.format(") x) WHERE %s BETWEEN %d AND %d",
  88. QueryBuilder.quote("rownum"), offset, offset + pagelength));
  89. sh.setQueryString(query.toString());
  90. return sh;
  91. }
  92. }