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

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

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

import cn.org.atool.fluent.mybatis.base.crud.IBaseQuery;
import cn.org.atool.fluent.mybatis.base.model.Column;
import cn.org.atool.fluent.mybatis.base.model.FieldMapping;
import cn.org.atool.fluent.mybatis.base.model.ISqlOp;
import cn.org.atool.fluent.mybatis.functions.IAggregate;

import static cn.org.atool.fluent.mybatis.segment.model.KeyWordSegment.HAVING;

/**
 * BaseHaving: having设置
 *
 * @author darui.wu 2020/6/21 6:22 下午
 */
@SuppressWarnings({"unchecked"})
public abstract class HavingBase<
    H extends HavingBase,
    Q extends IBaseQuery
    >
    extends AggregateSegment> {

    protected final HavingOperator operator = new HavingOperator<>(super.getOrigin());

    protected HavingBase(Q query) {
        super(query);
    }

    protected HavingBase(H selector, IAggregate aggregate) {
        super(selector, aggregate);
    }

    /**
     * 设置having条件
     *
     * @param aggregate having 聚合函数
     * @param op        比较操作
     * @param args      参数列表
     * @return Having设置器
     */
    H aggregate(String aggregate, ISqlOp op, Object... args) {
        this.wrapper.getWrapperData().apply(HAVING, Column.column(aggregate, this.wrapper), op, args);
        return (H) this;
    }

    H apply(String aggregate, ISqlOp op, String func, Object... args) {
        this.wrapper.getWrapperData().apply(HAVING, Column.column(aggregate, this.wrapper), op, func, args);
        return (H) this;
    }

    /**
     * 执行聚合操作
     *
     * @param column    聚合字段
     * @param aggregate 聚合函数
     * @return Having条件判断
     */
    protected HavingOperator apply(FieldMapping column, IAggregate aggregate) {
        Column _column = Column.column(column, this.wrapper);
        return this.operator.aggregate(_column.wrapColumn(), aggregate);
    }

    /**
     * count(*)
     *
     * @return Having条件判断
     */
    public HavingOperator count() {
        return this.operator.aggregate(null, (c) -> "count(1)");
    }

    /**
     * 执行聚合操作
     *
     * @param column 聚合操作, 比如 sum(column) 或者 select中聚合操作的别名
     * @return Having条件判断
     */
    public HavingOperator apply(String column) {
        Column _column = Column.column(column, this.wrapper);
        return this.operator.aggregate(_column.wrapColumn(),
            this.aggregate == null ? c -> c : this.aggregate);
    }

    @Override
    protected HavingOperator apply() {
        this.apply(this.current, this.aggregate);
        return this.operator;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy