mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-14 05:43:51 +00:00
[improvement][Chat] Add TimeCorrector and rename the associated SqlParserHelper. (#707)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)) {
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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)) {
|
||||
@@ -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<>();
|
||||
Reference in New Issue
Block a user