Skip to content

Commit 3aa520a

Browse files
committed
HHH-19956: Add InterSystemsIRISLimitHandler.java
1 parent abf29fd commit 3aa520a

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.community.dialect.pagination;
6+
7+
import org.hibernate.dialect.pagination.AbstractLimitHandler;
8+
import org.hibernate.query.spi.Limit;
9+
import java.util.Locale;
10+
11+
public class InterSystemsIRISLimitHandler extends AbstractLimitHandler {
12+
public static final InterSystemsIRISLimitHandler INSTANCE = new InterSystemsIRISLimitHandler(true);
13+
14+
private final boolean variableLimit;
15+
16+
public InterSystemsIRISLimitHandler(boolean variableLimit) {
17+
this.variableLimit = variableLimit;
18+
}
19+
20+
@Override
21+
public String processSql(String sql, Limit limit) {
22+
23+
boolean hasFirstRow = hasFirstRow(limit);
24+
boolean hasMaxRows = hasMaxRows(limit);
25+
26+
if (!hasFirstRow && !hasMaxRows) {
27+
return sql;
28+
}
29+
30+
String lowersql = sql.toLowerCase(Locale.ROOT);
31+
int selectIndex = lowersql.indexOf("select");
32+
if (hasFirstRow && hasMaxRows) {
33+
return new StringBuilder(sql.length() + 27)
34+
.append(sql)
35+
.insert(selectIndex + 6, " %ROWOFFSET ? %ROWLIMIT ? ")
36+
.toString();
37+
38+
}
39+
else if (hasFirstRow) {
40+
return new StringBuilder(sql.length() + 15)
41+
.append(sql)
42+
.insert(selectIndex + 6, " %ROWOFFSET ? ")
43+
.toString();
44+
}
45+
else {
46+
final int selectDistinctIndex = lowersql.indexOf("select distinct");
47+
final int insertionPoint = selectIndex + (selectDistinctIndex == selectIndex ? 15 : 6);
48+
49+
return new StringBuilder(sql.length() + 8)
50+
.append(sql)
51+
.insert(insertionPoint, " TOP ? ")
52+
.toString();
53+
}
54+
}
55+
56+
57+
@Override
58+
public final boolean supportsLimit() {
59+
return true;
60+
}
61+
62+
@Override
63+
public final boolean supportsOffset() {
64+
return true;
65+
}
66+
67+
@Override
68+
public boolean supportsLimitOffset() {
69+
return true;
70+
}
71+
72+
@Override
73+
public final boolean supportsVariableLimit() {
74+
return true;
75+
}
76+
77+
@Override
78+
public boolean useMaxForLimit() {
79+
return false;
80+
}
81+
82+
@Override
83+
public boolean bindLimitParametersFirst() {
84+
return true;
85+
}
86+
87+
}

0 commit comments

Comments
 (0)