package cn.org.rapid_framework.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.util.Assert;
public class SqlRemoveUtils {
private static int indexOfByRegex(String input,String regex) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
if(m.find()) {
return m.start();
}
return -1;
}
/**
* 去除select 子句,未考虑union的情况
* @param sql
* @return
*/
public static String removeSelect(String sql) {
Assert.hasText(sql);
int beginPos = indexOfByRegex(sql.toLowerCase(),"\\sfrom\\s");
Assert.isTrue(beginPos != -1, " sql : " + sql + " must has a keyword 'from'");
return sql.substring(beginPos);
}
/**
* 去除orderby 子句
* @param sql
* @return
*/
public static String removeOrders(String sql) {
Assert.hasText(sql);
Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(sql);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "");
}
m.appendTail(sb);
return sb.toString();
}
public static String removeFetchKeyword(String sql) {
return sql.replaceAll("(?i)fetch", "");
}
public static String removeXsqlBuilderOrders(String string) {
Assert.hasText(string);
Pattern p = Pattern.compile("/~.*order\\s*by[\\w|\\W|\\s|\\S]*~/", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(string);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "");
}
m.appendTail(sb);
return removeOrders(sb.toString());
}
}