Author: steve.ebersole(a)jboss.com
Date: 2009-08-04 15:13:33 -0400 (Tue, 04 Aug 2009)
New Revision: 17228
Added:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/JoinImplementors.java
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/AbstractBasicPluralJoin.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicCollectionJoinImpl.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicListJoinImpl.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicMapJoinImpl.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicSetJoinImpl.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CollectionJoinImpl.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/FromImpl.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/JoinImpl.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/ListJoinImpl.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/MapJoinImpl.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/SetJoinImpl.java
Log:
EJB-447 : Implement JPA 2.0 criteria apis
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/AbstractBasicPluralJoin.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/AbstractBasicPluralJoin.java 2009-08-04
18:01:45 UTC (rev 17227)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/AbstractBasicPluralJoin.java 2009-08-04
19:13:33 UTC (rev 17228)
@@ -23,6 +23,7 @@
import javax.persistence.criteria.CollectionJoin;
import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.Fetch;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.ListJoin;
@@ -42,7 +43,9 @@
*
* @author Steve Ebersole
*/
-public abstract class AbstractBasicPluralJoin<O,C,E> extends JoinImpl<O,E>
implements PluralJoin<O,C,E> {
+public abstract class AbstractBasicPluralJoin<O,C,E>
+ extends JoinImpl<O,E>
+ implements PluralJoin<O,C,E>, Fetch<O,E> {
public AbstractBasicPluralJoin(
QueryBuilderImpl queryBuilder,
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicCollectionJoinImpl.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicCollectionJoinImpl.java 2009-08-04
18:01:45 UTC (rev 17227)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicCollectionJoinImpl.java 2009-08-04
19:13:33 UTC (rev 17228)
@@ -21,7 +21,6 @@
*/
package org.hibernate.ejb.criteria;
-import javax.persistence.criteria.CollectionJoin;
import javax.persistence.criteria.JoinType;
import javax.persistence.metamodel.CollectionAttribute;
@@ -33,7 +32,7 @@
*/
public class BasicCollectionJoinImpl<O,E>
extends AbstractBasicPluralJoin<O,java.util.Collection<E>,E>
- implements CollectionJoin<O,E> {
+ implements JoinImplementors.CollectionJoinImplementor<O,E> {
public BasicCollectionJoinImpl(
QueryBuilderImpl queryBuilder,
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicListJoinImpl.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicListJoinImpl.java 2009-08-04
18:01:45 UTC (rev 17227)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicListJoinImpl.java 2009-08-04
19:13:33 UTC (rev 17228)
@@ -23,7 +23,6 @@
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.JoinType;
-import javax.persistence.criteria.ListJoin;
import javax.persistence.metamodel.ListAttribute;
import org.hibernate.ejb.criteria.expression.ListIndexExpression;
@@ -35,7 +34,7 @@
*/
public class BasicListJoinImpl<O,E>
extends AbstractBasicPluralJoin<O,java.util.List<E>,E>
- implements ListJoin<O,E> {
+ implements JoinImplementors.ListJoinImplementor<O,E> {
public BasicListJoinImpl(
QueryBuilderImpl queryBuilder,
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicMapJoinImpl.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicMapJoinImpl.java 2009-08-04
18:01:45 UTC (rev 17227)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicMapJoinImpl.java 2009-08-04
19:13:33 UTC (rev 17228)
@@ -26,7 +26,6 @@
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
-import javax.persistence.criteria.MapJoin;
import javax.persistence.criteria.Path;
import javax.persistence.metamodel.MapAttribute;
import javax.persistence.metamodel.Type.PersistenceType;
@@ -43,7 +42,7 @@
*/
public class BasicMapJoinImpl<O,K,V>
extends AbstractBasicPluralJoin<O,java.util.Map<K,V>,V>
- implements MapJoin<O,K,V> {
+ implements JoinImplementors.MapJoinImplementor<O,K,V> {
public BasicMapJoinImpl(
QueryBuilderImpl queryBuilder,
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicSetJoinImpl.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicSetJoinImpl.java 2009-08-04
18:01:45 UTC (rev 17227)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/BasicSetJoinImpl.java 2009-08-04
19:13:33 UTC (rev 17228)
@@ -22,7 +22,6 @@
package org.hibernate.ejb.criteria;
import javax.persistence.criteria.JoinType;
-import javax.persistence.criteria.SetJoin;
import javax.persistence.metamodel.SetAttribute;
/**
@@ -33,7 +32,7 @@
*/
public class BasicSetJoinImpl<O,E>
extends AbstractBasicPluralJoin<O,java.util.Set<E>,E>
- implements SetJoin<O,E> {
+ implements JoinImplementors.SetJoinImplementor<O,E> {
public BasicSetJoinImpl(
QueryBuilderImpl queryBuilder,
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CollectionJoinImpl.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CollectionJoinImpl.java 2009-08-04
18:01:45 UTC (rev 17227)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CollectionJoinImpl.java 2009-08-04
19:13:33 UTC (rev 17228)
@@ -21,7 +21,6 @@
*/
package org.hibernate.ejb.criteria;
-import javax.persistence.criteria.CollectionJoin;
import javax.persistence.criteria.JoinType;
import javax.persistence.metamodel.CollectionAttribute;
@@ -31,7 +30,9 @@
*
* @author Steve Ebersole
*/
-public class CollectionJoinImpl<O,E> extends JoinImpl<O,E> implements
CollectionJoin<O,E> {
+public class CollectionJoinImpl<O,E>
+ extends JoinImpl<O,E>
+ implements JoinImplementors.CollectionJoinImplementor<O,E> {
public CollectionJoinImpl(
QueryBuilderImpl queryBuilder,
Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/FromImpl.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/FromImpl.java 2009-08-04
18:01:45 UTC (rev 17227)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/FromImpl.java 2009-08-04
19:13:33 UTC (rev 17228)
@@ -124,10 +124,6 @@
return joins;
}
- protected void addJoin(Join<X,?> join) {
- getJoinsInternal().add( join );
- }
-
/**
* {@inheritDoc}
*/
@@ -139,6 +135,12 @@
* {@inheritDoc}
*/
public <Y> Join<X, Y> join(SingularAttribute<? super X, Y> attribute,
JoinType jt) {
+ Join<X, Y> join = constructJoin( attribute, jt );
+ getJoinsInternal().add( join );
+ return join;
+ }
+
+ private <Y> JoinImplementors.JoinImplementor<X, Y>
constructJoin(SingularAttribute<? super X, Y> attribute, JoinType jt) {
if ( PersistenceType.BASIC.equals( attribute.getType().getPersistenceType() ) ) {
throw new BasicPathUsageException( "Cannot join to attribute of basic type",
attribute );
}
@@ -150,17 +152,14 @@
}
final Class<Y> attributeType = attribute.getBindableJavaType();
- final JoinImpl<X, Y> join = new JoinImpl<X, Y>(
+ return new JoinImpl<X, Y>(
queryBuilder(),
attributeType,
this,
attribute,
jt
);
- joins.add( join );
- return join;
}
-
/**
* {@inheritDoc}
*/
@@ -172,12 +171,18 @@
* {@inheritDoc}
*/
public <Y> CollectionJoin<X, Y> join(CollectionAttribute<? super X, Y>
collection, JoinType jt) {
+ final CollectionJoin<X, Y> join = constructJoin( collection, jt );
+ getJoinsInternal().add( join );
+ return join;
+ }
+
+ private <Y> JoinImplementors.CollectionJoinImplementor<X, Y>
constructJoin(CollectionAttribute<? super X, Y> collection, JoinType jt) {
if ( jt.equals( JoinType.RIGHT ) ) {
throw new UnsupportedOperationException( "RIGHT JOIN not supported" );
}
final Class<Y> attributeType = collection.getBindableJavaType();
- final CollectionJoin<X, Y> join;
+ final JoinImplementors.CollectionJoinImplementor<X, Y> join;
if ( isBasicCollection( collection ) ) {
join = new BasicCollectionJoinImpl<X, Y>(
queryBuilder(),
@@ -196,7 +201,6 @@
jt
);
}
- joins.add( join );
return join;
}
@@ -215,19 +219,24 @@
* {@inheritDoc}
*/
public <Y> SetJoin<X, Y> join(SetAttribute<? super X, Y> set, JoinType
jt) {
+ final SetJoin<X, Y> join = constructJoin( set, jt );
+ getJoinsInternal().add( join );
+ return join;
+ }
+
+ private <Y> JoinImplementors.SetJoinImplementor<X, Y>
constructJoin(SetAttribute<? super X, Y> set, JoinType jt) {
if ( jt.equals( JoinType.RIGHT ) ) {
throw new UnsupportedOperationException( "RIGHT JOIN not supported" );
}
final Class<Y> attributeType = set.getBindableJavaType();
- final SetJoin<X, Y> join;
+ final JoinImplementors.SetJoinImplementor<X, Y> join;
if ( isBasicCollection( set ) ) {
join = new BasicSetJoinImpl<X, Y>( queryBuilder(), attributeType, this, set, jt
);
}
else {
join = new SetJoinImpl<X, Y>( queryBuilder(), attributeType, this, set, jt );
}
- joins.add( join );
return join;
}
@@ -242,19 +251,24 @@
* {@inheritDoc}
*/
public <Y> ListJoin<X, Y> join(ListAttribute<? super X, Y> list,
JoinType jt) {
+ final ListJoin<X, Y> join = constructJoin( list, jt );
+ getJoinsInternal().add( join );
+ return join;
+ }
+
+ private <Y> JoinImplementors.ListJoinImplementor<X, Y>
constructJoin(ListAttribute<? super X, Y> list, JoinType jt) {
if ( jt.equals( JoinType.RIGHT ) ) {
throw new UnsupportedOperationException( "RIGHT JOIN not supported" );
}
final Class<Y> attributeType = list.getBindableJavaType();
- final ListJoin<X, Y> join;
+ final JoinImplementors.ListJoinImplementor<X, Y> join;
if ( isBasicCollection( list ) ) {
join = new BasicListJoinImpl<X, Y>( queryBuilder(), attributeType, this, list,
jt );
}
else {
join = new ListJoinImpl<X, Y>( queryBuilder(), attributeType, this, list, jt );
}
- joins.add( join );
return join;
}
@@ -269,19 +283,24 @@
* {@inheritDoc}
*/
public <K, V> MapJoin<X, K, V> join(MapAttribute<? super X, K, V> map,
JoinType jt) {
+ final MapJoin<X, K, V> join = constructJoin( map, jt );
+ getJoinsInternal().add( join );
+ return join;
+ }
+
+ private <K, V> JoinImplementors.MapJoinImplementor<X, K, V>
constructJoin(MapAttribute<? super X, K, V> map, JoinType jt) {
if ( jt.equals( JoinType.RIGHT ) ) {
throw new UnsupportedOperationException( "RIGHT JOIN not supported" );
}
final Class<V> attributeType = map.getBindableJavaType();
- final MapJoin<X, K, V> join;
+ final JoinImplementors.MapJoinImplementor<X, K, V> join;
if ( isBasicCollection( map ) ) {
join = new BasicMapJoinImpl<X,K,V>( queryBuilder(), attributeType, this, map, jt
);
}
else {
join = new MapJoinImpl<X,K,V>( queryBuilder(), attributeType, this, map, jt );
}
- joins.add( join );
return join;
}
@@ -444,9 +463,10 @@
return fetch( singularAttribute, DEFAULT_JOIN_TYPE );
}
- public <Y> Fetch<X, Y> fetch(SingularAttribute<? super X, Y>
singularAttribute, JoinType jt) {
- // TODO : implement
- throw new UnsupportedOperationException( "Not yet implemented!" );
+ public <Y> Fetch<X, Y> fetch(SingularAttribute<? super X, Y>
attribute, JoinType jt) {
+ Fetch<X, Y> fetch = constructJoin( attribute, jt );
+ getFetchesInternal().add( fetch );
+ return fetch;
}
public <Y> Fetch<X, Y> fetch(PluralAttribute<? super X, ?, Y>
pluralAttribute) {
@@ -454,8 +474,22 @@
}
public <Y> Fetch<X, Y> fetch(PluralAttribute<? super X, ?, Y>
pluralAttribute, JoinType jt) {
- // TODO : implement
- throw new UnsupportedOperationException( "Not yet implemented!" );
+ final Fetch<X, Y> fetch;
+ // TODO : combine Fetch and Join hierarchies (JoinImplementor extends Join,Fetch???)
+ if ( CollectionType.COLLECTION.equals( pluralAttribute.getCollectionType() ) ) {
+ fetch = constructJoin( (CollectionAttribute<X,Y>) pluralAttribute, jt );
+ }
+ else if ( CollectionType.LIST.equals( pluralAttribute.getCollectionType() ) ) {
+ fetch = constructJoin( (ListAttribute<X,Y>) pluralAttribute, jt );
+ }
+ else if ( CollectionType.SET.equals( pluralAttribute.getCollectionType() ) ) {
+ fetch = constructJoin( (SetAttribute<X,Y>) pluralAttribute, jt );
+ }
+ else {
+ fetch = constructJoin( (MapAttribute<X,?,Y>) pluralAttribute, jt );
+ }
+ getFetchesInternal().add( fetch );
+ return fetch;
}
public <Y> Fetch<X, Y> fetch(String attributeName) {
@@ -463,8 +497,13 @@
}
public <Y> Fetch<X, Y> fetch(String attributeName, JoinType jt) {
- // TODO : implement
- throw new UnsupportedOperationException( "Not yet implemented!" );
+ Attribute<X,?> attribute = getAttribute( attributeName );
+ if ( attribute.isCollection() ) {
+ return fetch( (PluralAttribute<X,?,Y>)attribute, jt );
+ }
+ else {
+ return fetch( (SingularAttribute<X,Y>) attribute, jt );
+ }
}
Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/JoinImpl.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/JoinImpl.java 2009-08-04
18:01:45 UTC (rev 17227)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/JoinImpl.java 2009-08-04
19:13:33 UTC (rev 17228)
@@ -22,7 +22,6 @@
package org.hibernate.ejb.criteria;
import javax.persistence.criteria.From;
-import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.ManagedType;
@@ -32,7 +31,7 @@
*
* @author Steve Ebersole
*/
-public class JoinImpl<Z, X> extends FromImpl<Z, X> implements Join<Z,
X> {
+public class JoinImpl<Z, X> extends FromImpl<Z, X> implements
JoinImplementors.JoinImplementor<Z,X> {
// TODO : keep track or whether any non-identifier properties get dereferenced
// for join optimization like in HQL
Added:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/JoinImplementors.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/JoinImplementors.java
(rev 0)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/JoinImplementors.java 2009-08-04
19:13:33 UTC (rev 17228)
@@ -0,0 +1,52 @@
+/*
+ * 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;
+
+import javax.persistence.criteria.CollectionJoin;
+import javax.persistence.criteria.Fetch;
+import javax.persistence.criteria.Join;
+import javax.persistence.criteria.ListJoin;
+import javax.persistence.criteria.MapJoin;
+import javax.persistence.criteria.SetJoin;
+
+/**
+ * Consolidates the {@link Join} and {@link Fetch} hierarchies since that is how we
implement them.
+ * This allows us to treat them polymorphically.
+ *
+ * @author Steve Ebersole
+ */
+public interface JoinImplementors {
+ public static interface JoinImplementor<Z,X> extends Join<Z,X>,
Fetch<Z,X> {
+ }
+
+ public static interface CollectionJoinImplementor<Z,X> extends
CollectionJoin<Z,X>, Fetch<Z,X> {
+ }
+
+ public static interface SetJoinImplementor<Z,X> extends SetJoin<Z,X>,
Fetch<Z,X> {
+ }
+
+ public static interface ListJoinImplementor<Z,X> extends ListJoin<Z,X>,
Fetch<Z,X> {
+ }
+
+ public static interface MapJoinImplementor<Z,K,V> extends MapJoin<Z,K,V>,
Fetch<Z,V> {
+ }
+}
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/ListJoinImpl.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/ListJoinImpl.java 2009-08-04
18:01:45 UTC (rev 17227)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/ListJoinImpl.java 2009-08-04
19:13:33 UTC (rev 17228)
@@ -23,7 +23,6 @@
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.JoinType;
-import javax.persistence.criteria.ListJoin;
import javax.persistence.metamodel.ListAttribute;
import org.hibernate.ejb.criteria.expression.ListIndexExpression;
@@ -33,7 +32,7 @@
*
* @author Steve Ebersole
*/
-public class ListJoinImpl<O,E> extends JoinImpl<O,E> implements
ListJoin<O,E> {
+public class ListJoinImpl<O,E> extends JoinImpl<O,E> implements
JoinImplementors.ListJoinImplementor<O,E> {
public ListJoinImpl(
QueryBuilderImpl queryBuilder,
Class<E> javaType,
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/MapJoinImpl.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/MapJoinImpl.java 2009-08-04
18:01:45 UTC (rev 17227)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/MapJoinImpl.java 2009-08-04
19:13:33 UTC (rev 17228)
@@ -26,7 +26,6 @@
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
-import javax.persistence.criteria.MapJoin;
import javax.persistence.criteria.Path;
import javax.persistence.metamodel.MapAttribute;
import javax.persistence.metamodel.Type.PersistenceType;
@@ -39,7 +38,7 @@
*/
public class MapJoinImpl<O,K,V>
extends JoinImpl<O,V>
- implements MapJoin<O,K,V> {
+ implements JoinImplementors.MapJoinImplementor<O,K,V> {
public MapJoinImpl(
QueryBuilderImpl queryBuilder,
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/SetJoinImpl.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/SetJoinImpl.java 2009-08-04
18:01:45 UTC (rev 17227)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/SetJoinImpl.java 2009-08-04
19:13:33 UTC (rev 17228)
@@ -22,7 +22,6 @@
package org.hibernate.ejb.criteria;
import javax.persistence.criteria.JoinType;
-import javax.persistence.criteria.SetJoin;
import javax.persistence.metamodel.SetAttribute;
/**
@@ -31,7 +30,10 @@
*
* @author Steve Ebersole
*/
-public class SetJoinImpl<O,E> extends JoinImpl<O,E> implements
SetJoin<O,E> {
+public class SetJoinImpl<O,E>
+ extends JoinImpl<O,E>
+ implements JoinImplementors.SetJoinImplementor<O,E> {
+
public SetJoinImpl(
QueryBuilderImpl queryBuilder,
Class<E> javaType,