[hibernate-commits] Hibernate SVN: r17252 - in core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria: expression and 1 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Aug 7 14:38:07 EDT 2009


Author: steve.ebersole at jboss.com
Date: 2009-08-07 14:38:07 -0400 (Fri, 07 Aug 2009)
New Revision: 17252

Added:
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/CoalesceExpression.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ConcatExpression.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/NullifExpression.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/SearchedCaseExpression.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/SimpleCaseExpression.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/ExistsPredicate.java
Modified:
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/QueryBuilderImpl.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/LiteralExpression.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/AbstractSimplePredicate.java
Log:
EJB-447 : Implement JPA 2.0 criteria apis (miscellaneous)

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/QueryBuilderImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/QueryBuilderImpl.java	2009-08-07 12:12:20 UTC (rev 17251)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/QueryBuilderImpl.java	2009-08-07 18:38:07 UTC (rev 17252)
@@ -42,9 +42,15 @@
 
 import org.hibernate.ejb.EntityManagerFactoryImpl;
 import org.hibernate.ejb.criteria.expression.BinaryArithmeticOperation;
+import org.hibernate.ejb.criteria.expression.CoalesceExpression;
 import org.hibernate.ejb.criteria.expression.CompoundSelectionImpl;
+import org.hibernate.ejb.criteria.expression.ConcatExpression;
+import org.hibernate.ejb.criteria.expression.ExpressionImpl;
 import org.hibernate.ejb.criteria.expression.ParameterExpressionImpl;
 import org.hibernate.ejb.criteria.expression.LiteralExpression;
+import org.hibernate.ejb.criteria.expression.NullifExpression;
+import org.hibernate.ejb.criteria.expression.SearchedCaseExpression;
+import org.hibernate.ejb.criteria.expression.SimpleCaseExpression;
 import org.hibernate.ejb.criteria.expression.SubqueryComparisonModifierExpression;
 import org.hibernate.ejb.criteria.expression.UnaryArithmeticOperation;
 import org.hibernate.ejb.criteria.expression.function.AbsFunction;
@@ -68,6 +74,7 @@
 import org.hibernate.ejb.criteria.predicate.ComparisonPredicate;
 import org.hibernate.ejb.criteria.predicate.InPredicate;
 import org.hibernate.ejb.criteria.predicate.BetweenPredicate;
+import org.hibernate.ejb.criteria.predicate.ExistsPredicate;
 import org.hibernate.ejb.criteria.predicate.LikePredicate;
 import static org.hibernate.ejb.criteria.predicate.ComparisonPredicate.ComparisonOperator;
 
@@ -1023,7 +1030,7 @@
 	 * {@inheritDoc}
 	 */
 	public Predicate exists(Subquery<?> subquery) {
-		return null;
+		return new ExistsPredicate( this, subquery );
 	}
 
 	/**
@@ -1063,88 +1070,140 @@
 	}
 
 
-	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+	// miscellaneous expressions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-	public <C extends Collection<?>> Predicate isEmpty(Expression<C> cExpression) {
-		return null;
+	/**
+	 * {@inheritDoc}
+	 */
+	public <Y> Expression<Y> coalesce(Expression<? extends Y> exp1, Expression<? extends Y> exp2) {
+		return coalesce( (Class<Y>)null, exp1, exp2 );
 	}
 
-	public <C extends Collection<?>> Predicate isNotEmpty(Expression<C> cExpression) {
-		return null;
+	public <Y> Expression<Y> coalesce(Class<Y> type, Expression<? extends Y> exp1, Expression<? extends Y> exp2) {
+		return new CoalesceExpression<Y>( this, type ).value( exp1 ).value( exp2 );
 	}
 
-	public <C extends Collection<?>> Expression<Integer> size(C c) {
-		return null;
+	/**
+	 * {@inheritDoc}
+	 */
+	public <Y> Expression<Y> coalesce(Expression<? extends Y> exp1, Y exp2) {
+		return coalesce( (Class<Y>)null, exp1, exp2 );
 	}
 
-	public <C extends Collection<?>> Expression<Integer> size(Expression<C> cExpression) {
-		return null;
+	public <Y> Expression<Y> coalesce(Class<Y> type, Expression<? extends Y> exp1, Y exp2) {
+		return new CoalesceExpression<Y>( this, type ).value( exp1 ).value( exp2 );
 	}
 
-	public <E, C extends Collection<E>> Predicate isMember(E e, Expression<C> cExpression) {
-		return null;
+	/**
+	 * {@inheritDoc}
+	 */
+	public <T> Coalesce<T> coalesce() {
+		return coalesce( (Class<T>)null );
 	}
 
-	public <E, C extends Collection<E>> Predicate isNotMember(E e, Expression<C> cExpression) {
-		return null;
+	public <T> Coalesce<T> coalesce(Class<T> type) {
+		return new CoalesceExpression<T>( this, type );
 	}
 
-	public <E, C extends Collection<E>> Predicate isMember(Expression<E> eExpression, Expression<C> cExpression) {
-		return null;
+	/**
+	 * {@inheritDoc}
+	 */
+	public Expression<String> concat(Expression<String> string1, Expression<String> string2) {
+		return new ConcatExpression( this, string1, string2 );
 	}
 
-	public <E, C extends Collection<E>> Predicate isNotMember(Expression<E> eExpression, Expression<C> cExpression) {
-		return null;
+	/**
+	 * {@inheritDoc}
+	 */
+	public Expression<String> concat(Expression<String> string1, String string2) {
+		return new ConcatExpression( this, string1, string2 );
 	}
 
-	public <V, M extends Map<?, V>> Expression<Collection<V>> values(M map) {
-		return null;
+	/**
+	 * {@inheritDoc}
+	 */
+	public Expression<String> concat(String string1, Expression<String> string2) {
+		return new ConcatExpression( this, string1, string2 );
 	}
 
-	public <K, M extends Map<K, ?>> Expression<Set<K>> keys(M m) {
-		return null;
+	/**
+	 * {@inheritDoc}
+	 */
+	public <Y> Expression<Y> nullif(Expression<Y> exp1, Expression<?> exp2) {
+		return nullif( (Class<Y>)null, exp1, exp2 );
 	}
 
-	public Expression<String> concat(Expression<String> stringExpression, Expression<String> stringExpression1) {
-		return null;
+	public <Y> Expression<Y> nullif(Class<Y> type, Expression<Y> exp1, Expression<?> exp2) {
+		return new NullifExpression<Y>( this, type, exp1, exp2 );
 	}
 
-	public Expression<String> concat(Expression<String> stringExpression, String s) {
-		return null;
+	public <Y> Expression<Y> nullif(Expression<Y> exp1, Y exp2) {
+		return nullif( (Class<Y>)null, exp1, exp2 );
 	}
 
-	public Expression<String> concat(String s, Expression<String> stringExpression) {
-		return null;
+	public <Y> Expression<Y> nullif(Class<Y> type, Expression<Y> exp1, Y exp2) {
+		return new NullifExpression<Y>( this, type, exp1, exp2 );
 	}
 
-	public <Y> Expression<Y> coalesce(Expression<? extends Y> expression, Expression<? extends Y> expression1) {
-		return null;
+	public <C, R> SimpleCase<C, R> selectCase(Expression<? extends C> expression) {
+		return selectCase( (Class<R>)null, expression );
 	}
 
-	public <Y> Expression<Y> coalesce(Expression<? extends Y> expression, Y y) {
-		return null;
+	public <C, R> SimpleCase<C, R> selectCase(Class<R> type, Expression<? extends C> expression) {
+		return new SimpleCaseExpression<C, R>( this, type, expression );
 	}
 
-	public <Y> Expression<Y> nullif(Expression<Y> yExpression, Expression<?> expression) {
-		return null;
+	public <R> Case<R> selectCase() {
+		return selectCase( (Class<R>)null );
 	}
 
-	public <Y> Expression<Y> nullif(Expression<Y> yExpression, Y y) {
-		return null;
+	public <R> Case<R> selectCase(Class<R> type) {
+		return new SearchedCaseExpression<R>( this, type );
 	}
 
-	public <T> Coalesce<T> coalesce() {
-		return null;
+
+	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	public <C extends Collection<?>> Predicate isEmpty(Expression<C> cExpression) {
+		throw new UnsupportedOperationException( "Not yet implemented!" );
 	}
 
-	public <C, R> SimpleCase<C, R> selectCase(Expression<? extends C> expression) {
-		return null;
+	public <C extends Collection<?>> Predicate isNotEmpty(Expression<C> colelctionExpression) {
+		return isEmpty( colelctionExpression ).negate();
 	}
 
-	public <R> Case<R> selectCase() {
-		return null;
+	public <C extends Collection<?>> Expression<Integer> size(C c) {
+		throw new UnsupportedOperationException( "Not yet implemented!" );
 	}
+
+	public <C extends Collection<?>> Expression<Integer> size(Expression<C> cExpression) {
+		throw new UnsupportedOperationException( "Not yet implemented!" );
+	}
+
+	public <E, C extends Collection<E>> Predicate isMember(E e, Expression<C> cExpression) {
+		throw new UnsupportedOperationException( "Not yet implemented!" );
+	}
+
+	public <E, C extends Collection<E>> Predicate isNotMember(E e, Expression<C> cExpression) {
+		throw new UnsupportedOperationException( "Not yet implemented!" );
+	}
+
+	public <E, C extends Collection<E>> Predicate isMember(Expression<E> eExpression, Expression<C> cExpression) {
+		throw new UnsupportedOperationException( "Not yet implemented!" );
+	}
+
+	public <E, C extends Collection<E>> Predicate isNotMember(Expression<E> eExpression, Expression<C> cExpression) {
+		throw new UnsupportedOperationException( "Not yet implemented!" );
+	}
+
+	public <V, M extends Map<?, V>> Expression<Collection<V>> values(M map) {
+		throw new UnsupportedOperationException( "Not yet implemented!" );
+	}
+
+	public <K, M extends Map<K, ?>> Expression<Set<K>> keys(M m) {
+		throw new UnsupportedOperationException( "Not yet implemented!" );
+	}
 }

Added: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/CoalesceExpression.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/CoalesceExpression.java	                        (rev 0)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/CoalesceExpression.java	2009-08-07 18:38:07 UTC (rev 17252)
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.ejb.criteria.expression;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.QueryBuilder.Coalesce;
+import org.hibernate.ejb.criteria.QueryBuilderImpl;
+
+/**
+ * Models an ANSI SQL <tt>COALESCE</tt> expression.  <tt>COALESCE</tt> is a specialized <tt>CASE</tt> statement.
+ *
+ * @author Steve Ebersole
+ */
+public class CoalesceExpression<T> extends ExpressionImpl<T> implements Coalesce<T> {
+	private final List<Expression<? extends T>> expressions;
+	private Class<T> javaType;
+
+	public CoalesceExpression(QueryBuilderImpl queryBuilder) {
+		this( queryBuilder, null );
+	}
+
+	public CoalesceExpression(
+			QueryBuilderImpl queryBuilder,
+			Class<T> javaType) {
+		super( queryBuilder, javaType );
+		this.javaType = javaType;
+		this.expressions = new ArrayList<Expression<? extends T>>();
+	}
+
+	@Override
+	public Class<T> getJavaType() {
+		return javaType;
+	}
+
+	public Coalesce<T> value(T value) {
+		return value( new LiteralExpression<T>( queryBuilder(), value ) );
+	}
+
+	public Coalesce<T> value(Expression<? extends T> value) {
+		expressions.add( value );
+		if ( javaType == null ) {
+			javaType = (Class<T>) value.getJavaType();
+		}
+		return this;
+	}
+
+}

Added: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ConcatExpression.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ConcatExpression.java	                        (rev 0)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ConcatExpression.java	2009-08-07 18:38:07 UTC (rev 17252)
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.ejb.criteria.expression;
+
+import javax.persistence.criteria.Expression;
+import org.hibernate.ejb.criteria.QueryBuilderImpl;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class ConcatExpression extends ExpressionImpl<String> {
+	private Expression<String> string1;
+	private Expression<String> string2;
+
+	public ConcatExpression(
+			QueryBuilderImpl queryBuilder,
+			Expression<String> expression1,
+			Expression<String> expression2) {
+		super( queryBuilder, String.class );
+		this.string1 = expression1;
+		this.string2 = expression2;
+	}
+
+	public ConcatExpression(
+			QueryBuilderImpl queryBuilder, 
+			Expression<String> string1, 
+			String string2) {
+		this( queryBuilder, string1, wrap(queryBuilder, string2) );
+	}
+
+	private static Expression<String> wrap(QueryBuilderImpl queryBuilder, String string) {
+		return new LiteralExpression<String>( queryBuilder, string );
+	}
+
+	public ConcatExpression(
+			QueryBuilderImpl queryBuilder,
+			String string1,
+			Expression<String> string2) {
+		this( queryBuilder, wrap(queryBuilder, string1), string2 );
+	}
+
+	public Expression<String> getString1() {
+		return string1;
+	}
+
+	public Expression<String> getString2() {
+		return string2;
+	}
+
+}

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/LiteralExpression.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/LiteralExpression.java	2009-08-07 12:12:20 UTC (rev 17251)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/LiteralExpression.java	2009-08-07 18:38:07 UTC (rev 17252)
@@ -31,11 +31,16 @@
 public class LiteralExpression<T> extends ExpressionImpl<T> {
 	private final T literal;
 
-	public LiteralExpression(
-			QueryBuilderImpl queryBuilder,
-			T literal) {
-		//noinspection unchecked
-		super( queryBuilder, ( Class<T> ) literal.getClass() );
+	public LiteralExpression(QueryBuilderImpl queryBuilder, T literal) {
+		this( queryBuilder, (Class<T>) determineClass( literal ), literal );
+	}
+
+	private static Class determineClass(Object literal) {
+		return literal == null ? null : literal.getClass();
+	}
+
+	public LiteralExpression(QueryBuilderImpl queryBuilder, Class<T> type, T literal) {
+		super( queryBuilder, type );
 		this.literal = literal;
 	}
 

Added: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/NullifExpression.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/NullifExpression.java	                        (rev 0)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/NullifExpression.java	2009-08-07 18:38:07 UTC (rev 17252)
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.ejb.criteria.expression;
+
+import javax.persistence.criteria.Expression;
+import org.hibernate.ejb.criteria.QueryBuilderImpl;
+
+/**
+ * Models an ANSI SQL <tt>NULLIF</tt> expression.  <tt>NULLIF</tt> is a specialized <tt>CASE</tt> statement.
+ *
+ * @author Steve Ebersole
+ */
+public class NullifExpression<T> extends ExpressionImpl<T> {
+	private final Expression<? extends T> primaryExpression;
+	private final Expression<?> secondaryExpression;
+
+	public NullifExpression(
+			QueryBuilderImpl queryBuilder,
+			Class<T> javaType,
+			Expression<? extends T> primaryExpression,
+			Expression<?> secondaryExpression) {
+		super( queryBuilder, (Class<T>)determineType(javaType, primaryExpression) );
+		this.primaryExpression = primaryExpression;
+		this.secondaryExpression = secondaryExpression;
+	}
+
+	public NullifExpression(
+			QueryBuilderImpl queryBuilder,
+			Class<T> javaType,
+			Expression<? extends T> primaryExpression,
+			Object secondaryExpression) {
+		super( queryBuilder, (Class<T>)determineType(javaType, primaryExpression) );
+		this.primaryExpression = primaryExpression;
+		this.secondaryExpression = new LiteralExpression( queryBuilder, secondaryExpression );
+	}
+
+	private static Class determineType(Class javaType, Expression primaryExpression) {
+		return javaType != null ? javaType : primaryExpression.getJavaType();
+	}
+
+	public Expression<? extends T> getPrimaryExpression() {
+		return primaryExpression;
+	}
+
+	public Expression<?> getSecondaryExpression() {
+		return secondaryExpression;
+	}
+
+}

Added: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/SearchedCaseExpression.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/SearchedCaseExpression.java	                        (rev 0)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/SearchedCaseExpression.java	2009-08-07 18:38:07 UTC (rev 17252)
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.ejb.criteria.expression;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.QueryBuilder.Case;
+import org.hibernate.ejb.criteria.QueryBuilderImpl;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class SearchedCaseExpression<R> extends ExpressionImpl<R> implements Case<R> {
+	private Class<R> javaType; // overrides the javaType kept on tuple-impl so that we can adjust it
+	private List<WhenClause> whenClauses = new ArrayList<WhenClause>();
+	private Expression<? extends R> otherwiseResult;
+
+	public class WhenClause {
+		private final Expression<Boolean> condition;
+		private final Expression<? extends R> result;
+
+		public WhenClause(Expression<Boolean> condition, Expression<? extends R> result) {
+			this.condition = condition;
+			this.result = result;
+		}
+
+		public Expression<Boolean> getCondition() {
+			return condition;
+		}
+
+		public Expression<? extends R> getResult() {
+			return result;
+		}
+	}
+
+	public SearchedCaseExpression(
+			QueryBuilderImpl queryBuilder,
+			Class<R> javaType) {
+		super(queryBuilder, javaType);
+		this.javaType = javaType;
+	}
+
+	public Case<R> when(Expression<Boolean> condition, R result) {
+		return when( condition, buildLiteral(result) );
+	}
+
+	private LiteralExpression<R> buildLiteral(R result) {
+		final Class<R> type = result != null
+				? (Class<R>) result.getClass()
+				: (Class<R>) getJavaType();
+		return new LiteralExpression<R>( queryBuilder(), type, result );
+	}
+
+	public Case<R> when(Expression<Boolean> condition, Expression<? extends R> result) {
+		WhenClause whenClause = new WhenClause( condition, result );
+		whenClauses.add( whenClause );
+		adjustJavaType( result );
+		return this;
+	}
+
+	private void adjustJavaType(Expression<? extends R> exp) {
+		if ( javaType == null ) {
+			javaType = (Class<R>) exp.getJavaType();
+		}
+	}
+
+	public Expression<R> otherwise(R result) {
+		return otherwise( buildLiteral(result) );
+	}
+
+	public Expression<R> otherwise(Expression<? extends R> result) {
+		this.otherwiseResult = result;
+		adjustJavaType( result );
+		return this;
+	}
+
+	public Expression<? extends R> getOtherwiseResult() {
+		return otherwiseResult;
+	}
+
+	public List<WhenClause> getWhenClauses() {
+		return whenClauses;
+	}
+
+
+}

Added: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/SimpleCaseExpression.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/SimpleCaseExpression.java	                        (rev 0)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/SimpleCaseExpression.java	2009-08-07 18:38:07 UTC (rev 17252)
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.ejb.criteria.expression;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.QueryBuilder.SimpleCase;
+import org.hibernate.ejb.criteria.QueryBuilderImpl;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class SimpleCaseExpression<C,R> extends ExpressionImpl<R> implements SimpleCase<C,R> {
+	private Class<R> javaType;
+	private final Expression<? extends C> expression;
+	private List<WhenClause> whenClauses = new ArrayList<WhenClause>();
+	private Expression<? extends R> otherwiseResult;
+
+	public class WhenClause {
+		private final C condition;
+		private final Expression<? extends R> result;
+
+		public WhenClause(C condition, Expression<? extends R> result) {
+			this.condition = condition;
+			this.result = result;
+		}
+
+		public C getCondition() {
+			return condition;
+		}
+
+		public Expression<? extends R> getResult() {
+			return result;
+		}
+
+	}
+
+	public SimpleCaseExpression(
+			QueryBuilderImpl queryBuilder,
+			Class<R> javaType,
+			Expression<? extends C> expression) {
+		super(queryBuilder, javaType);
+		this.javaType = javaType;
+		this.expression = expression;
+	}
+
+	public Expression<C> getExpression() {
+		return (Expression<C>) expression;
+	}
+
+	public SimpleCase<C, R> when(C condition, R result) {
+		return when( condition, buildLiteral(result) );
+	}
+
+	private LiteralExpression<R> buildLiteral(R result) {
+		final Class<R> type = result != null
+				? (Class<R>) result.getClass()
+				: (Class<R>) getJavaType();
+		return new LiteralExpression<R>( queryBuilder(), type, result );
+	}
+
+	public SimpleCase<C, R> when(C condition, Expression<? extends R> result) {
+		WhenClause whenClause = new WhenClause( condition, result );
+		whenClauses.add( whenClause );
+		adjustJavaType( result );
+		return this;
+	}
+
+	private void adjustJavaType(Expression<? extends R> exp) {
+		if ( javaType == null ) {
+			javaType = (Class<R>) exp.getJavaType();
+		}
+	}
+
+	public Expression<R> otherwise(R result) {
+		return otherwise( buildLiteral(result) );
+	}
+
+	public Expression<R> otherwise(Expression<? extends R> result) {
+		this.otherwiseResult = result;
+		adjustJavaType( result );
+		return this;
+	}
+
+	public Expression<? extends R> getOtherwiseResult() {
+		return otherwiseResult;
+	}
+
+	public List<WhenClause> getWhenClauses() {
+		return whenClauses;
+	}
+}

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/AbstractSimplePredicate.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/AbstractSimplePredicate.java	2009-08-07 12:12:20 UTC (rev 17251)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/AbstractSimplePredicate.java	2009-08-07 18:38:07 UTC (rev 17252)
@@ -43,7 +43,7 @@
 		return BooleanOperator.AND;
 	}
 
-	public List<Expression<Boolean>> getExpressions() {
+	public final List<Expression<Boolean>> getExpressions() {
 		return NO_EXPRESSIONS;
 	}
 

Added: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/ExistsPredicate.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/ExistsPredicate.java	                        (rev 0)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/ExistsPredicate.java	2009-08-07 18:38:07 UTC (rev 17252)
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.ejb.criteria.predicate;
+
+import javax.persistence.criteria.Subquery;
+import org.hibernate.ejb.criteria.QueryBuilderImpl;
+
+/**
+ * Models an <tt>EXISTS(<subquery>)</tt> predicate
+ *
+ * @author Steve Ebersole
+ */
+public class ExistsPredicate extends AbstractSimplePredicate {
+	private final Subquery<?> subquery;
+
+	public ExistsPredicate(QueryBuilderImpl queryBuilder, Subquery<?> subquery) {
+		super(queryBuilder);
+		this.subquery = subquery;
+	}
+
+	public Subquery<?> getSubquery() {
+		return subquery;
+	}
+
+}



More information about the hibernate-commits mailing list