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; |