001package com.avaje.ebean.config.dbplatform;
002
003/**
004 * Adds LIMIT OFFSET clauses to a SQL query.
005 */
006public class LimitOffsetSqlLimiter implements SqlLimiter {
007
008  /**
009   * LIMIT keyword.
010   */
011  private static final String LIMIT = "limit";
012
013  /**
014   * OFFSET keyword.
015   */
016  private static final String OFFSET = "offset";
017
018  public SqlLimitResponse limit(SqlLimitRequest request) {
019
020    String dbSql = request.getDbSql();
021    
022    StringBuilder sb = new StringBuilder(50 + dbSql.length());
023    sb.append("select ");
024    if (request.isDistinct()) {
025      sb.append("distinct ");
026    }
027
028    sb.append(dbSql);
029
030    int firstRow = request.getFirstRow();
031    int maxRows = request.getMaxRows();
032
033    if (maxRows > 0 || firstRow > 0) {
034      sb.append(" ").append(LIMIT).append(" ").append(maxRows);
035      if (firstRow > 0) {
036        sb.append(" ").append(OFFSET).append(" ");
037        sb.append(firstRow);
038      }
039    }
040
041    String sql = request.getDbPlatform().completeSql(sb.toString(), request.getOrmQuery());
042
043    return new SqlLimitResponse(sql, false);
044  }
045
046}