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

org.hibernate.query.sqm.tree.predicate.SqmInListPredicate Maven / Gradle / Ivy

There is a newer version: 7.0.0.Beta1
Show newest version
/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later
 * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
 */
package org.hibernate.query.sqm.tree.predicate;

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

import javax.persistence.criteria.Expression;

import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.query.criteria.JpaExpression;
import org.hibernate.query.internal.QueryHelper;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.tree.expression.SqmExpression;

/**
 * @author Steve Ebersole
 */
public class SqmInListPredicate extends AbstractNegatableSqmPredicate implements SqmInPredicate {
	private final SqmExpression testExpression;
	private final List> listExpressions;

	public SqmInListPredicate(SqmExpression testExpression, NodeBuilder nodeBuilder) {
		this( testExpression, new ArrayList<>(), nodeBuilder );
	}

	@SuppressWarnings({"unchecked", "unused"})
	public SqmInListPredicate(
			SqmExpression testExpression,
			NodeBuilder nodeBuilder,
			SqmExpression... listExpressions) {
		this( testExpression, ArrayHelper.toExpandableList( listExpressions ), nodeBuilder );
	}

	public SqmInListPredicate(
			SqmExpression testExpression,
			List> listExpressions,
			NodeBuilder nodeBuilder) {
		this( testExpression, listExpressions, false, nodeBuilder );
	}

	@SuppressWarnings("WeakerAccess")
	public SqmInListPredicate(
			SqmExpression testExpression,
			List> listExpressions,
			boolean negated,
			NodeBuilder nodeBuilder) {
		super( negated, nodeBuilder );
		this.testExpression = testExpression;
		this.listExpressions = listExpressions;
		for ( SqmExpression listExpression : listExpressions ) {
			implyListElementType( listExpression );
		}

	}

	@Override
	public SqmExpression getTestExpression() {
		return testExpression;
	}

	@Override
	public SqmExpression getExpression() {
		return getTestExpression();
	}

	@Override
	public SqmInPredicate value(Object value) {
		addExpression( nodeBuilder().literal( value ) );
		return this;
	}

	@Override
	public SqmInPredicate value(Expression value) {
		addExpression( (SqmExpression) value );
		return this;
	}

	@Override
	public SqmInPredicate value(JpaExpression value) {
		addExpression( (SqmExpression) value );
		return this;
	}

	public List> getListExpressions() {
		return listExpressions;
	}

	public void addExpression(SqmExpression expression) {
		implyListElementType( expression );

		//noinspection unchecked
		listExpressions.add( expression );
	}

	private void implyListElementType(SqmExpression expression) {
		//noinspection unchecked
		expression.applyInferableType(
				QueryHelper.highestPrecedenceType2(
						getTestExpression().getNodeType(),
						expression.getNodeType()
				)
		);
	}

	@Override
	public  X accept(SemanticQueryWalker walker) {
		return walker.visitInListPredicate( this );
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy