[improvement][Chat] Add TimeCorrector and rename the associated SqlParserHelper. (#707)

This commit is contained in:
lexluo09
2024-02-01 15:29:07 +08:00
committed by GitHub
parent 2c1c443b3e
commit 491c76368c
43 changed files with 749 additions and 486 deletions

View File

@@ -0,0 +1,90 @@
package com.tencent.supersonic.common.util.jsqlparser;
import java.util.List;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
import net.sf.jsqlparser.schema.Column;
import org.springframework.util.CollectionUtils;
@Slf4j
public class DateVisitor extends ExpressionVisitorAdapter {
private List<String> filedNames;
private DateBoundInfo dateBoundInfo = new DateBoundInfo();
public DateVisitor(List<String> filedNames) {
this.filedNames = filedNames;
}
@Override
public void visit(GreaterThan expr) {
if (containsField(expr.getLeftExpression())) {
dateBoundInfo.setColumName(SqlSelectHelper.getColumnName(expr.getLeftExpression()));
dateBoundInfo.setLowerBound(expr.getStringExpression());
String columnValue = SqlSelectHelper.getColumValue(expr.getRightExpression());
dateBoundInfo.setLowerDate(columnValue);
}
}
@Override
public void visit(GreaterThanEquals expr) {
if (containsField(expr.getLeftExpression())) {
dateBoundInfo.setColumName(SqlSelectHelper.getColumnName(expr.getLeftExpression()));
dateBoundInfo.setLowerBound(expr.getStringExpression());
String columnValue = SqlSelectHelper.getColumValue(expr.getRightExpression());
dateBoundInfo.setLowerDate(columnValue);
}
}
@Override
public void visit(MinorThanEquals expr) {
if (containsField(expr.getLeftExpression())) {
dateBoundInfo.setColumName(SqlSelectHelper.getColumnName(expr.getLeftExpression()));
dateBoundInfo.setUpperBound(expr.getStringExpression());
String columnValue = SqlSelectHelper.getColumValue(expr.getRightExpression());
dateBoundInfo.setUpperDate(columnValue);
}
}
@Override
public void visit(MinorThan expr) {
if (containsField(expr.getLeftExpression())) {
dateBoundInfo.setColumName(SqlSelectHelper.getColumnName(expr.getLeftExpression()));
dateBoundInfo.setUpperBound(expr.getStringExpression());
String columnValue = SqlSelectHelper.getColumValue(expr.getRightExpression());
dateBoundInfo.setUpperDate(columnValue);
}
}
private boolean containsField(Expression expr) {
if (expr instanceof Column) {
Column column = (Column) expr;
if (!CollectionUtils.isEmpty(filedNames)
&& filedNames.contains(column.getColumnName())) {
return true;
}
}
return false;
}
public DateBoundInfo getDateBoundInfo() {
return dateBoundInfo;
}
@Data
public class DateBoundInfo {
private String columName;
private String lowerBound;
private String lowerDate;
private String upperBound;
private String upperDate;
}
}

View File

@@ -102,7 +102,7 @@ public class FieldlValueReplaceVisitor extends ExpressionVisitorAdapter {
if (Objects.isNull(rightExpression) || Objects.isNull(leftExpression)) {
return;
}
String columnName = SqlParserSelectHelper.getColumnName(leftExpression);
String columnName = SqlSelectHelper.getColumnName(leftExpression);
if (StringUtils.isEmpty(columnName)) {
return;
}

View File

@@ -15,7 +15,7 @@ public class FunctionAliasReplaceVisitor extends SelectItemVisitorAdapter {
public void visit(SelectExpressionItem selectExpressionItem) {
if (selectExpressionItem.getExpression() instanceof Function) {
Function function = (Function) selectExpressionItem.getExpression();
String columnName = SqlParserSelectHelper.getColumnName(function);
String columnName = SqlSelectHelper.getColumnName(function);
//1.exist alias. as
//2.alias's fieldName not equal. "sum(pv) as pv" cannot be replaced.
if (Objects.nonNull(selectExpressionItem.getAlias()) && !selectExpressionItem.getAlias().getName()

View File

@@ -31,10 +31,10 @@ import org.springframework.util.CollectionUtils;
* Sql Parser add Helper
*/
@Slf4j
public class SqlParserAddHelper {
public class SqlAddHelper {
public static String addFieldsToSelect(String sql, List<String> fields) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
// add fields to select
if (selectStatement == null) {
return null;
@@ -63,7 +63,7 @@ public class SqlParserAddHelper {
}
public static String addFunctionToSelect(String sql, List<Expression> expressionList) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
if (selectStatement == null) {
return null;
}
@@ -116,7 +116,7 @@ public class SqlParserAddHelper {
if (StringUtils.isEmpty(column) || Objects.isNull(value)) {
return sql;
}
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
@@ -139,7 +139,7 @@ public class SqlParserAddHelper {
}
public static String addWhere(String sql, Expression expression) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
@@ -157,7 +157,7 @@ public class SqlParserAddHelper {
}
public static String addWhere(String sql, List<Expression> expressionList) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
@@ -182,7 +182,7 @@ public class SqlParserAddHelper {
}
public static String addAggregateToField(String sql, Map<String, String> fieldNameToAggregate) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
@@ -204,7 +204,7 @@ public class SqlParserAddHelper {
if (CollectionUtils.isEmpty(groupByFields)) {
return sql;
}
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
@@ -213,7 +213,7 @@ public class SqlParserAddHelper {
PlainSelect plainSelect = (PlainSelect) selectBody;
GroupByElement groupByElement = new GroupByElement();
List<String> originalGroupByFields = SqlParserSelectHelper.getGroupByFields(sql);
List<String> originalGroupByFields = SqlSelectHelper.getGroupByFields(sql);
if (!CollectionUtils.isEmpty(originalGroupByFields)) {
groupByFields.addAll(originalGroupByFields);
}
@@ -230,7 +230,7 @@ public class SqlParserAddHelper {
if (selectItem instanceof SelectExpressionItem) {
SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem;
Expression expression = selectExpressionItem.getExpression();
Function function = SqlParserSelectFunctionHelper.getFunction(expression, fieldNameToAggregate);
Function function = SqlSelectFunctionHelper.getFunction(expression, fieldNameToAggregate);
if (function == null) {
continue;
}
@@ -246,7 +246,7 @@ public class SqlParserAddHelper {
}
for (OrderByElement orderByElement : orderByElements) {
Expression expression = orderByElement.getExpression();
Function function = SqlParserSelectFunctionHelper.getFunction(expression, fieldNameToAggregate);
Function function = SqlSelectFunctionHelper.getFunction(expression, fieldNameToAggregate);
if (function == null) {
continue;
}
@@ -260,7 +260,7 @@ public class SqlParserAddHelper {
return;
}
for (Expression expression : groupByElement.getGroupByExpressions()) {
Function function = SqlParserSelectFunctionHelper.getFunction(expression, fieldNameToAggregate);
Function function = SqlSelectFunctionHelper.getFunction(expression, fieldNameToAggregate);
if (function == null) {
continue;
}
@@ -277,7 +277,7 @@ public class SqlParserAddHelper {
private static void modifyWhereExpression(Expression whereExpression,
Map<String, String> fieldNameToAggregate) {
if (SqlParserSelectHelper.isLogicExpression(whereExpression)) {
if (SqlSelectHelper.isLogicExpression(whereExpression)) {
AndExpression andExpression = (AndExpression) whereExpression;
Expression leftExpression = andExpression.getLeftExpression();
Expression rightExpression = andExpression.getRightExpression();
@@ -297,7 +297,7 @@ public class SqlParserAddHelper {
ComparisonOperator comparisonOperator = (ComparisonOperator) expression;
if (comparisonOperator.getRightExpression() instanceof Column) {
String columnName = ((Column) (comparisonOperator).getRightExpression()).getColumnName();
Function function = SqlParserSelectFunctionHelper.getFunction(comparisonOperator.getRightExpression(),
Function function = SqlSelectFunctionHelper.getFunction(comparisonOperator.getRightExpression(),
fieldNameToAggregate.get(columnName));
if (Objects.nonNull(function)) {
comparisonOperator.setRightExpression(function);
@@ -305,7 +305,7 @@ public class SqlParserAddHelper {
}
if (comparisonOperator.getLeftExpression() instanceof Column) {
String columnName = ((Column) (comparisonOperator).getLeftExpression()).getColumnName();
Function function = SqlParserSelectFunctionHelper.getFunction(comparisonOperator.getLeftExpression(),
Function function = SqlSelectFunctionHelper.getFunction(comparisonOperator.getLeftExpression(),
fieldNameToAggregate.get(columnName));
if (Objects.nonNull(function)) {
comparisonOperator.setLeftExpression(function);
@@ -314,7 +314,7 @@ public class SqlParserAddHelper {
}
public static String addHaving(String sql, Set<String> fieldNames) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
@@ -339,11 +339,11 @@ public class SqlParserAddHelper {
}
}
}
return SqlParserRemoveHelper.removeNumberFilter(selectStatement.toString());
return SqlRemoveHelper.removeNumberFilter(selectStatement.toString());
}
public static String addHaving(String sql, List<Expression> expressionList) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
@@ -368,7 +368,7 @@ public class SqlParserAddHelper {
}
public static String addParenthesisToWhere(String sql) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {

View File

@@ -0,0 +1,35 @@
package com.tencent.supersonic.common.util.jsqlparser;
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
import com.tencent.supersonic.common.util.jsqlparser.DateVisitor.DateBoundInfo;
import java.util.List;
import java.util.Objects;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.statement.select.PlainSelect;
/**
* Date field parsing helper class
*/
@Slf4j
public class SqlDateSelectHelper {
public static DateBoundInfo getDateBoundInfo(String sql) {
List<PlainSelect> plainSelectList = SqlSelectHelper.getPlainSelect(sql);
if (plainSelectList.size() != 1) {
return null;
}
PlainSelect plainSelect = plainSelectList.get(0);
if (Objects.isNull(plainSelect)) {
return null;
}
Expression where = plainSelect.getWhere();
if (Objects.isNull(where)) {
return null;
}
DateVisitor dateVisitor = new DateVisitor(TimeDimensionEnum.getChNameList());
where.accept(dateVisitor);
return dateVisitor.getDateBoundInfo();
}
}

View File

@@ -8,7 +8,7 @@ import org.apache.commons.collections.CollectionUtils;
* Sql Parser equal Helper
*/
@Slf4j
public class SqlParserEqualHelper {
public class SqlEqualHelper {
/**
* determine if two SQL statements are equal.
@@ -19,43 +19,43 @@ public class SqlParserEqualHelper {
*/
public static boolean equals(String thisSql, String otherSql) {
//1. select fields
List<String> thisSelectFields = SqlParserSelectHelper.getSelectFields(thisSql);
List<String> otherSelectFields = SqlParserSelectHelper.getSelectFields(otherSql);
List<String> thisSelectFields = SqlSelectHelper.getSelectFields(thisSql);
List<String> otherSelectFields = SqlSelectHelper.getSelectFields(otherSql);
if (!CollectionUtils.isEqualCollection(thisSelectFields, otherSelectFields)) {
return false;
}
//2. all fields
List<String> thisAllFields = SqlParserSelectHelper.getAllFields(thisSql);
List<String> otherAllFields = SqlParserSelectHelper.getAllFields(otherSql);
List<String> thisAllFields = SqlSelectHelper.getAllFields(thisSql);
List<String> otherAllFields = SqlSelectHelper.getAllFields(otherSql);
if (!CollectionUtils.isEqualCollection(thisAllFields, otherAllFields)) {
return false;
}
//3. where
List<FieldExpression> thisFieldExpressions = SqlParserSelectHelper.getFilterExpression(thisSql);
List<FieldExpression> otherFieldExpressions = SqlParserSelectHelper.getFilterExpression(otherSql);
List<FieldExpression> thisFieldExpressions = SqlSelectHelper.getFilterExpression(thisSql);
List<FieldExpression> otherFieldExpressions = SqlSelectHelper.getFilterExpression(otherSql);
if (!CollectionUtils.isEqualCollection(thisFieldExpressions, otherFieldExpressions)) {
return false;
}
//4. tableName
if (!SqlParserSelectHelper.getDbTableName(thisSql)
.equalsIgnoreCase(SqlParserSelectHelper.getDbTableName(otherSql))) {
if (!SqlSelectHelper.getDbTableName(thisSql)
.equalsIgnoreCase(SqlSelectHelper.getDbTableName(otherSql))) {
return false;
}
//5. having
List<FieldExpression> thisHavingExpressions = SqlParserSelectHelper.getHavingExpressions(thisSql);
List<FieldExpression> otherHavingExpressions = SqlParserSelectHelper.getHavingExpressions(otherSql);
List<FieldExpression> thisHavingExpressions = SqlSelectHelper.getHavingExpressions(thisSql);
List<FieldExpression> otherHavingExpressions = SqlSelectHelper.getHavingExpressions(otherSql);
if (!CollectionUtils.isEqualCollection(thisHavingExpressions, otherHavingExpressions)) {
return false;
}
//6. orderBy
List<FieldExpression> thisOrderByExpressions = SqlParserSelectHelper.getOrderByExpressions(thisSql);
List<FieldExpression> otherOrderByExpressions = SqlParserSelectHelper.getOrderByExpressions(otherSql);
List<FieldExpression> thisOrderByExpressions = SqlSelectHelper.getOrderByExpressions(thisSql);
List<FieldExpression> otherOrderByExpressions = SqlSelectHelper.getOrderByExpressions(otherSql);
if (!CollectionUtils.isEqualCollection(thisOrderByExpressions, otherOrderByExpressions)) {
return false;

View File

@@ -37,10 +37,10 @@ import java.util.Objects;
* Sql Parser remove Helper
*/
@Slf4j
public class SqlParserRemoveHelper {
public class SqlRemoveHelper {
public static String removeSelect(String sql, Set<String> fields) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
if (selectStatement == null) {
return sql;
}
@@ -52,7 +52,7 @@ public class SqlParserRemoveHelper {
selectItems.removeIf(selectItem -> {
if (selectItem instanceof SelectExpressionItem) {
SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem;
String columnName = SqlParserSelectHelper.getColumnName(selectExpressionItem.getExpression());
String columnName = SqlSelectHelper.getColumnName(selectExpressionItem.getExpression());
return fields.contains(columnName);
}
return false;
@@ -61,7 +61,7 @@ public class SqlParserRemoveHelper {
}
public static String removeWhereCondition(String sql, Set<String> removeFieldNames) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
@@ -84,7 +84,7 @@ public class SqlParserRemoveHelper {
}
public static String removeNumberFilter(String sql) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
if (selectStatement == null) {
return sql;
}
@@ -105,7 +105,7 @@ public class SqlParserRemoveHelper {
}
private static void removeWhereExpression(Expression whereExpression, Set<String> removeFieldNames) {
if (SqlParserSelectHelper.isLogicExpression(whereExpression)) {
if (SqlSelectHelper.isLogicExpression(whereExpression)) {
BinaryExpression binaryExpression = (BinaryExpression) whereExpression;
Expression leftExpression = binaryExpression.getLeftExpression();
Expression rightExpression = binaryExpression.getRightExpression();
@@ -140,7 +140,7 @@ public class SqlParserRemoveHelper {
|| expression instanceof MinorThanEquals
|| expression instanceof MinorThan) {
ComparisonOperator comparisonOperator = (ComparisonOperator) expression;
String columnName = SqlParserSelectHelper.getColumnName(comparisonOperator.getLeftExpression(),
String columnName = SqlSelectHelper.getColumnName(comparisonOperator.getLeftExpression(),
comparisonOperator.getRightExpression());
if (!removeFieldNames.contains(columnName)) {
return;
@@ -158,7 +158,7 @@ public class SqlParserRemoveHelper {
}
if (expression instanceof InExpression) {
InExpression inExpression = (InExpression) expression;
String columnName = SqlParserSelectHelper.getColumnName(inExpression.getLeftExpression(),
String columnName = SqlSelectHelper.getColumnName(inExpression.getLeftExpression(),
inExpression.getRightExpression());
if (!removeFieldNames.contains(columnName)) {
return;
@@ -175,7 +175,7 @@ public class SqlParserRemoveHelper {
}
if (expression instanceof LikeExpression) {
LikeExpression likeExpression = (LikeExpression) expression;
String columnName = SqlParserSelectHelper.getColumnName(likeExpression.getLeftExpression(),
String columnName = SqlSelectHelper.getColumnName(likeExpression.getLeftExpression(),
likeExpression.getRightExpression());
if (!removeFieldNames.contains(columnName)) {
return;
@@ -192,7 +192,7 @@ public class SqlParserRemoveHelper {
}
public static String removeHavingCondition(String sql, Set<String> removeFieldNames) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
@@ -207,26 +207,8 @@ public class SqlParserRemoveHelper {
return removeNumberFilter(selectStatement.toString());
}
public static String removeWhere(String sql, List<String> fields) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
return sql;
}
PlainSelect plainSelect = (PlainSelect) selectBody;
Expression where = plainSelect.getWhere();
if (where == null) {
return sql;
} else {
where.accept(new FilterRemoveVisitor(fields));
plainSelect.setWhere(where);
}
return selectStatement.toString();
}
public static String removeGroupBy(String sql, Set<String> fields) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
if (selectStatement == null) {
return sql;
}
@@ -328,7 +310,7 @@ public class SqlParserRemoveHelper {
return distinguishNumberFilter(leftExpression, expression);
}
if (sqlEditEnum.equals(SqlEditEnum.DATEDIFF)) {
return SqlParserReplaceHelper.distinguishDateDiffFilter(leftExpression, expression);
return SqlReplaceHelper.distinguishDateDiffFilter(leftExpression, expression);
}
return expression;
}

View File

@@ -43,10 +43,10 @@ import org.springframework.util.CollectionUtils;
* Sql Parser replace Helper
*/
@Slf4j
public class SqlParserReplaceHelper {
public class SqlReplaceHelper {
public static String replaceSelectFields(String sql, Map<String, String> fieldNameMap) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
return sql;
@@ -84,7 +84,7 @@ public class SqlParserReplaceHelper {
}
public static String replaceAggFields(String sql, Map<String, Pair<String, String>> fieldNameToAggMap) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
return sql;
@@ -122,14 +122,14 @@ public class SqlParserReplaceHelper {
public static String replaceValue(String sql, Map<String, Map<String, String>> filedNameToValueMap,
boolean exactReplace) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
return sql;
}
List<PlainSelect> plainSelectList = new ArrayList<>();
plainSelectList.add((PlainSelect) selectBody);
List<PlainSelect> plainSelects = SqlParserSelectHelper.getPlainSelects(plainSelectList);
List<PlainSelect> plainSelects = SqlSelectHelper.getPlainSelects(plainSelectList);
for (PlainSelect plainSelect : plainSelects) {
Expression where = plainSelect.getWhere();
FieldlValueReplaceVisitor visitor = new FieldlValueReplaceVisitor(exactReplace, filedNameToValueMap);
@@ -141,14 +141,14 @@ public class SqlParserReplaceHelper {
}
public static String replaceFieldNameByValue(String sql, Map<String, Set<String>> fieldValueToFieldNames) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
return sql;
}
List<PlainSelect> plainSelectList = new ArrayList<>();
plainSelectList.add((PlainSelect) selectBody);
List<PlainSelect> plainSelects = SqlParserSelectHelper.getPlainSelects(plainSelectList);
List<PlainSelect> plainSelects = SqlSelectHelper.getPlainSelects(plainSelectList);
for (PlainSelect plainSelect : plainSelects) {
Expression where = plainSelect.getWhere();
FiledNameReplaceVisitor visitor = new FiledNameReplaceVisitor(fieldValueToFieldNames);
@@ -164,7 +164,7 @@ public class SqlParserReplaceHelper {
}
public static String replaceFields(String sql, Map<String, String> fieldNameMap, boolean exactReplace) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
System.out.println(selectStatement.getSelectBody());
SelectBody selectBody = selectStatement.getSelectBody();
List<PlainSelect> plainSelectList = new ArrayList<>();
@@ -189,7 +189,7 @@ public class SqlParserReplaceHelper {
} else {
return sql;
}
List<PlainSelect> plainSelects = SqlParserSelectHelper.getPlainSelects(plainSelectList);
List<PlainSelect> plainSelects = SqlSelectHelper.getPlainSelects(plainSelectList);
for (PlainSelect plainSelect : plainSelects) {
replaceFieldsInPlainOneSelect(fieldNameMap, exactReplace, plainSelect);
}
@@ -238,7 +238,7 @@ public class SqlParserReplaceHelper {
SelectBody subSelectBody = ((SubSelect) join.getRightItem()).getSelectBody();
List<PlainSelect> plainSelectList = new ArrayList<>();
plainSelectList.add((PlainSelect) subSelectBody);
List<PlainSelect> subPlainSelects = SqlParserSelectHelper.getPlainSelects(plainSelectList);
List<PlainSelect> subPlainSelects = SqlSelectHelper.getPlainSelects(plainSelectList);
for (PlainSelect subPlainSelect : subPlainSelects) {
replaceFieldsInPlainOneSelect(fieldNameMap, exactReplace, subPlainSelect);
}
@@ -262,14 +262,14 @@ public class SqlParserReplaceHelper {
}
public static String replaceFunction(String sql, Map<String, String> functionMap) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
return sql;
}
List<PlainSelect> plainSelectList = new ArrayList<>();
plainSelectList.add((PlainSelect) selectBody);
List<PlainSelect> plainSelects = SqlParserSelectHelper.getPlainSelects(plainSelectList);
List<PlainSelect> plainSelects = SqlSelectHelper.getPlainSelects(plainSelectList);
for (PlainSelect plainSelect : plainSelects) {
replaceFunction(functionMap, plainSelect);
}
@@ -303,14 +303,14 @@ public class SqlParserReplaceHelper {
}
public static String replaceFunction(String sql) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
return sql;
}
Expression where = ((PlainSelect) selectBody).getWhere();
try {
Expression expression = SqlParserRemoveHelper.filteredExpression(where, SqlEditEnum.DATEDIFF);
Expression expression = SqlRemoveHelper.filteredExpression(where, SqlEditEnum.DATEDIFF);
((PlainSelect) selectBody).setWhere(expression);
} catch (Exception e) {
log.info("replaceFunction has an exception:{}", e.toString());
@@ -384,7 +384,7 @@ public class SqlParserReplaceHelper {
if (StringUtils.isEmpty(tableName)) {
return sql;
}
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (selectBody instanceof PlainSelect) {
PlainSelect plainSelect = (PlainSelect) selectBody;
@@ -406,7 +406,7 @@ public class SqlParserReplaceHelper {
// replace table name
List<PlainSelect> plainSelects = new ArrayList<>();
plainSelects.add(plainSelect);
List<PlainSelect> painSelects = SqlParserSelectHelper.getPlainSelects(plainSelects);
List<PlainSelect> painSelects = SqlSelectHelper.getPlainSelects(plainSelects);
for (PlainSelect painSelect : painSelects) {
painSelect.accept(
new SelectVisitorAdapter() {
@@ -422,7 +422,7 @@ public class SqlParserReplaceHelper {
SelectBody subSelectBody = ((SubSelect) join.getRightItem()).getSelectBody();
List<PlainSelect> plainSelectList = new ArrayList<>();
plainSelectList.add((PlainSelect) subSelectBody);
List<PlainSelect> subPlainSelects = SqlParserSelectHelper.getPlainSelects(plainSelectList);
List<PlainSelect> subPlainSelects = SqlSelectHelper.getPlainSelects(plainSelectList);
for (PlainSelect subPlainSelect : subPlainSelects) {
subPlainSelect.getFromItem().accept(new TableNameReplaceVisitor(tableName));
}
@@ -436,7 +436,7 @@ public class SqlParserReplaceHelper {
}
public static String replaceAlias(String sql) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
return sql;
@@ -454,7 +454,7 @@ public class SqlParserReplaceHelper {
}
public static String replaceHavingValue(String sql, Map<String, Map<String, String>> filedNameToValueMap) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {
return sql;
@@ -523,7 +523,7 @@ public class SqlParserReplaceHelper {
}
public static String replaceSqlByExpression(String sql, Map<String, String> replace) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
List<PlainSelect> plainSelectList = new ArrayList<>();
if (selectBody instanceof PlainSelect) {
@@ -539,7 +539,7 @@ public class SqlParserReplaceHelper {
} else {
return sql;
}
List<PlainSelect> plainSelects = SqlParserSelectHelper.getPlainSelects(plainSelectList);
List<PlainSelect> plainSelects = SqlSelectHelper.getPlainSelects(plainSelectList);
for (PlainSelect plainSelect : plainSelects) {
replacePlainSelectByExpr(plainSelect, replace);
}

View File

@@ -23,13 +23,13 @@ import java.util.Set;
* Sql Parser Select function Helper
*/
@Slf4j
public class SqlParserSelectFunctionHelper {
public class SqlSelectFunctionHelper {
public static boolean hasAggregateFunction(String sql) {
if (!CollectionUtils.isEmpty(getFunctions(sql))) {
return true;
}
return SqlParserSelectHelper.hasGroupBy(sql);
return SqlSelectHelper.hasGroupBy(sql);
}
public static void main(String[] args) {
@@ -46,7 +46,7 @@ public class SqlParserSelectFunctionHelper {
}
public static Set<String> getFunctions(String sql) {
Select selectStatement = SqlParserSelectHelper.getSelect(sql);
Select selectStatement = SqlSelectHelper.getSelect(sql);
SelectBody selectBody = selectStatement.getSelectBody();
if (!(selectBody instanceof PlainSelect)) {

View File

@@ -13,15 +13,13 @@ import net.sf.jsqlparser.expression.CaseExpression;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.WhenClause;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
import net.sf.jsqlparser.expression.operators.conditional.XorExpression;
import net.sf.jsqlparser.expression.operators.relational.ComparisonOperator;
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
@@ -38,14 +36,13 @@ import net.sf.jsqlparser.statement.select.SelectVisitorAdapter;
import net.sf.jsqlparser.statement.select.SetOperationList;
import net.sf.jsqlparser.statement.select.SubSelect;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.springframework.util.CollectionUtils;
/**
* Sql Parser Select Helper
*/
@Slf4j
public class SqlParserSelectHelper {
public class SqlSelectHelper {
public static List<FieldExpression> getFilterExpression(String sql) {
List<PlainSelect> plainSelectList = getPlainSelect(sql);
@@ -435,34 +432,16 @@ public class SqlParserSelectHelper {
return "";
}
public static Expression getTimeFilter(List<ImmutablePair<String, String>> times, String columnBegin,
String columnEnd) {
Expression expression = null;
for (ImmutablePair<String, String> t : times) {
Expression expr = null;
ComparisonOperator left = new MinorThanEquals();
if (t.left.equals(t.right)) {
left.setLeftExpression(new Column(columnBegin));
left.setRightExpression(new StringValue(t.left));
ComparisonOperator right = new GreaterThan();
right.setLeftExpression(new Column(columnEnd));
right.setRightExpression(new StringValue(t.right));
expr = new AndExpression(left, right);
} else {
left.setLeftExpression(new StringValue(t.left));
left.setRightExpression(new Column(columnEnd));
ComparisonOperator right = new GreaterThanEquals();
right.setLeftExpression(new StringValue(t.right));
right.setRightExpression(new Column(columnBegin));
expr = new AndExpression(left, right);
}
if (expression == null) {
expression = expr;
continue;
}
expression = new OrExpression(expression, expr);
public static String getColumValue(Expression expression) {
if (expression instanceof StringValue) {
StringValue value = (StringValue) expression;
return value.getValue();
}
return expression;
if (expression instanceof LongValue) {
LongValue value = (LongValue) expression;
return String.valueOf(value.getValue());
}
return "";
}
public static Table getTable(String sql) {
@@ -488,14 +467,6 @@ public class SqlParserSelectHelper {
return table.getFullyQualifiedName();
}
public static String getNormalizedSql(String sql) {
Select selectStatement = getSelect(sql);
if (selectStatement == null) {
return null;
}
return selectStatement.toString();
}
public static Set<String> getColumnFromExpr(String expr) {
Expression expression = QueryExpressionReplaceVisitor.getExpression(expr);
Set<String> columns = new HashSet<>();