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/11/30 15:15:37 UTC
svn commit: r721817 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src:
main/java/org/apache/cayenne/ejbql/parser/
main/java/org/apache/cayenne/map/ main/java/org/apache/cayenne/reflect/
test/java/org/apache/cayenne/reflect/
Author: aadamchik
Date: Sun Nov 30 06:15:36 2008
New Revision: 721817
URL: http://svn.apache.org/viewvc?rev=721817&view=rev
Log:
CAY-1136 "Compiled" EntityResult ; Switch SelectQuery processing to use EntityResult
compiled EntityResult (untested, subclasses not included in the descriptor)
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjEntity.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/ClassDescriptor.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LazyClassDescriptorDecorator.java
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/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/MockClassDescriptor.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java?rev=721817&r1=721816&r2=721817&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java Sun Nov 30 06:15:36 2008
@@ -187,8 +187,6 @@
}
};
- // EJBQL queries are polymorphic by definition - there is no distinction between
- // inheritance/no-inheritance fetch
descriptor.visitAllProperties(visitor);
// append id columns ... (some may have been appended already via relationships)
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjEntity.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjEntity.java?rev=721817&r1=721816&r2=721817&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjEntity.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjEntity.java Sun Nov 30 06:15:36 2008
@@ -47,7 +47,6 @@
/**
* ObjEntity is a mapping descriptor for a DataObject Java class. It contains the
* information about the Java class itself, as well as its mapping to the DbEntity layer.
- *
*/
public class ObjEntity extends Entity implements ObjEntityListener {
@@ -862,11 +861,14 @@
* @since 3.0
*/
public Collection<String> getPrimaryKeyNames() {
- if (getDbEntity() == null) {
- throw new CayenneRuntimeException("No DbEntity for ObjEntity: " + getName());
+ DbEntity dbEntity = getDbEntity();
+
+ // abstract entities may have no DbEntity mapping
+ if (dbEntity == null) {
+ return Collections.emptyList();
}
- Collection<DbAttribute> pkAttributes = getDbEntity().getPrimaryKeys();
+ Collection<DbAttribute> pkAttributes = dbEntity.getPrimaryKeys();
Collection<String> names = new ArrayList<String>(pkAttributes.size());
for (DbAttribute pk : pkAttributes) {
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/ClassDescriptor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/ClassDescriptor.java?rev=721817&r1=721816&r2=721817&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/ClassDescriptor.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/ClassDescriptor.java Sun Nov 30 06:15:36 2008
@@ -26,6 +26,7 @@
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.query.EntityResult;
/**
* A runtime descriptor of an persistent class.
@@ -52,6 +53,14 @@
Collection<DbEntity> getRootDbEntities();
/**
+ * Returns the EntityResult that describes the mapping of the ResultSet when entity
+ * data is fetched.
+ *
+ * @since 3.0
+ */
+ EntityResult getEntityResult();
+
+ /**
* Returns a class mapped by this descriptor.
*/
Class<?> getObjectClass();
@@ -151,7 +160,7 @@
/**
* Passes the visitor to the properties "visit" method for all properties declared in
- * this descriptor and all its subdescriptors. Properties that are overridden in
+ * this descriptor and all its super-decsriptors. Properties that are overridden in
* subdescriptors will include overridden information. Walkthrough is terminated in
* case one of the properties returns false. Returns true if all visited properties
* returned true, false - if one property returned false.
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LazyClassDescriptorDecorator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LazyClassDescriptorDecorator.java?rev=721817&r1=721816&r2=721817&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LazyClassDescriptorDecorator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LazyClassDescriptorDecorator.java Sun Nov 30 06:15:36 2008
@@ -25,6 +25,7 @@
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.query.EntityResult;
/**
* A ClassDescriptor wrapper that compiles decorated descriptor lazily on first access.
@@ -82,6 +83,11 @@
return descriptor.getRootDbEntities();
}
+ public EntityResult getEntityResult() {
+ checkDescriptorInitialized();
+ return descriptor.getEntityResult();
+ }
+
public Class<?> getObjectClass() {
// note that we can resolve Object class without triggering descriptor resolution.
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=721817&r1=721816&r2=721817&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 Nov 30 06:15:36 2008
@@ -33,6 +33,7 @@
import org.apache.cayenne.map.ObjAttribute;
import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.query.EntityResult;
import org.apache.commons.collections.IteratorUtils;
/**
@@ -57,6 +58,7 @@
protected ObjEntity entity;
protected Collection<DbEntity> rootDbEntities;
+ protected EntityResult entityResult;
// combines declared and super properties
protected Collection<Property> idProperties;
@@ -173,12 +175,17 @@
return entity;
}
- /**
- * @since 3.0
- */
public Collection<DbEntity> getRootDbEntities() {
return rootDbEntities;
}
+
+ public EntityResult getEntityResult() {
+ return entityResult;
+ }
+
+ public void setEntityResult(EntityResult entityResult) {
+ this.entityResult = entityResult;
+ }
public boolean isFault(Object object) {
if (superclassDescriptor != null) {
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=721817&r1=721816&r2=721817&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 Nov 30 06:15:36 2008
@@ -19,6 +19,7 @@
package org.apache.cayenne.reflect;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.Set;
import org.apache.cayenne.CayenneRuntimeException;
@@ -27,12 +28,15 @@
import org.apache.cayenne.map.Attribute;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbJoin;
+import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.map.EmbeddedAttribute;
import org.apache.cayenne.map.EntityInheritanceTree;
import org.apache.cayenne.map.ObjAttribute;
import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.map.ObjRelationship;
import org.apache.cayenne.map.Relationship;
+import org.apache.cayenne.query.EntityResult;
/**
* A convenience superclass for {@link ClassDescriptorFactory} implementors.
@@ -130,6 +134,7 @@
indexRootDbEntities(descriptor, inheritanceTree);
indexSuperclassProperties(descriptor);
+ indexEntityResult(descriptor);
return descriptor;
}
@@ -313,6 +318,70 @@
}
}
+ protected void indexEntityResult(PersistentDescriptor descriptor) {
+
+ if (descriptor.getRootDbEntities().isEmpty()) {
+ // client descriptor?
+ return;
+ }
+
+ final EntityResult entityResult = new EntityResult(descriptor.getObjectClass());
+ final Set<String> visited = new HashSet<String>();
+
+ PropertyVisitor visitor = new PropertyVisitor() {
+
+ public boolean visitAttribute(AttributeProperty property) {
+ ObjAttribute oa = property.getAttribute();
+ if (visited.add(oa.getDbAttributePath())) {
+ entityResult.addObjectField(
+ oa.getEntity().getName(),
+ oa.getName(),
+ oa.getDbAttributePath());
+ }
+ return true;
+ }
+
+ public boolean visitToMany(ToManyProperty property) {
+ return true;
+ }
+
+ public boolean visitToOne(ToOneProperty property) {
+ ObjRelationship rel = property.getRelationship();
+ DbRelationship dbRel = rel.getDbRelationships().get(0);
+
+ for (DbJoin join : dbRel.getJoins()) {
+ DbAttribute src = join.getSource();
+ if (src.isForeignKey() && visited.add(src.getName())) {
+ entityResult.addDbField(src.getName(), src.getName());
+ }
+ }
+
+ return true;
+ }
+ };
+
+ descriptor.visitProperties(visitor);
+
+ // append id columns ... (some may have been appended already via relationships)
+ for (String pkName : descriptor.getEntity().getPrimaryKeyNames()) {
+ if (visited.add(pkName)) {
+ entityResult.addDbField(pkName, pkName);
+ }
+ }
+
+ // append inheritance discriminator columns...
+ Iterator<DbAttribute> discriminatorColumns = descriptor.getDiscriminatorColumns();
+ while (discriminatorColumns.hasNext()) {
+ DbAttribute column = discriminatorColumns.next();
+
+ if (visited.add(column.getName())) {
+ entityResult.addDbField(column.getName(), column.getName());
+ }
+ }
+
+ descriptor.setEntityResult(entityResult);
+ }
+
/**
* Creates an accessor for the property.
*/
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/MockClassDescriptor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/MockClassDescriptor.java?rev=721817&r1=721816&r2=721817&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/MockClassDescriptor.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/MockClassDescriptor.java Sun Nov 30 06:15:36 2008
@@ -27,6 +27,7 @@
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.query.EntityResult;
public class MockClassDescriptor implements ClassDescriptor {
@@ -38,6 +39,10 @@
return null;
}
+ public EntityResult getEntityResult() {
+ return null;
+ }
+
/**
* @since 3.0
*/