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

cat.nyaa.nyaacore.orm.WhereClause Maven / Gradle / Ivy

There is a newer version: 3.12.2
Show newest version
package cat.nyaa.nyaacore.orm;

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

public class WhereClause {
    public static final WhereClause EMPTY = new WhereClause();

    private final List columns = new ArrayList<>();
    private final List comparators = new ArrayList<>();
    private final List javaObjects = new ArrayList<>();

    public WhereClause() {
    }

    public WhereClause(String columnName, String comparator, Object obj) {
        this.where(columnName, comparator, obj);
    }

    public static WhereClause EQ(String columnName, Object obj) {
        return new WhereClause().whereEq(columnName, obj);
    }

    public WhereClause whereEq(String columnName, Object obj) {
        if (obj == null) throw new IllegalArgumentException("please use `IS' to compare NULL value");
        return where(columnName, "=", obj);
    }

    /**
     * comparator can be any SQL comparator.
     * e.g. =, >, <
     *
     * @param columnName
     * @param comparator if it's a keyword, you need to add spaces before and after, e.g. " LIKE ", if obj is null, this should use " IS " instead of "="
     * @param obj        the java object, can be null
     */
    public WhereClause where(String columnName, String comparator, Object obj) {
        if (columnName == null || comparator == null) throw new IllegalArgumentException();
        columns.add(columnName);
        comparators.add(comparator);
        javaObjects.add(obj);
        return this;
    }

    /**
     * sql in e.g.  "DELETE FROM table"
     * sql out e.g. "DELETE FROM table WHERE col1=? AND col2=? AND col3=?"
     *
     * @param sql
     * @param positionalParameterHolder
     * @param columnTypeMapping
     * @return
     */
    public String appendWhereClause(String sql, List positionalParameterHolder, ObjectModifier columnTypeMapping) {
        if (columns.size() > 0) {
            sql += " WHERE";
            StringBuilder sqlBuilder = new StringBuilder(sql);
            for (int idx = 0; idx < columns.size(); idx++) {
                if (idx > 0) sqlBuilder.append(" AND");
                sqlBuilder.append(" ").append(columns.get(idx)).append(comparators.get(idx)).append("?");
                positionalParameterHolder.add(columnTypeMapping.getTypeConvertorForColumn(columns.get(idx)).toSqlType(javaObjects.get(idx)));
            }
            sql = sqlBuilder.toString();
        }
        return sql;
    }
}