VisitorContext.java

package com.github.mygreen.sqlmapper.core.where.metamodel;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import com.github.mygreen.sqlmapper.core.dialect.Dialect;
import com.github.mygreen.sqlmapper.core.meta.EntityMeta;
import com.github.mygreen.sqlmapper.core.meta.EntityMetaFactory;
import com.github.mygreen.sqlmapper.core.query.TableNameResolver;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

/**
 * 式であるノードを巡回する際に持ち回るコンテキスト。
 * <p>設定値や組み立て中のSQL/パラメータを保持します。
 *
 *
 * @author T.TSUCHIE
 *
 */
@RequiredArgsConstructor
public class VisitorContext {

    /**
     * 検索対象となるテーブルのエンティティ情報のマップ
     */
    @Getter
    private final Map<Class<?>, EntityMeta> entityMetaMap;

    /**
     * SQLの方言情報
     */
    @Getter
    private final Dialect dialect;

    /**
     * エンティティのメタ情報を作成する。
     */
    @Getter
    private final EntityMetaFactory entityMetaFactory;

    /**
     * テーブル名のエイリアス管理
     */
    @Getter
    private final TableNameResolver tableNameResolver;

    /**
     * SQL中のパラメータ変数。
     *
     */
    @Getter
    private List<Object> paramValues = new ArrayList<>();

    /**
     * 組み立てたクライテリア
     */
    private StringBuilder criteria = new StringBuilder();

    /**
     * 親の情報を引き継いでインスタンスを作成します。
     * <p>引き継ぐ情報。
     * <ul>
     *  <li>{@link #entityMetaMap}</li>
     *  <li>{@link #dialect}</li>
     *  <li>{@link #tableNameResolver}</li>
     * </ul>
     * @param parent 親のコンテキスト
     */
    public VisitorContext(VisitorContext parent) {
        this.entityMetaMap = parent.entityMetaMap;
        this.dialect = parent.dialect;
        this.entityMetaFactory = parent.entityMetaFactory;
        this.tableNameResolver = parent.tableNameResolver;
    }

    /**
     * SQLのプレースホルダーとして設定する値を追加します。
     * @param value SQLに渡す値。
     */
    public void addParamValue(Object value) {
        this.paramValues.add(value);
    }

    /**
     *  SQLのプレースホルダーとして設定する複数の値を追加します。
     * @param values SQLに渡す値のコレクション。
     */
    public void addParamValues(Collection<?> values) {
        this.paramValues.addAll(values);
    }

    /**
     * SQLを追加します。
     * @param sql SQL
     * @return 現在組み立て中のSQLのバッファー。
     */
    public StringBuilder appendSql(String sql) {
        this.criteria.append(sql);
        return criteria;
    }

    /**
     * 組み立てたSQL(クライテリア)を文字列として取得します。
     * @return 組み立てたSQL
     */
    public String getCriteria() {
        return criteria.toString();
    }

}