You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2008/01/06 22:27:00 UTC
svn commit: r609407 - in /cayenne/main/trunk:
framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/
itests/jpa-chapter2/src/test/java/org/apache/cayenne/jpa/itest/ch2/
Author: aadamchik
Date: Sun Jan 6 13:26:59 2008
New Revision: 609407
URL: http://svn.apache.org/viewvc?rev=609407&view=rev
Log:
CAY-954 EJBQL Query: Support for single table inheritance
(this is an under-the-radar addition of support for non-property discriminator columns motivated by JPA requirements. At some point we'll should add a similar thing to Cayenne classic)
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptor.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java
cayenne/main/trunk/itests/jpa-chapter2/src/test/java/org/apache/cayenne/jpa/itest/ch2/_2_1_10_1_SingleTablePerClassTest.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptor.java?rev=609407&r1=609406&r2=609407&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptor.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptor.java Sun Jan 6 13:26:59 2008
@@ -54,10 +54,12 @@
protected ObjEntity entity;
- protected Collection<DbAttribute> declaredDiscriminatorColumns;
protected Collection<Property> declaredIdProperties;
protected Collection<ArcProperty> declaredMapArcProperties;
+ // inheritance information
+ protected Collection<DbAttribute> allDiscriminatorColumns;
+
/**
* Creates a PersistentDescriptor.
*/
@@ -66,12 +68,13 @@
this.subclassDescriptors = new HashMap<String, ClassDescriptor>();
}
- public void addDiscriminatorColumn(DbAttribute column) {
- if (declaredDiscriminatorColumns == null) {
- declaredDiscriminatorColumns = new ArrayList<DbAttribute>();
+ public void setDiscriminatorColumns(Collection<DbAttribute> columns) {
+ if (columns == null || columns.isEmpty()) {
+ allDiscriminatorColumns = null;
+ }
+ else {
+ allDiscriminatorColumns = new ArrayList<DbAttribute>(columns);
}
-
- declaredDiscriminatorColumns.add(column);
}
/**
@@ -199,20 +202,9 @@
}
public Iterator<DbAttribute> getDiscriminatorColumns() {
- Iterator<DbAttribute> it = null;
-
- if (getSuperclassDescriptor() != null) {
- it = getSuperclassDescriptor().getDiscriminatorColumns();
- }
-
- if (declaredDiscriminatorColumns != null) {
- it = (it != null)
- ? IteratorUtils.chainedIterator(it, declaredDiscriminatorColumns
- .iterator())
- : declaredDiscriminatorColumns.iterator();
- }
-
- return it != null ? it : IteratorUtils.EMPTY_ITERATOR;
+ return allDiscriminatorColumns != null
+ ? allDiscriminatorColumns.iterator()
+ : IteratorUtils.EMPTY_ITERATOR;
}
public Iterator<Property> getIdProperties() {
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java?rev=609407&r1=609406&r2=609407&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java Sun Jan 6 13:26:59 2008
@@ -18,8 +18,15 @@
****************************************************************/
package org.apache.cayenne.reflect;
+import java.util.HashSet;
+import java.util.Set;
+
import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.exp.TraversalHelper;
import org.apache.cayenne.map.Attribute;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.EmbeddedAttribute;
import org.apache.cayenne.map.EntityInheritanceTree;
import org.apache.cayenne.map.ObjAttribute;
@@ -118,6 +125,7 @@
.getResolver()
.lookupInheritanceTree(descriptor.getEntity());
indexSubclassDescriptors(descriptor, inheritanceTree);
+ indexQualifiers(descriptor, inheritanceTree);
return descriptor;
}
@@ -204,6 +212,47 @@
indexSubclassDescriptors(descriptor, child);
}
+ }
+ }
+
+ protected void indexQualifiers(
+ PersistentDescriptor descriptor,
+ EntityInheritanceTree inheritanceTree) {
+
+ Expression qualifier;
+
+ if (inheritanceTree != null) {
+
+ qualifier = inheritanceTree.qualifierForEntityAndSubclasses();
+
+ for (EntityInheritanceTree child : inheritanceTree.getChildren()) {
+ indexQualifiers(descriptor, child);
+ }
+ }
+ else {
+ qualifier = descriptor.getEntity().getDeclaredQualifier();
+ }
+
+ if (qualifier != null) {
+
+ final Set<DbAttribute> attributes = new HashSet<DbAttribute>();
+ final DbEntity dbEntity = descriptor.getEntity().getDbEntity();
+
+ qualifier.traverse(new TraversalHelper() {
+
+ @Override
+ public void startNode(Expression node, Expression parentNode) {
+ if (node.getType() == Expression.DB_PATH) {
+ String path = node.getOperand(0).toString();
+ DbAttribute attribute = (DbAttribute) dbEntity.getAttribute(path);
+ if (attribute != null) {
+ attributes.add(attribute);
+ }
+ }
+ }
+ });
+
+ descriptor.setDiscriminatorColumns(attributes);
}
}
Modified: cayenne/main/trunk/itests/jpa-chapter2/src/test/java/org/apache/cayenne/jpa/itest/ch2/_2_1_10_1_SingleTablePerClassTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/itests/jpa-chapter2/src/test/java/org/apache/cayenne/jpa/itest/ch2/_2_1_10_1_SingleTablePerClassTest.java?rev=609407&r1=609406&r2=609407&view=diff
==============================================================================
--- cayenne/main/trunk/itests/jpa-chapter2/src/test/java/org/apache/cayenne/jpa/itest/ch2/_2_1_10_1_SingleTablePerClassTest.java (original)
+++ cayenne/main/trunk/itests/jpa-chapter2/src/test/java/org/apache/cayenne/jpa/itest/ch2/_2_1_10_1_SingleTablePerClassTest.java Sun Jan 6 13:26:59 2008
@@ -18,8 +18,15 @@
****************************************************************/
package org.apache.cayenne.jpa.itest.ch2;
+import java.util.List;
+
+import javax.persistence.Query;
+
import org.apache.cayenne.itest.ItestTableUtils;
import org.apache.cayenne.itest.jpa.EntityManagerCase;
+import org.apache.cayenne.jpa.itest.ch2.entity.SingleTableInheritanceSub1;
+import org.apache.cayenne.jpa.itest.ch2.entity.SingleTableInheritanceSub2;
+import org.apache.cayenne.jpa.itest.ch2.entity.SingleTableInheritanceSuper1;
public class _2_1_10_1_SingleTablePerClassTest extends EntityManagerCase {
@@ -32,27 +39,27 @@
helper.insert(3, "B", "3", "BX", null);
helper.insert(4, "C", "4", null, "CX");
-// Query query = getEntityManager().createQuery(
-// "select a FROM SingleTableInheritanceSuper1 a ORDER BY a.propertyA");
-// List<?> results = query.getResultList();
-// assertEquals(4, results.size());
-//
-// assertEquals(SingleTableInheritanceSuper1.class.getName(), results
-// .get(0)
-// .getClass()
-// .getName());
-// assertEquals(SingleTableInheritanceSuper1.class.getName(), results
-// .get(1)
-// .getClass()
-// .getName());
-// assertEquals(SingleTableInheritanceSub1.class.getName(), results
-// .get(2)
-// .getClass()
-// .getName());
-// assertEquals(SingleTableInheritanceSub2.class.getName(), results
-// .get(3)
-// .getClass()
-// .getName());
+ Query query = getEntityManager().createQuery(
+ "select a FROM SingleTableInheritanceSuper1 a ORDER BY a.propertyA");
+ List<?> results = query.getResultList();
+ assertEquals(4, results.size());
+
+ assertEquals(SingleTableInheritanceSuper1.class.getName(), results
+ .get(0)
+ .getClass()
+ .getName());
+ assertEquals(SingleTableInheritanceSuper1.class.getName(), results
+ .get(1)
+ .getClass()
+ .getName());
+ assertEquals(SingleTableInheritanceSub1.class.getName(), results
+ .get(2)
+ .getClass()
+ .getName());
+ assertEquals(SingleTableInheritanceSub2.class.getName(), results
+ .get(3)
+ .getClass()
+ .getName());
}
public void testSelectSub() throws Exception {
@@ -64,14 +71,14 @@
helper.insert(3, "B", "3", "BX", null);
helper.insert(4, "C", "4", null, "CX");
-// Query query = getEntityManager().createQuery(
-// "select a FROM SingleTableInheritanceSub1 a ORDER BY a.propertyA");
-// List<?> results = query.getResultList();
-// assertEquals(1, results.size());
-//
-// assertEquals(SingleTableInheritanceSub1.class.getName(), results
-// .get(0)
-// .getClass()
-// .getName());
+ Query query = getEntityManager().createQuery(
+ "select a FROM SingleTableInheritanceSub1 a ORDER BY a.propertyA");
+ List<?> results = query.getResultList();
+ assertEquals(1, results.size());
+
+ assertEquals(SingleTableInheritanceSub1.class.getName(), results
+ .get(0)
+ .getClass()
+ .getName());
}
}