/* * 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.criterion; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Locale; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.engine.spi.TypedValue; import org.hibernate.internal.util.StringHelper; /** * A sequence of a logical expressions combined by some * associative logical operator * * @author Gavin King * @author Steve Ebersole */ public class Junction implements Criterion { private final Nature nature; private final List<Criterion> conditions = new ArrayList<Criterion>(); protected Junction(Nature nature) { this.nature = nature; } protected Junction(Nature nature, Criterion... criterion) { this( nature ); Collections.addAll( conditions, criterion ); } /** * Adds a criterion to the junction (and/or) * * @param criterion The criterion to add * * @return {@code this}, for method chaining */ public Junction add(Criterion criterion) { conditions.add( criterion ); return this; } public Nature getNature() { return nature; } /** * Access the conditions making up the junction * * @return the criterion */ public Iterable<Criterion> conditions() { return conditions; } @Override public TypedValue[] getTypedValues(Criteria crit, CriteriaQuery criteriaQuery) throws HibernateException { final ArrayList<TypedValue> typedValues = new ArrayList<TypedValue>(); for ( Criterion condition : conditions ) { final TypedValue[] subValues = condition.getTypedValues( crit, criteriaQuery ); Collections.addAll( typedValues, subValues ); } return typedValues.toArray( new TypedValue[ typedValues.size() ] ); } @Override public String toSqlString(Criteria crit, CriteriaQuery criteriaQuery) throws HibernateException { if ( conditions.size()==0 ) { return "1=1"; } final StringBuilder buffer = new StringBuilder().append( '(' ); final Iterator itr = conditions.iterator(); while ( itr.hasNext() ) { buffer.append( ( (Criterion) itr.next() ).toSqlString( crit, criteriaQuery ) ); if ( itr.hasNext() ) { buffer.append( ' ' ) .append( nature.getOperator() ) .append( ' ' ); } } return buffer.append( ')' ).toString(); } @Override public String toString() { return '(' + StringHelper.join( ' ' + nature.getOperator() + ' ', conditions.iterator() ) + ')'; } /** * The type of junction */ public static enum Nature { /** * An AND */ AND, /** * An OR */ OR; /** * The corresponding SQL operator * * @return SQL operator */ public String getOperator() { return name().toLowerCase(Locale.ROOT); } } }