/**
* Copyright © 2015-2015 Jeedcp All rights reserved.
* <p>
* Copyright (c) 2011-2014, hubin (jobob@qq.com).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
/**
* Copyright (c) 2011-2014, hubin (jobob@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.baomidou.mybatisplus.plugins.pagination.dialects;
import com.baomidou.mybatisplus.plugins.pagination.IDialect;
/**
* <p>
* DB2 数据库分页方言
* </p>
*
* @author hubin
* @Date 2016-11-10
*/
public class DB2Dialect implements IDialect {
public static final DB2Dialect INSTANCE = new DB2Dialect();
private static String getRowNumber(String originalSql) {
StringBuilder rownumber = new StringBuilder(50).append("rownumber() over(");
int orderByIndex = originalSql.toLowerCase().indexOf("order by");
if (orderByIndex > 0 && !hasDistinct(originalSql)) {
rownumber.append(originalSql.substring(orderByIndex));
}
rownumber.append(") as rownumber_,");
return rownumber.toString();
}
private static boolean hasDistinct(String originalSql) {
return originalSql.toLowerCase().contains("select distinct");
}
public String buildPaginationSql(String originalSql, int offset, int limit) {
int startOfSelect = originalSql.toLowerCase().indexOf("select");
StringBuilder pagingSelect = new StringBuilder(originalSql.length() + 100)
.append(originalSql.substring(0, startOfSelect)).append("select * from ( select ")
.append(getRowNumber(originalSql));
if (hasDistinct(originalSql)) {
pagingSelect.append(" row_.* from ( ").append(originalSql.substring(startOfSelect)).append(" ) as row_");
} else {
pagingSelect.append(originalSql.substring(startOfSelect + 6));
}
pagingSelect.append(" ) as temp_ where rownumber_ ");
// add the restriction to the outer select
if (offset > 0) {
String endString = offset + "+" + limit;
pagingSelect.append("between ").append(offset).append("+1 and ").append(endString);
} else {
pagingSelect.append("<= ").append(limit);
}
return null;
}
}