【JSqlParser】sql解析器使用案例
【JSqlParser】sql解析器使用案例
- 【一】需求描述
- 【二】组件对象
- 【三】解析逻辑
- 【四】代码实现SqlConditionUtil
【一】需求描述
项目中支持文件导入指标的业务限定(也就是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等\") @Deprecated private 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 \'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); // 解析sql Statement 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进行重新组装,装填SqlCondition System.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(\"\'\",\"\")); // 空值判断没有具体值,设置为null colName = 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 NULL if (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(); } // 空值判断没有具体值,设置为null colName = 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 NULL if (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(\")\",\"\"); // 空值判断没有具体值,设置为null colName = 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 NULL if (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(\")\",\"\"); // 空值判断没有具体值,设置为null colName = 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(); } }