Update of /cvsroot/hibernate/Hibernate/cirrus/hibernate/loader
In directory usw-pr-cvs1:/tmp/cvs-serv27523/hibernate/loader
Modified Files:
AnsiOuterJoinGenerator.java EntityLoader.java
OuterJoinGenerator.java OuterJoinLoader.java
Log Message:
outerjoin fetching for normalized mappings
Index: AnsiOuterJoinGenerator.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/loader/AnsiOuterJoinGenerator.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** AnsiOuterJoinGenerator.java 4 Nov 2002 08:10:48 -0000 1.3
--- AnsiOuterJoinGenerator.java 5 Nov 2002 03:44:01 -0000 1.4
***************
*** 20,37 ****
protected final String appendOuterJoinStringAfterFrom(StringBuffer buf, OuterJoinLoader.OuterJoinableAssociation assoc) {
! buf.append(" LEFT OUTER JOIN ")
! .append( assoc.subpersister.getTableName() )
! .append(' ')
! .append(assoc.subalias )
! .append(" ON ");
String[] keyNames = assoc.subpersister.getIdentifierColumnNames();
for ( int j=0; j<assoc.foreignKeyColumns.length; j++) {
! buf.append( assoc.foreignKeyColumns[j] )
.append('=')
.append(assoc.subalias)
.append('.')
.append( keyNames[j] );
! if ( j<assoc.foreignKeyColumns.length-1 ) buf.append(" and ");
}
return buf.toString();
}
--- 20,36 ----
protected final String appendOuterJoinStringAfterFrom(StringBuffer buf, OuterJoinLoader.OuterJoinableAssociation assoc) {
! StringBuffer on = new StringBuffer(20).append("ON ");
String[] keyNames = assoc.subpersister.getIdentifierColumnNames();
+ //TODO: refactor onto Loadable .. this is repeated in two other places
for ( int j=0; j<assoc.foreignKeyColumns.length; j++) {
! on.append( assoc.foreignKeyColumns[j] )
.append('=')
.append(assoc.subalias)
.append('.')
.append( keyNames[j] );
! if ( j<assoc.foreignKeyColumns.length-1 ) on.append(" and ");
}
+ buf.append(" LEFT OUTER JOIN ")
+ .append( assoc.subpersister.fromClauseFragment( assoc.subalias, on.toString() ) );
return buf.toString();
}
Index: EntityLoader.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/loader/EntityLoader.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** EntityLoader.java 4 Nov 2002 08:10:49 -0000 1.8
--- EntityLoader.java 5 Nov 2002 03:44:01 -0000 1.9
***************
*** 22,26 ****
public EntityLoader(Loadable persister, SessionFactoryImplementor factory) throws MappingException {
! super(factory.getDialect());
idType = new Type[] { persister.getIdentifierType() };
--- 22,26 ----
public EntityLoader(Loadable persister, SessionFactoryImplementor factory) throws MappingException {
! super( factory.getDialect() );
idType = new Type[] { persister.getIdentifierType() };
Index: OuterJoinGenerator.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/loader/OuterJoinGenerator.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** OuterJoinGenerator.java 28 Sep 2002 00:57:24 -0000 1.2
--- OuterJoinGenerator.java 5 Nov 2002 03:44:01 -0000 1.3
***************
*** 6,10 ****
/**
! * Interface defining the methods needed to support generating the sql for
* left outer joins.
*/
--- 6,10 ----
/**
! * Abstract class defining the methods needed to support generating the sql for
* left outer joins.
*/
Index: OuterJoinLoader.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/loader/OuterJoinLoader.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** OuterJoinLoader.java 4 Nov 2002 08:10:50 -0000 1.11
--- OuterJoinLoader.java 5 Nov 2002 03:44:01 -0000 1.12
***************
*** 68,77 ****
Type type = persister.getElementType();
! String[] columns =persister.getElementColumnNames();
if ( type.isEntityType() ) {
EntityType etype = (EntityType) type;
! if ( autoEager( persister.enableJoinedFetch(), etype, session ) )
// fetch many-to-many by outerjoin depending value of outer-join in mapping
walkTree(etype, columns, persister, alias, associations, new HashSet(), session);
}
else if ( type.isComponentType() ) {
--- 68,78 ----
Type type = persister.getElementType();
! String[] columns = StringHelper.prefix( persister.getElementColumnNames(), alias + '.' );
if ( type.isEntityType() ) {
EntityType etype = (EntityType) type;
! if ( autoEager( persister.enableJoinedFetch(), etype, session ) ) {
// fetch many-to-many by outerjoin depending value of outer-join in mapping
walkTree(etype, columns, persister, alias, associations, new HashSet(), session);
+ }
}
else if ( type.isComponentType() ) {
***************
*** 87,105 ****
* For an entity class, add to a list of associations to be fetched by outerjoin
*/
! private final void walkTree(Loadable persister, String alias, List associations, Set classPersisters, SessionFactoryImplementor session) throws MappingException {
if ( !session.enableJoinedFetch() ) return;
! Loadable qcpersister = persister;
!
! int n = qcpersister.countSubclassProperties();
for ( int i=0; i<n; i++ ) {
! Type type = qcpersister.getSubclassPropertyType(i);
! String[] columns = qcpersister.getSubclassPropertyColumnNames(i);
if ( type.isEntityType() ) {
EntityType etype = (EntityType) type;
! if ( autoEager( qcpersister.enableJoinedFetch(i), etype, session ) )
walkTree(etype, columns, persister, alias, associations, classPersisters, session);
}
else if ( type.isComponentType() ) {
walkTree( (AbstractComponentType) type, columns, persister, alias, associations, classPersisters, session);
}
--- 88,120 ----
* For an entity class, add to a list of associations to be fetched by outerjoin
*/
! private final void walkTree(final Loadable persister, String alias, List associations, Set classPersisters, SessionFactoryImplementor session) throws MappingException {
if ( !session.enableJoinedFetch() ) return;
! int n = persister.countSubclassProperties();
for ( int i=0; i<n; i++ ) {
! Type type = persister.getSubclassPropertyType(i);
if ( type.isEntityType() ) {
EntityType etype = (EntityType) type;
! if ( autoEager( persister.enableJoinedFetch(i), etype, session ) ) {
!
! String[] columns;
! if ( etype.isOneToOne() ) {
!
! if ( persister.isDefinedOnSubclass(i) ) continue; //NOTE: workaround for problem with 1-to-1 defined on a subclass "accidently" picking up an object
!
! columns = StringHelper.prefix(
! ( (Loadable) persister ).getIdentifierColumnNames(), //The cast is safe because collections can't contain a 1-to-1
! alias + '.'
! );
! }
! else {
! columns= persister.toColumns(alias, i);
! }
!
walkTree(etype, columns, persister, alias, associations, classPersisters, session);
+ }
}
else if ( type.isComponentType() ) {
+ String[] columns = persister.getSubclassPropertyColumnNames(i);
walkTree( (AbstractComponentType) type, columns, persister, alias, associations, classPersisters, session);
}
***************
*** 111,115 ****
*/
private void walkTree(AbstractComponentType act, String[] cols, Object persister, String alias, List associations, Set classPersisters, SessionFactoryImplementor session) throws MappingException {
! if ( !session.enableJoinedFetch() ) return;
Type[] types = act.getSubtypes();
--- 126,133 ----
*/
private void walkTree(AbstractComponentType act, String[] cols, Object persister, String alias, List associations, Set classPersisters, SessionFactoryImplementor session) throws MappingException {
! if (
! !session.enableJoinedFetch() ||
! persister instanceof MultiTableEntityPersister //TODO: remove this + enable outerjoin fetching
! ) return;
Type[] types = act.getSubtypes();
***************
*** 145,149 ****
//TODO: remove this:
! if ( subpersister instanceof MultiTableEntityPersister ) return;
if ( !classPersisters.contains(subpersister) ) { // to avoid navigating back up bidirectional associations (and circularities)
--- 163,167 ----
//TODO: remove this:
! //if ( subpersister instanceof MultiTableEntityPersister ) return;
if ( !classPersisters.contains(subpersister) ) { // to avoid navigating back up bidirectional associations (and circularities)
***************
*** 154,170 ****
//assoc.persister = persister;
assoc.subpersister = subpersister;
! if ( type.isOneToOne() ) {
! assoc.foreignKeyColumns = StringHelper.prefix(
! ( (Loadable) persister ).getIdentifierColumnNames(), //The cast is safe because collections can't contain a 1-to-1
! alias + '.'
! );
! }
! /*else if ( persister instanceof Loadable ) {
! //TODO: deal with MultiTableEntityPersister HERE
! }*/
! else {
! // for a collection
! assoc.foreignKeyColumns = StringHelper.prefix(columns, alias + '.');
! }
String subalias = alias( subpersister.getTableName(), associations.size() );
assoc.subalias = subalias;
--- 172,176 ----
//assoc.persister = persister;
assoc.subpersister = subpersister;
! assoc.foreignKeyColumns = columns;
String subalias = alias( subpersister.getTableName(), associations.size() );
assoc.subalias = subalias;
|