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());
     }
 }