【JSqlParser】sql解析器使用案例

发布于:2025-07-29 ⋅ 阅读:(15) ⋅ 点赞:(0)

【一】需求描述

项目中支持文件导入指标的业务限定(也就是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 < '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);
        // 解析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();
        }
    }

网站公告

今日签到

点亮在社区的每一天
去签到