ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【jsqlpaser使用006】 合并列

2021-12-02 13:06:00  阅读:216  来源: 互联网

标签:String jsqlpaser List 合并 field 006 new expressions columns


合并列

@Slf4j
public class FieldMergeNodeHandler extends BaseOperatorNodeHandler {
    /**
     * 列合并函数
     */
    private static final String TO_STRING = "toString";
    /**
     * 合并列 生成的列类型为String
     */
    private static final String TYPE_STRING = "String";
    public static final int EXPRESSIONS_SIZE_TWO = 2;
    public static final int EXPRESSIONS_SIZE_ONE = 1;

    public FieldMergeNodeHandler(DdlMutableGraphContext mutableGraph, DdlNode node) {
        super(mutableGraph, node);
    }

    /**
     * 生成连接表达式 比如 toString(date)||toString(age)||toString(name)
     *
     * @param expressions 表达式
     * @return Concat
     */
    private Concat concat(List<Expression> expressions) {
        if (expressions.size() == EXPRESSIONS_SIZE_ONE) {
            Concat c = new Concat();
            c.setLeftExpression(expressions.get(0));
            StringValue stringValue = new StringValue("");
            c.setRightExpression(stringValue);
            return c;
        } else if (expressions.size() == EXPRESSIONS_SIZE_TWO) {
            Concat c = new Concat();
            c.setLeftExpression(expressions.get(0));
            c.setRightExpression(expressions.get(1));
            return c;
        } else if (expressions.size() > EXPRESSIONS_SIZE_TWO) {
            Concat c = new Concat();
            c.setLeftExpression(concat(expressions.subList(0, expressions.size() - 1)));
            c.setRightExpression(expressions.get(expressions.size() - 1));
            return c;
        }
        return null;
    }

    @Override
    public PlainSelect sql() {
        PlainSelect preSql = prePlainSelect();
        List<SelectItem> selectItems = preSql.getSelectItems();
        List<DdlNode.Field> fields = currentNode().getOperators().getFields();
        if (!CollectionUtils.isEmpty(fields)) {
            //是否删除原列
            DdlNode.Field field = fields.get(0);
            String columns = this.checkColumns(field);
            String[] split = columns.split(SqlConstants.COMMA);
            List<DdlColumn> columns1 = this.columns();
            List<Function> functions = Arrays.stream(split).map(t -> {
                Function function = new Function();
                function.setName(TO_STRING);
                ExpressionList expressionList = new ExpressionList();
                String type = DdlConstants.STRING;
                for (DdlColumn column : columns1) {
                    String name = column.getName();
                    if (name.equals(t)) {
                        type = column.getType();
                        break;
                    }
                }
                String columnName;
                if (type.contains(DdlConstants.STRING)) {
                    columnName = "IF(%s is not null,%s,'-')";
                } else if (type.contains(DdlConstants.INT)) {
                    columnName = "IF(%s is not null,%s,0)";
                } else {
                    columnName = "IF(%s is not null,%s,NOW())";
                }
                t = String.format(columnName, t, t);
                Column column = new Column(t);
                expressionList.addExpressions(column);
                function.setParameters(expressionList);
                return function;
            }).collect(Collectors.toList());
            String delimiter = field.getDelimiter();
            if (delimiter.contains("\\")) {
                delimiter = delimiter.replace("\\", "\\\\");
            }
            StringValue stringValue = new StringValue(delimiter);
            List<Expression> expressions = Lists.newArrayList();
            for (int i = 0; i < functions.size(); i++) {
                if (i != 0) {
                    expressions.add(stringValue);
                }
                expressions.add(functions.get(i));
            }
            Concat concat = concat(expressions);
            SelectExpressionItem selectExpressionItem = new SelectExpressionItem();
            selectExpressionItem.setExpression(concat);
            selectExpressionItem.setAlias(new Alias(field.getName()));
            selectItems.add(selectExpressionItem);
        }
        preSql.setSelectItems(selectItems);
        log(preSql.toString());
        return preSql;
    }

    @Override
    public List<DdlColumn> columns() {
        super.checkNode();
        final List<DdlColumn> ddlColumns = preColumns();
        List<DdlNode.Field> fields = currentNode().getOperators().getFields();
        DdlNode.Field field = fields.get(0);
        String columns = this.checkColumns(field);
        List<DdlColumn> collect = fields.stream().map(t -> DdlColumn.builder().name(t.getName())
                .type(TYPE_STRING).build()).collect(Collectors.toList());
        ddlColumns.addAll(collect);
        String[] split = columns.split(SqlConstants.COMMA);
        //是否删除原列
        Boolean delOriginalColumn = field.getDelOriginalColumn();
        return ddlColumns.stream().
                filter(new FilterColumnPredicate<>(t -> delOriginalColumn && Lists.newArrayList(split).contains(t)))
                .collect(Collectors.toList());
    }

    private String checkColumns(DdlNode.Field field) {
        String columns = field.getColumns();
        String name = field.getName();
        if (StringUtils.isBlank(columns)) {
            throw new DdlException("请选择要合并的列");
        }
        if (StringUtils.isBlank(name)) {
            throw new DdlException("请输入新的列名称");
        }
        return columns;
    }
}

标签:String,jsqlpaser,List,合并,field,006,new,expressions,columns
来源: https://blog.csdn.net/qyj19920704/article/details/121646745

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有