Index: org/exolab/castor/jdo/engine/SQLEngine.java =================================================================== RCS file: /scm/castor/castor/src/main/org/exolab/castor/jdo/engine/SQLEngine.java,v retrieving revision 1.26 diff -u -r1.26 SQLEngine.java --- org/exolab/castor/jdo/engine/SQLEngine.java 29 Oct 2004 14:40:05 -0000 1.26 +++ org/exolab/castor/jdo/engine/SQLEngine.java 19 Feb 2005 16:00:47 -0000 @@ -116,7 +116,7 @@ private ColumnInfo[] _ids; private SQLEngine _extends; - + private QueryExpression _sqlFinder; private PersistenceFactory _factory; @@ -1373,6 +1373,54 @@ baseDesc.getTableName(), baseDesc.getIdentityColumnNames()); curDesc = baseDesc; } + + curDesc = clsDesc; + List classDescriptorsToAdd = new LinkedList(); + JDOClassDescriptor classDescriptor = null; + addExtendingClassDescriptors(classDescriptorsToAdd, curDesc.getExtendedBy()); + + if (classDescriptorsToAdd.size() > 0) { + for (Iterator iter = classDescriptorsToAdd.iterator(); iter.hasNext(); ) { + classDescriptor = (JDOClassDescriptor) iter.next(); + _log.debug ("Adding outer left join for " + classDescriptor.getJavaClass().getName() + + " on table " + classDescriptor.getTableName()); + expr.addOuterJoin( _mapTo, + curDesc.getIdentityColumnNames(), + classDescriptor.getTableName(), + classDescriptor.getIdentityColumnNames()); + find.addOuterJoin( _mapTo, + curDesc.getIdentityColumnNames(), + classDescriptor.getTableName(), + classDescriptor.getIdentityColumnNames()); + +// String[] identityColumnNames = classDescriptor.getIdentityColumnNames(); +// for (int i = 0; i < identityColumnNames.length; i++) { +// expr.addColumn (classDescriptor.getTableName(), identityColumnNames[i]); +// find.addColumn (classDescriptor.getTableName(), identityColumnNames[i]); +// } + +// Persistence persistenceEngine; +// try { +// persistenceEngine = _factory.getPersistence (classDescriptor); +// } catch (MappingException e) { +// throw new QueryException ("Problem obtaining persistence engine for ClassDescriptor " + classDescriptor.getJavaClass().getName(), e); +// } +// +// SQLEngine.FieldInfo[] fieldInfos = (SQLEngine.FieldInfo[]) persistenceEngine.getInfo(); +// for (int i = 0; i < fieldInfos.length; i++) { +// SQLEngine.ColumnInfo[] columnInfos = fieldInfos[i].columns; +// for ( int j = 0; j < columnInfos.length; j++ ) { +// expr.addColumn (classDescriptor.getTableName(), fieldInfos[i].columns[j].name); +// find.addColumn (classDescriptor.getTableName(), fieldInfos[i].columns[j].name); +// } +// expr.addTable(classDescriptor.getTableName()); +// find.addTable(classDescriptor.getTableName()); +// } + } + } + + // TODO [WG]: add code to add left outer joins + for ( int i=0; i<_ids.length; i++ ) { find.addColumn( _mapTo, idnames[i] ); } @@ -1417,6 +1465,16 @@ _log.debug( Messages.format( "jdo.loading", _type, _sqlLoad ) ); } + } + + private void addExtendingClassDescriptors (Collection classDescriptorsToAdd, Collection extendingClassDescriptors) { + JDOClassDescriptor classDescriptor = null; + for (Iterator iter = extendingClassDescriptors.iterator(); iter.hasNext(); ) { + classDescriptor = (JDOClassDescriptor) iter.next(); + classDescriptorsToAdd.add (classDescriptor); + addExtendingClassDescriptors(classDescriptorsToAdd, classDescriptor.getExtendedBy()); + } + } Index: org/exolab/castor/mapping/ClassDescriptor.java =================================================================== RCS file: /scm/castor/castor/src/main/org/exolab/castor/mapping/ClassDescriptor.java,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 ClassDescriptor.java --- org/exolab/castor/mapping/ClassDescriptor.java 3 Mar 2003 07:08:26 -0000 1.1.1.1 +++ org/exolab/castor/mapping/ClassDescriptor.java 19 Feb 2005 16:00:47 -0000 @@ -46,6 +46,8 @@ package org.exolab.castor.mapping; +import java.util.Collection; + /** * Describes the properties of a class and its fields. Implementations @@ -65,7 +67,6 @@ * @return The Java class */ public Class getJavaClass(); - /** * Returns a list of fields represented by this descriptor. Index: org/exolab/castor/mapping/loader/ClassDescriptorImpl.java =================================================================== RCS file: /scm/castor/castor/src/main/org/exolab/castor/mapping/loader/ClassDescriptorImpl.java,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 ClassDescriptorImpl.java --- org/exolab/castor/mapping/loader/ClassDescriptorImpl.java 3 Mar 2003 07:08:29 -0000 1.1.1.1 +++ org/exolab/castor/mapping/loader/ClassDescriptorImpl.java 19 Feb 2005 16:00:48 -0000 @@ -47,6 +47,12 @@ package org.exolab.castor.mapping.loader; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedList; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.exolab.castor.mapping.ValidityException; import org.exolab.castor.mapping.ClassDescriptor; import org.exolab.castor.mapping.FieldDescriptor; @@ -67,7 +73,7 @@ public class ClassDescriptorImpl implements ClassDescriptor { - + private static final Log _log = LogFactory.getLog (ClassDescriptorImpl.class); private ClassMapping _map; /** @@ -86,6 +92,12 @@ * or null if this is a top-level class. */ private final ClassDescriptor _extends; + + /** + * A collection of class descriptors that extend this class, or + * an empty collection if this is a leaf class. + */ + private final Collection _extendedBy = new LinkedList(); private final ClassDescriptor _depends; @@ -167,6 +179,13 @@ throw new MappingException( "mapping.classDoesNotExtend", _javaClass.getName(), extend.getJavaClass().getName() ); _extends = extend; + + _log.debug (_extends.getClass().getName()); + if ( _extends.getClass().getName().equals("org.exolab.castor.jdo.engine.JDOClassDescriptor") && + this.getClass().getName().equals ("org.exolab.castor.jdo.engine.JDOClassDescriptor")) { + ((ClassDescriptorImpl) _extends).addExtendedBy (this); + } + if ( _extends instanceof ClassDescriptorImpl ) _identities = ( identities == null ? ((ClassDescriptorImpl)_extends).getIdentities() : identities ); else @@ -233,6 +252,21 @@ public ClassDescriptor getExtends() { return _extends; + } + + /** + * Returns a collection of class descriptors that extend this class descriptor. + * @return A collection of class descriptors. + */ + public Collection getExtendedBy() + { + return _extendedBy; + } + + public void addExtendedBy (ClassDescriptor classDesc) + { + _log.debug ("Adding ClassDescriptor of type " + classDesc.getClass().getName()); + _extendedBy.add (classDesc); } public ClassDescriptor getDepends() {