001
014
015 package com.liferay.portal.dao.orm.hibernate;
016
017 import com.liferay.portal.kernel.util.StringBundler;
018 import com.liferay.portal.kernel.util.StringPool;
019 import com.liferay.portal.kernel.util.StringUtil;
020
021
026 public class DB2Dialect extends org.hibernate.dialect.DB2Dialect {
027
028 public DB2Dialect() {
029 super();
030
031 registerKeyword("for");
032 registerKeyword("optimize");
033 }
034
035 @Override
036 public String getLimitString(String sql, int offset, int limit) {
037 boolean hasOffset = false;
038
039 if ((offset > 0) || forceLimitUsage()) {
040 hasOffset = true;
041 }
042
043 StringBundler sb = null;
044
045 if (hasOffset) {
046 sb = new StringBundler(11);
047 }
048 else {
049 sb = new StringBundler(5);
050 }
051
052 if (!hasOffset) {
053 addQueryForLimitedRows(sb, sql, limit);
054 addOptimizeForLimitedRows(sb, limit);
055
056 return sb.toString();
057 }
058
059
060
061 sb.append("SELECT outerQuery.* FROM (");
062 sb.append("SELECT ROW_NUMBER() OVER() AS rowNumber_, ");
063
064
065
066 sb.append("innerQuery.* FROM (");
067
068 addQueryForLimitedRows(sb, sql, limit);
069
070 sb.append(") AS innerQuery");
071
072
073
074 sb.append(") AS outerQuery WHERE rowNumber_ > ");
075 sb.append(offset);
076
077 addOptimizeForLimitedRows(sb, limit);
078
079 return sb.toString();
080 }
081
082 @Override
083 public boolean supportsVariableLimit() {
084 return _SUPPORTS_VARIABLE_LIMIT;
085 }
086
087 protected void addOptimizeForLimitedRows(StringBundler sb, int limit) {
088 sb.append(StringPool.SPACE);
089 sb.append(
090 StringUtil.replace(
091 _SQL_OPTIMIZE_FOR_LIMITED_ROWS, "[$LIMIT$]",
092 String.valueOf(limit)));
093 }
094
095 protected void addQueryForLimitedRows(
096 StringBundler sb, String sql, int limit) {
097
098 sb.append(sql);
099 sb.append(StringPool.SPACE);
100 sb.append(
101 StringUtil.replace(
102 _SQL_FETCH_FIRST_LIMITED_ROWS_ONLY, "[$LIMIT$]",
103 String.valueOf(limit)));
104 }
105
106 private static final String _SQL_FETCH_FIRST_LIMITED_ROWS_ONLY =
107 "FETCH FIRST [$LIMIT$] ROWS ONLY";
108
109 private static final String _SQL_OPTIMIZE_FOR_LIMITED_ROWS =
110 "OPTIMIZE FOR [$LIMIT$] ROWS";
111
112 private static final boolean _SUPPORTS_VARIABLE_LIMIT = false;
113
114 }