All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.org.atool.fluent.mybatis.base.model.Column Maven / Gradle / Ivy

package cn.org.atool.fluent.mybatis.base.model;

import cn.org.atool.fluent.mybatis.metadata.DbType;
import cn.org.atool.fluent.mybatis.segment.BaseWrapper;
import cn.org.atool.fluent.mybatis.segment.model.ColumnSegment;
import lombok.Getter;

import static cn.org.atool.fluent.mybatis.If.notBlank;
import static cn.org.atool.fluent.mybatis.mapper.FluentConst.Param_EW;
import static cn.org.atool.fluent.mybatis.mapper.StrConstant.EMPTY;
import static cn.org.atool.fluent.mybatis.utility.MybatisUtil.isColumnName;

/**
 * sql操作字段信息
 *
 * @author darui.wu
 */
@SuppressWarnings({"unchecked", "rawtypes"})
@Getter
public class Column {
    public static final Column EMPTY_COLUMN = new Column(EMPTY, null) {
        protected DbType dbType() {
            return DbType.OTHER;
        }
    };

    private final String column;

    private final BaseWrapper wrapper;

    private final FieldMapping mapping;

    private Column(String column, BaseWrapper wrapper) {
        this.column = column;
        this.wrapper = wrapper;
        this.mapping = wrapper == null ? null : wrapper.column(column);
    }

    public Column(FieldMapping mapping, BaseWrapper wrapper) {
        this.column = mapping.column;
        this.wrapper = wrapper;
        this.mapping = mapping;
    }

    /**
     * 字段部分 [t.]`column`
     *
     * @return 字段部分 [t.]`column`
     */
    public String wrapColumn() {
        String columnAs = column;
        if (this.isColumnNameAndNotAlias()) {
            columnAs = this.dbType().wrap(column);
        }
        String tAlias = EMPTY;
        /** 非别名字段 && 表别名非空 **/
        if (wrapper != null &&
            notBlank(wrapper.getTableAlias()) &&
            this.isColumnNameAndNotAlias()) {
            tAlias = wrapper.getTableAlias() + ".";
        }
        return tAlias + columnAs;
    }

    protected DbType dbType() {
        if (wrapper != null && wrapper.dbType() != null) {
            return wrapper.dbType();
        } else {
            return DbType.OTHER;
        }
    }

    /**
     * 字段部分 [t.]`column`
     *
     * @return 字段部分 [t.]`column`
     */
    public ColumnSegment columnSegment() {
        String columnAsAlias = this.wrapColumn();
        return ColumnSegment.column(columnAsAlias);
    }

    private boolean isColumnNameAndNotAlias() {
        if (wrapper == null) {
            return false;
        }
        String unWrapper = this.dbType().unwrap(column);
        return isColumnName(unWrapper) &&
            !wrapper.getWrapperData().getFieldAlias().contains(unWrapper);
    }

    public boolean isAssignableFrom(Object para) {
        if (para == null ||
            this.mapping == null ||
            this.mapping.javaType == null ||
            this.mapping.typeHandler == null) {
            return false;
        }
        Class pClass = para.getClass();
        return this.mapping.javaType.isAssignableFrom(pClass);
    }

    /**
     * 是映射字段, 并且para是映射字段类型值
     *
     * @param column 映射字段定义
     * @param para   参数值
     * @return true: 字段类型和参数类型一样
     */
    public static boolean isFieldAndAssignableFrom(Column column, Object para) {
        return column != null && column.isAssignableFrom(para);
    }

    /**
     * 返回 #{variableName, javaType=x.y.z.Name, typeHandler=xyzHandler}
     *
     * @param column   字段名称
     * @param paraName 变量名
     * @param para     变量值
     * @return #{variableName, javaType=x.y.z.Name, typeHandler=xyzHandler}
     */
    public static String wrapColumn(Column column, String paraName, Object para) {
        StringBuilder buff = new StringBuilder("#{")
            .append(Param_EW).append(Wrapper_Para).append(paraName);
        if (Column.isFieldAndAssignableFrom(column, para)) {
            buff.append(", ").append("javaType=").append(column.mapping.javaType.getName())
                .append(", ").append("typeHandler=").append(column.mapping.typeHandler.getName());
        }
        return buff.append("}").toString();
    }

    static final String Wrapper_Para = ".wrapperData.parameters.";

    public static Column column(String column, BaseWrapper wrapper) {
        return new Column(column, wrapper);
    }

    public static Column column(FieldMapping mapping, BaseWrapper wrapper) {
        return new Column(mapping, wrapper);
    }

    @Override
    public String toString() {
        return "Column[" + column + ']';
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy