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

cn.org.atool.fluent.mybatis.segment.JoinWrapperData Maven / Gradle / Ivy

package cn.org.atool.fluent.mybatis.segment;

import cn.org.atool.fluent.mybatis.base.crud.BaseQuery;
import cn.org.atool.fluent.mybatis.segment.model.KeyWordSegment;
import cn.org.atool.fluent.mybatis.segment.model.Parameters;
import cn.org.atool.fluent.mybatis.segment.model.WrapperData;
import lombok.Getter;

import java.util.ArrayList;
import java.util.List;

import static cn.org.atool.fluent.mybatis.base.model.FieldMapping.alias;

/**
 * 关联查询条件设置
 *
 * @author wudarui
 */
@SuppressWarnings({"rawtypes", "unchecked"})
public class JoinWrapperData extends WrapperData {

    private final BaseQuery query;

    private final List queries;

    @Getter
    private final Parameters parameters;

    public JoinWrapperData(BaseQuery query, List queries, Parameters shared) {
        this.query = query;
        this.queries = queries;
        this.parameters = shared;
        this.tables.add(this.query.wrapperData.getTable());
    }

    private final List tables = new ArrayList<>();

    public void addTable(String table) {
        tables.add(table);
    }

    @Override
    public String getTable() {
        return String.join(" ", this.tables);
    }

    private boolean selectMerged = false;

    @Override
    public String getSqlSelect() {
        if (selectMerged) {
            return super.getSqlSelect();
        }
        this.sqlSelect.addAll(this.query.wrapperData.sqlSelect());
        for (BaseQuery query : this.queries) {
            this.sqlSelect.addAll(query.wrapperData.sqlSelect());
        }
        if (this.sqlSelect.isEmpty()) {
            this.query.allFields().forEach(c -> this.sqlSelect.add(alias(query.tableAlias, (String) c)));
            for (BaseQuery query : this.queries) {
                query.allFields().forEach(c -> this.sqlSelect.add(alias(query.tableAlias, (String) c)));
            }
        }
        selectMerged = true;
        return super.getSqlSelect();
    }

    private boolean whereMerged = false;

    @Override
    public String getWhereSql() {
        if (whereMerged) {
            return super.getWhereSql();
        }
        this.mergeSegments.getWhere().add(KeyWordSegment.AND, this.query.wrapperData.whereSegments());
        for (BaseQuery query : this.queries) {
            this.mergeSegments.getWhere().add(KeyWordSegment.AND, query.wrapperData.whereSegments());
        }
        whereMerged = true;
        return super.getWhereSql();
    }

    private boolean groupByMerged = false;

    @Override
    public String getGroupBy() {
        if (groupByMerged) {
            return super.getGroupBy();
        }
        this.query.wrapperData.getMergeSegments().getGroupBy().getSegments().forEach(this.mergeSegments.getGroupBy()::addAll);
        this.query.wrapperData.getMergeSegments().getHaving().getSegments().forEach(this.mergeSegments.getHaving()::addAll);
        for (BaseQuery query : this.queries) {
            query.wrapperData.getMergeSegments().getGroupBy().getSegments().forEach(this.mergeSegments.getGroupBy()::addAll);
            if (!this.mergeSegments.getHaving().isEmpty() &&
                !query.wrapperData.getMergeSegments().getHaving().getSegments().isEmpty()) {
                this.mergeSegments.getHaving().addAll(KeyWordSegment.AND);
            }
            query.wrapperData.getMergeSegments().getHaving().getSegments().forEach(this.mergeSegments.getHaving()::addAll);
        }
        this.groupByMerged = true;
        return super.getGroupBy();
    }

    private boolean orderByMerged = false;

    @Override
    public String getOrderBy() {
        if (orderByMerged) {
            return super.getOrderBy();
        }
        this.query.wrapperData.getMergeSegments().getOrderBy().getSegments().forEach(this.mergeSegments.getOrderBy()::addAll);
        for (BaseQuery query : this.queries) {
            query.wrapperData.getMergeSegments().getOrderBy().getSegments().forEach(this.mergeSegments.getOrderBy()::addAll);
        }
        orderByMerged = true;
        return super.getOrderBy();
    }

    @Override
    public String getUpdateStr() {
        throw new RuntimeException("not support!");
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy