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

org.ibatis.persist.impl.predicate.InPredicate Maven / Gradle / Ivy

package org.ibatis.persist.impl.predicate;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.ibatis.persist.criteria.Expression;
import org.ibatis.persist.criteria.Subquery;

import org.ibatis.persist.impl.CriteriaBuilderImpl;
import org.ibatis.persist.impl.Renderable;
import org.ibatis.persist.impl.RenderingContext;
import org.ibatis.persist.impl.expression.LiteralExpression;

/**
 * Models an [NOT] IN restriction
 */
@SuppressWarnings("unchecked")
public class InPredicate
		extends AbstractSimplePredicate
		implements CriteriaBuilderImpl.In {
	private final Expression expression;
	private final List> values;

	/**
	 * Constructs an IN predicate against a given expression with an empty list of values.
	 *
	 * @param criteriaBuilder The query builder from which this originates.
	 * @param expression The expression.
	 */
	public InPredicate(
			CriteriaBuilderImpl criteriaBuilder,
			Expression expression) {
		this( criteriaBuilder, expression, new ArrayList>() );
	}

	/**
	 * Constructs an IN predicate against a given expression with the given list of expression values.
	 *
	 * @param criteriaBuilder The query builder from which this originates.
	 * @param expression The expression.
	 * @param values The value list.
	 */
	public InPredicate(
			CriteriaBuilderImpl criteriaBuilder,
			Expression expression,
			Expression... values) {
		this( criteriaBuilder, expression, Arrays.asList( values ) );
	}

	/**
	 * Constructs an IN predicate against a given expression with the given list of expression values.
	 *
	 * @param criteriaBuilder The query builder from which this originates.
	 * @param expression The expression.
	 * @param values The value list.
	 */
	public InPredicate(
			CriteriaBuilderImpl criteriaBuilder,
			Expression expression,
			List> values) {
		super( criteriaBuilder );
		this.expression = expression;
		this.values = values;
	}

	/**
	 * Constructs an IN predicate against a given expression with the given given literal value list.
	 *
	 * @param criteriaBuilder The query builder from which this originates.
	 * @param expression The expression.
	 * @param values The value list.
	 */
	public InPredicate(
			CriteriaBuilderImpl criteriaBuilder,
			Expression expression,
			T... values) {
		this( criteriaBuilder, expression, Arrays.asList( values ) );
	}

	/**
	 * Constructs an IN predicate against a given expression with the given literal value list.
	 *
	 * @param criteriaBuilder The query builder from which this originates.
	 * @param expression The expression.
	 * @param values The value list.
	 */
	public InPredicate(
			CriteriaBuilderImpl criteriaBuilder,
			Expression expression,
			Collection values) {
		super( criteriaBuilder );
		this.expression = expression;
		this.values = new ArrayList>( values.size() );
        for (T value : values) {
            this.values.add(new LiteralExpression(criteriaBuilder, value));
        }
	}

	@Override
	public Expression getExpression() {
		return ( Expression ) expression;
	}

	public Expression getExpressionInternal() {
		return expression;
	}

	public List> getValues() {
		return values;
	}

	@Override
	public InPredicate value(T value) {
		return value( new LiteralExpression( criteriaBuilder(), value ) );
	}

	@Override
	public InPredicate value(Expression value) {
		values.add( value );
		return this;
	}

	@Override
    public void render(boolean isNegated, RenderingContext rc) {
        ((Renderable) getExpression()).render(rc);

        if (isNegated) {
            rc.append(" not");
        }
        rc.append(" in ");

        // subquery expressions are already wrapped in parenthesis, so we only need to
        // render the parenthesis here if the values represent an explicit value list
        boolean isInSubqueryPredicate = getValues().size() == 1 && Subquery.class.isInstance(getValues().get(0));
        if (isInSubqueryPredicate) {
            ((Renderable) getValues().get(0)).render(rc);
        } else {
            rc.append('(');
            String sep = "";
            for (Expression value : getValues()) {
                rc.append(sep);
                ((Renderable) value).render(rc);
                sep = ", ";
            }
            rc.append(')');
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy