【JSqlParser】sql解析器使用案例
【JSqlParser】sql解析器使用案例
- 【一】需求描述
- 【二】组件对象
- 【三】解析逻辑
- 【四】代码实现SqlConditionUtil
- (1)传入参数,构建一个完整的可以解析的sql
- (2)递归移除所有外层括号
- (3)递归解析表达式,并构建条件树
- (4)判断组件是否新建子级分层
- (5)专门解析Between表达式
- (6)解析IS NULL和IS NOT NULL表达式
- (7)解析IS NULL和IS NOT NULL表达式
- (8)解析LIKE和NOT LIKE表达式
- (9)解析二元表达式,提取字段、运算符和值
- (10)获取表达式的值(处理常量、字符串等)
- (11)获取运算符的符号表示
【一】需求描述
项目中支持文件导入指标的业务限定(也就是where条件),并且可以指定是普通模式还是代码模式,如果是普通模式就要把where解析成一个个条件语句,并转换成嵌套的组件对象
【二】组件对象
@Data
@Schema(description = "业务限定词")
public class IndEngineSqlCondition implements Serializable {private static final long serialVersionUID = -1L;/*** and/or*/@Schema(description = "and/Or")private String type;@Schema(description = "条件项")private ConditionField conditionField;@Schema(description = "子项")private List<IndEngineSqlCondition> children;@Schema(description = "扩展项")private Map<String, String> ext;@Schema(description = "top信息对象")private TopInfo topInfo;private Map<String, IndEngineColumn> columnMap = Maps.newHashMap();@Data@Schema(description = "top信息对象")public static class TopInfo implements Serializable {private static final long serialVersionUID = 5820012879123811247L;@Schema(description = "排序")private String topSort;@Schema(description = "限量值")private Integer topLimitNum;}@Data@Schema(description = "条件项对象")public static class ConditionField implements Serializable {private static final long serialVersionUID = 5820012879121811247L;/*** @see CfTypeEnum*/@Schema(description = "条件项对象类型:00(事实表);01(维度表);02(层级的维表);03(衍生的维表);" +"11(普通维度);12(维度属性);13(衍生维度);14(度量属性);" +"20(指标值);21(业务日期);22(指标编码);23(指标版本)")private String cfType;@Schema(description = "表别名")private String aliasNm;@Schema(description = "表名")private String tableName;@Schema(description = "字段ID,配合 cfType 属性使用")private String fieldId;@Schema(description = "字段名,映射数据库字段名称")private String fieldName;@Schema(description = "获取日期值的函数")private String fieldDateFunc;@Schema(description = "值1")private String fieldValue1;@Schema(description = "值2")private String fieldValue2;@Schema(description = "日期时分秒")private List<String> fieldTimeValueRang;@Schema(description = "数据类型:VARCHAR等")@Deprecatedprivate String fieldType;@Schema(description = "关联模型字段的类型")private Integer propertyType;@Schema(description = "数据类型:字符类型、数字类型、日期等")private Integer dataCategory;@Schema(description = "日期类型")private String datePlaceholderFormat;@Schema(description = "操作符")private String symbol;@Schema(description = "字段项")private ColumnInfo columnInfo;@Schema(description = "扩展项")private Map<String, String> ext = new HashMap<>();@Schema(description = "是否生效,慎用")private boolean effect = true;}@Data@Schema(description = "字段对象")public static class ColumnInfo implements Serializable {@Schema(description = "字段类型:0-度量,1-维度,6-维度属性")private String propertyType;@Schema(description = "关联表名称")private String tableName;@Schema(description = "关联维度字段名称")private String linkColumnEnName;@Schema(description = "关联维度id")private String dimensionId;@Schema(description = "父级字段名")private String fieldParentName;}
}
【三】解析逻辑
(1)组件对象是分层的,每层有独立的且或逻辑,每层要用括号包围起来
(2)需要判断and和or的逻辑,如果有括号把and或or包围起来了,需要判断是否创建子级children
(3)in和not in,like和not like,between,is null和is not null,这几种语句要单独处理
【四】代码实现SqlConditionUtil
(1)传入参数,构建一个完整的可以解析的sql
1-whereSql:where条件语句,语句中的字段都是中文名称
2-columnMap:字段中文名称的Map,用来获取字段的详情,例如字段数据的日期格式
public static void parseSql2Condition (String whereSql, Map<String, IndColumn> columnMap, IndEngineSqlCondition sqlCondition) {if (ObjectUtil.isEmpty(whereSql)) {return;}// 初始化sqlCondition.setChildren(Lists.newArrayList());// (// a.ORG = '111'// and a.D_D_a_d_001 >= '2025-07-16 00:00:00'// and ((a.D_D_a_b_004 > '0' and a.D_D_a_b_004 < '100') or (a.D_D_a_b_004 > '300' and a.D_D_a_b_004 < '500'))// and a.D_D_f_a_005 is not null// and a.D_D_d_y_007 >= '2025-07-08'// )whereSql = StrUtil.format("SELECT * FROM a WHERE {}",whereSql);// 解析sqlStatement statement = null;try {statement = CCJSqlParserUtil.parse(whereSql);} catch (JSQLParserException exception) {log.info("sql解析失败:{}",exception.getMessage());throw new YTRuntimeException("sql解析失败");}// 提取SELECT语句体if (statement instanceof Select) {Select select = (Select) statement;PlainSelect plainSelect = (PlainSelect) select.getSelectBody();Expression whereExpression = plainSelect.getWhere();if (whereExpression != null) {System.out.println("WHERE条件解析结果:");Expression unwrappedExpr = unwrapParenthesis(whereExpression);sqlCondition = parseExpression(unwrappedExpr, columnMap, sqlCondition);}}// 判断sql是否符合规范// 对sql进行重新组装,装填SqlConditionSystem.out.println("解析成功:"+sqlCondition.toString());}
(2)递归移除所有外层括号
否则对象就是Parenthesis类型,不能转成其他类型
/**
* 递归移除所有外层括号
*/
private static Expression unwrapParenthesis(Expression expr) {if (expr instanceof Parenthesis) {Parenthesis parenthesis = (Parenthesis) expr;// 递归处理括号内的表达式,处理多层嵌套return unwrapParenthesis(parenthesis.getExpression());}return expr;
}
(3)递归解析表达式,并构建条件树
// 解析表达式并构建条件树private static IndEngineSqlCondition parseExpression(Expression expr,Map<String, IndColumn> columnMap,IndEngineSqlCondition sqlCondition) {// 先处理可能存在的括号if (expr instanceof AndExpression) {// 处理and逻辑AndExpression andExpr = (AndExpression) expr;sqlCondition.setType("and");sqlCondition = parseExpression(andExpr.getRightExpression(),columnMap,sqlCondition);sqlCondition = parseExpression(andExpr.getLeftExpression(),columnMap,sqlCondition);return sqlCondition;} else if (expr instanceof OrExpression) {// 处理or逻辑OrExpression orExpr = (OrExpression) expr;sqlCondition.setType("or");sqlCondition = parseExpression(orExpr.getRightExpression(),columnMap,sqlCondition);sqlCondition = parseExpression(orExpr.getLeftExpression(),columnMap,sqlCondition);return sqlCondition;} else if (expr instanceof Parenthesis) {// 处理括号嵌套Parenthesis parenthesis = (Parenthesis) expr;String createNewLevelType = checkCreateNewLevel(parenthesis);if (ObjectUtil.isNotEmpty(createNewLevelType)) {// 需要创建新的子级分层,实现嵌套内容Expression expression = unwrapParenthesis(parenthesis);IndEngineSqlCondition childrenSqlCondition = new IndEngineSqlCondition();childrenSqlCondition.setChildren(Lists.newArrayList());childrenSqlCondition.setType(createNewLevelType);// 且或关系childrenSqlCondition = parseExpression(expression,columnMap,childrenSqlCondition);sqlCondition.getChildren().add(0,childrenSqlCondition);} else {// 不需要创建新的子级分层Expression expression = unwrapParenthesis(parenthesis);sqlCondition = parseExpression(expression,columnMap,sqlCondition);}return sqlCondition;}else if (expr instanceof Between) {// 单独处理Between表达式sqlCondition.getChildren().add(0,parseBetweenExpression((Between) expr, columnMap));return sqlCondition;}else if (expr instanceof InExpression) {// 单独处理In表达式sqlCondition.getChildren().add(0,parseInExpression((InExpression) expr, columnMap));return sqlCondition;}else if (expr instanceof LikeExpression) {// 单独处理Like表达式sqlCondition.getChildren().add(0,parseLikeExpression((LikeExpression) expr, columnMap));return sqlCondition;}else if (expr instanceof IsNullExpression) {// 单独处理Null判断表达式sqlCondition.getChildren().add(0,parseNullExpression((IsNullExpression) expr, columnMap));return sqlCondition;}else {// 处理普通计算符号逻辑// 单个条件解析完毕,添加到child集合IndEngineSqlCondition childrenSqlCondition = parseBinaryExpression((BinaryExpression) expr, columnMap);sqlCondition.getChildren().add(0,childrenSqlCondition);return sqlCondition;}// 处理其他类型的表达式//ConditionNode node = new ConditionNode("CONDITION");//node.setField("unknown");//node.setOperator("=");//node.setValue(expr.toString());//return null;}
(4)判断组件是否新建子级分层
/*** 判断组件是否新建子级分层* @param expr* @return*/private static String checkCreateNewLevel (Expression expr) {String newLevelType = "";if (expr instanceof Parenthesis) {Expression expression = unwrapParenthesis(expr);if (expression instanceof OrExpression) {newLevelType = "or";} else if (expression instanceof AndExpression) {newLevelType = "and";}}return newLevelType;}
(5)专门解析Between表达式
/*** 专门解析Between表达式(新增方法)*/private static IndEngineSqlCondition parseBetweenExpression(Between between,Map<String, IndColumn> colMap) {IndEngineSqlCondition sqlCondition = new IndEngineSqlCondition();IndEngineSqlCondition.ConditionField conditionField = new IndEngineSqlCondition.ConditionField();// 判断动态时间还是动态周期//String statisticalCycle = StrUtil.split(between.getBetweenExpressionStart().toString(), "_START").get(0).replace("#[", "").replace("'", "");//statisticalCycle = DynamicDateUtil.buildDynamicDatePlaceHolder(statisticalCycle);//StatisticalCycleEnum statisticalCycleEnum = StatisticalCycleEnum.getInstance(statisticalCycle);//String symbol = ObjectUtil.equals(statisticalCycleEnum.getType(),1)? SymbolEnum.DTIME.getCode():SymbolEnum.CYCLE.getCode();//conditionField.setSymbol(symbol);Tuple3<String,List<String>,String> placeHolderAndTimeRange = DynamicDateUtil.parseDynamicDatePlaceHolderAndTimeRange(between.getBetweenExpressionStart().toString());// 动态时间占位符String placeHolder = placeHolderAndTimeRange.getV1();StatisticalCycleEnum statisticalCycleEnum = StatisticalCycleEnum.getInstance(placeHolder);String symbol = ObjectUtil.equals(statisticalCycleEnum.getType(),1)? SymbolEnum.DTIME.getCode():SymbolEnum.CYCLE.getCode();conditionField.setSymbol(symbol);conditionField.setFieldDateFunc(statisticalCycleEnum.getId().toString());conditionField.setFieldValue1(placeHolder);// 动态时间的时间范围List<String> timeRange = placeHolderAndTimeRange.getV2();conditionField.setFieldTimeValueRang(timeRange);// 获取字段表达式String colName = "";Expression leftExpr = unwrapParenthesis(between.getLeftExpression());if (leftExpr instanceof Column) {colName = ((Column) leftExpr).getColumnName();} else if (leftExpr instanceof Function) {Function function = (Function) leftExpr;String functionName = function.getName();if (!function.getParameters().getExpressions().isEmpty()) {Expression paramExpr = function.getParameters().getExpressions().get(0);Expression unwrappedParam = unwrapParenthesis(paramExpr);if (unwrappedParam instanceof Column) {colName = functionName + "(" + ((Column) unwrappedParam).getColumnName() + ")";}}} else {colName = leftExpr.toString();}// 获取值范围//String value = getExpressionValue(unwrapParenthesis(between.getBetweenExpressionStart())) +// " AND " +// getExpressionValue(unwrapParenthesis(between.getBetweenExpressionEnd()));//conditionField.setFieldValue1(unwrapParenthesis(between.getBetweenExpressionStart()).toString().replace("'",""));//conditionField.setFieldValue2(unwrapParenthesis(between.getBetweenExpressionEnd()).toString().replace("'",""));// 空值判断没有具体值,设置为nullcolName = colName.toUpperCase();conditionField.setFieldId(colMap.get(colName).getId().toString());conditionField.setFieldName(colMap.get(colName).getColumnEnName());conditionField.setDataCategory(colMap.get(colName).getDataCategory());conditionField.setFieldType(colMap.get(colName).getDataType());conditionField.setTableName(colMap.get(colName).getTableName());conditionField.setDatePlaceholderFormat(colMap.get(colName).getDatePlaceholderFormat());conditionField.setCfType(colMap.get(colName).getCfType());conditionField.setPropertyType(colMap.get(colName).getPropertyType());SqlCondition.ColumnInfo columnInfo = new SqlCondition.ColumnInfo();columnInfo.setPropertyType(colMap.get(colName).getPropertyType().toString());columnInfo.setFieldParentName(colMap.get(colName).getFieldParentName());columnInfo.setLinkColumnEnName(colMap.get(colName).getLinkColumnEnName());columnInfo.setTableName(colMap.get(colName).getTableName());columnInfo.setDimensionId(colMap.get(colName).getDimensionId());conditionField.setColumnInfo(columnInfo);sqlCondition.setConditionField(conditionField);return sqlCondition;}
(6)解析IS NULL和IS NOT NULL表达式
/*** 解析IS NULL和IS NOT NULL表达式*/private static IndEngineSqlCondition parseNullExpression(IsNullExpression nullExpr,Map<String, IndColumn> colMap) {IndEngineSqlCondition sqlCondition = new IndEngineSqlCondition();IndEngineSqlCondition.ConditionField conditionField = new IndEngineSqlCondition.ConditionField();// 判断是IS NULL还是IS NOT NULLif (nullExpr.isNot()) {conditionField.setSymbol(SymbolEnum.NNVL.getCode());} else {conditionField.setSymbol(SymbolEnum.NVL.getCode());}// 获取字段表达式Expression leftExpr = unwrapParenthesis(nullExpr.getLeftExpression());String colName = "";if (leftExpr instanceof Column) {colName = ((Column) leftExpr).getColumnName();} else if (leftExpr instanceof Function) {Function function = (Function) leftExpr;String functionName = function.getName();if (!function.getParameters().getExpressions().isEmpty()) {Expression paramExpr = function.getParameters().getExpressions().get(0);Expression unwrappedParam = unwrapParenthesis(paramExpr);if (unwrappedParam instanceof Column) {colName = functionName + "(" + ((Column) unwrappedParam).getColumnName() + ")";}}} else {colName = leftExpr.toString();}// 空值判断没有具体值,设置为nullcolName = colName.toUpperCase();conditionField.setFieldId(colMap.get(colName).getId().toString());conditionField.setFieldName(colMap.get(colName).getColumnEnName());conditionField.setDataCategory(colMap.get(colName).getDataCategory());conditionField.setFieldType(colMap.get(colName).getDataType());conditionField.setTableName(colMap.get(colName).getTableName());conditionField.setDatePlaceholderFormat(colMap.get(colName).getDatePlaceholderFormat());conditionField.setCfType(colMap.get(colName).getCfType());conditionField.setPropertyType(colMap.get(colName).getPropertyType());SqlCondition.ColumnInfo columnInfo = new SqlCondition.ColumnInfo();columnInfo.setPropertyType(colMap.get(colName).getPropertyType().toString());columnInfo.setFieldParentName(colMap.get(colName).getFieldParentName());columnInfo.setLinkColumnEnName(colMap.get(colName).getLinkColumnEnName());columnInfo.setTableName(colMap.get(colName).getTableName());columnInfo.setDimensionId(colMap.get(colName).getDimensionId());conditionField.setColumnInfo(columnInfo);sqlCondition.setConditionField(conditionField);return sqlCondition;}
(7)解析IS NULL和IS NOT NULL表达式
/*** 解析IS NULL和IS NOT NULL表达式*/private static IndEngineSqlCondition parseInExpression(InExpression inExpr,Map<String, IndColumn> colMap) {IndEngineSqlCondition sqlCondition = new IndEngineSqlCondition();IndEngineSqlCondition.ConditionField conditionField = new IndEngineSqlCondition.ConditionField();// 判断是IS NULL还是IS NOT NULLif (inExpr.isNot()) {conditionField.setSymbol(SymbolEnum.NOTIN.getCode());} else {conditionField.setSymbol(SymbolEnum.IN.getCode());}// 获取字段表达式Expression leftExpr = unwrapParenthesis(inExpr.getLeftExpression());String colName = "";if (leftExpr instanceof Column) {colName = ((Column) leftExpr).getColumnName();} else if (leftExpr instanceof Function) {Function function = (Function) leftExpr;String functionName = function.getName();if (!function.getParameters().getExpressions().isEmpty()) {Expression paramExpr = function.getParameters().getExpressions().get(0);Expression unwrappedParam = unwrapParenthesis(paramExpr);if (unwrappedParam instanceof Column) {colName = functionName + "(" + ((Column) unwrappedParam).getColumnName() + ")";}}} else {colName = leftExpr.toString();}Expression rightExpression = inExpr.getRightExpression();String rightValue = rightExpression.toString().replace("'", "").replace(",", ";").replace("(","").replace(")","");// 空值判断没有具体值,设置为nullcolName = colName.toUpperCase();conditionField.setFieldId(colMap.get(colName).getId().toString());conditionField.setFieldName(colMap.get(colName).getColumnEnName());conditionField.setDataCategory(colMap.get(colName).getDataCategory());conditionField.setFieldType(colMap.get(colName).getDataType());conditionField.setTableName(colMap.get(colName).getTableName());conditionField.setDatePlaceholderFormat(colMap.get(colName).getDatePlaceholderFormat());conditionField.setCfType(colMap.get(colName).getCfType());conditionField.setFieldValue1(rightValue);conditionField.setPropertyType(colMap.get(colName).getPropertyType());SqlCondition.ColumnInfo columnInfo = new SqlCondition.ColumnInfo();columnInfo.setPropertyType(colMap.get(colName).getPropertyType().toString());columnInfo.setFieldParentName(colMap.get(colName).getFieldParentName());columnInfo.setLinkColumnEnName(colMap.get(colName).getLinkColumnEnName());columnInfo.setTableName(colMap.get(colName).getTableName());columnInfo.setDimensionId(colMap.get(colName).getDimensionId());conditionField.setColumnInfo(columnInfo);sqlCondition.setConditionField(conditionField);return sqlCondition;}
(8)解析LIKE和NOT LIKE表达式
/*** 解析LIKE和NOT LIKE表达式*/private static IndEngineSqlCondition parseLikeExpression(LikeExpression likeExpr,Map<String, IndColumn> colMap) {IndEngineSqlCondition sqlCondition = new IndEngineSqlCondition();IndEngineSqlCondition.ConditionField conditionField = new IndEngineSqlCondition.ConditionField();// 判断是IS NULL还是IS NOT NULLif (likeExpr.isNot()) {conditionField.setSymbol(SymbolEnum.NOLIKE.getCode());} else {conditionField.setSymbol(SymbolEnum.LIKE.getCode());}// 获取字段表达式Expression leftExpr = unwrapParenthesis(likeExpr.getLeftExpression());String colName = "";if (leftExpr instanceof Column) {colName = ((Column) leftExpr).getColumnName();} else if (leftExpr instanceof Function) {Function function = (Function) leftExpr;String functionName = function.getName();if (!function.getParameters().getExpressions().isEmpty()) {Expression paramExpr = function.getParameters().getExpressions().get(0);Expression unwrappedParam = unwrapParenthesis(paramExpr);if (unwrappedParam instanceof Column) {colName = functionName + "(" + ((Column) unwrappedParam).getColumnName() + ")";}}} else {colName = leftExpr.toString();}Expression rightExpression = likeExpr.getRightExpression();String rightValue = rightExpression.toString().replace("'", "").replace("%", "").replace("(","").replace(")","");// 空值判断没有具体值,设置为nullcolName = colName.toUpperCase();conditionField.setFieldId(colMap.get(colName).getId().toString());conditionField.setFieldName(colMap.get(colName).getColumnEnName());conditionField.setDataCategory(colMap.get(colName).getDataCategory());conditionField.setFieldType(colMap.get(colName).getDataType());conditionField.setTableName(colMap.get(colName).getTableName());conditionField.setDatePlaceholderFormat(colMap.get(colName).getDatePlaceholderFormat());conditionField.setCfType(colMap.get(colName).getCfType());conditionField.setFieldValue1(rightValue);conditionField.setPropertyType(colMap.get(colName).getPropertyType());SqlCondition.ColumnInfo columnInfo = new SqlCondition.ColumnInfo();columnInfo.setPropertyType(colMap.get(colName).getPropertyType().toString());columnInfo.setFieldParentName(colMap.get(colName).getFieldParentName());columnInfo.setLinkColumnEnName(colMap.get(colName).getLinkColumnEnName());columnInfo.setTableName(colMap.get(colName).getTableName());columnInfo.setDimensionId(colMap.get(colName).getDimensionId());conditionField.setColumnInfo(columnInfo);sqlCondition.setConditionField(conditionField);return sqlCondition;}
(9)解析二元表达式,提取字段、运算符和值
// 解析二元表达式,提取字段、运算符和值private static IndEngineSqlCondition parseBinaryExpression(BinaryExpression expr,Map<String, IndColumn> colMap) {IndEngineSqlCondition sqlCondition = new IndEngineSqlCondition();IndEngineSqlCondition.ConditionField conditionField = new IndEngineSqlCondition.ConditionField();// 获取运算符String operator = getOperatorSymbol(expr);conditionField.setSymbol(operator);// 提取字段和值,先处理可能的括号Expression leftExpr = unwrapParenthesis(expr.getLeftExpression());Expression rightExpr = unwrapParenthesis(expr.getRightExpression());String colName = "";String rightValue = "";// 通常左表达式是字段,右表达式是值if (leftExpr instanceof Column) {colName = ((Column) leftExpr).getColumnName();rightValue = getExpressionValue(rightExpr);}// 处理特殊情况,如值在左边的情况else if (rightExpr instanceof Column) {colName = ((Column) rightExpr).getColumnName();rightValue = getExpressionValue(leftExpr);}// 处理函数表达式,如DATE(create_time) = '2023-01-01'else if (leftExpr instanceof Function) {Function function = (Function) leftExpr;String functionName = function.getName();if (!function.getParameters().getExpressions().isEmpty()) {Expression paramExpr = function.getParameters().getExpressions().get(0);// 处理参数可能带有的括号Expression unwrappedParam = unwrapParenthesis(paramExpr);if (unwrappedParam instanceof Column) {colName = functionName + "(" + ((Column) unwrappedParam).getColumnName() + ")";rightValue = getExpressionValue(rightExpr);}}} else {colName = leftExpr.toString();rightValue = rightExpr.toString();}rightValue = rightValue.replace("'", "");colName = colName.toUpperCase();conditionField.setFieldValue1(rightValue);conditionField.setFieldId(colMap.get(colName).getId().toString());conditionField.setFieldName(colMap.get(colName).getColumnEnName());conditionField.setDataCategory(colMap.get(colName).getDataCategory());conditionField.setFieldType(colMap.get(colName).getDataType());conditionField.setTableName(colMap.get(colName).getTableName());conditionField.setDatePlaceholderFormat(colMap.get(colName).getDatePlaceholderFormat());conditionField.setCfType(colMap.get(colName).getCfType());conditionField.setPropertyType(colMap.get(colName).getPropertyType());SqlCondition.ColumnInfo columnInfo = new SqlCondition.ColumnInfo();columnInfo.setPropertyType(colMap.get(colName).getPropertyType().toString());columnInfo.setFieldParentName(colMap.get(colName).getFieldParentName());columnInfo.setLinkColumnEnName(colMap.get(colName).getLinkColumnEnName());columnInfo.setTableName(colMap.get(colName).getTableName());columnInfo.setDimensionId(colMap.get(colName).getDimensionId());conditionField.setColumnInfo(columnInfo);sqlCondition.setConditionField(conditionField);return sqlCondition;}
(10)获取表达式的值(处理常量、字符串等)
// 获取表达式的值(处理常量、字符串等)private static String getExpressionValue(Expression expr) {String expressionValue = "";if (expr instanceof Constant) {//Object value = ((Constant) expr).getValue();//return value != null ? value.toString() : "NULL";} else if (expr instanceof StringValue) {expressionValue = "'" + ((StringValue) expr).getValue() + "'";} else if (expr instanceof LongValue) {expressionValue = String.valueOf(((LongValue) expr).getValue());} else if (expr instanceof DoubleValue) {expressionValue = String.valueOf(((DoubleValue) expr).getValue());} else {expressionValue = expr.toString();}return expressionValue;}
(11)获取运算符的符号表示
这里封装了枚举,可以直接替换常量
// 获取运算符的符号表示private static String getOperatorSymbol(BinaryExpression expr) {if (expr instanceof EqualsTo) {return SymbolEnum.EQ.getCode();} else if (expr instanceof NotEqualsTo) {return SymbolEnum.NEQ.getCode();} else if (expr instanceof GreaterThan) {return SymbolEnum.GT.getCode();} else if (expr instanceof GreaterThanEquals) {return SymbolEnum.GTE.getCode();} else if (expr instanceof MinorThan) {return SymbolEnum.LT.getCode();} else if (expr instanceof MinorThanEquals) {return SymbolEnum.LTE.getCode();} else {return expr.getStringExpression();}}