From: <one...@us...> - 2003-05-07 15:09:09
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/loader In directory sc8-pr-cvs1:/tmp/cvs-serv18694/hibernate/loader Modified Files: EntityLoader.java Loader.java OneToManyLoader.java OuterJoinLoader.java Log Message: much better fix for problem with normalized mapping and querying associations Index: EntityLoader.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/loader/EntityLoader.java,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** EntityLoader.java 25 Apr 2003 03:40:34 -0000 1.14 --- EntityLoader.java 7 May 2003 15:09:05 -0000 1.15 *************** *** 11,14 **** --- 11,15 ---- import net.sf.hibernate.engine.SessionImplementor; import net.sf.hibernate.persister.Loadable; + import net.sf.hibernate.persister.Queryable; import net.sf.hibernate.sql.ConditionFragment; import net.sf.hibernate.type.Type; *************** *** 29,33 **** String condition = new ConditionFragment() .setTableAlias(alias) ! .setCondition( persister.getIdentifierColumnNames(), "?" ) .toFragmentString(); --- 30,34 ---- String condition = new ConditionFragment() .setTableAlias(alias) ! .setCondition( ( (Queryable) persister ).getIdentifierColumnNames(), "?" ) .toFragmentString(); Index: Loader.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/loader/Loader.java,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** Loader.java 4 May 2003 06:09:39 -0000 1.23 --- Loader.java 7 May 2003 15:09:05 -0000 1.24 *************** *** 96,101 **** int maxRows = (selection==null || selection.getMaxRows()==null) ? ! Integer.MAX_VALUE : ! selection.getMaxRows().intValue(); final Loadable[] persisters = getPersisters(); --- 96,101 ---- int maxRows = (selection==null || selection.getMaxRows()==null) ? ! Integer.MAX_VALUE : ! selection.getMaxRows().intValue(); final Loadable[] persisters = getPersisters(); Index: OneToManyLoader.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/loader/OneToManyLoader.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** OneToManyLoader.java 25 Apr 2003 03:40:35 -0000 1.13 --- OneToManyLoader.java 7 May 2003 15:09:05 -0000 1.14 *************** *** 42,49 **** String alias = alias( collectionPersister.getQualifiedTableName(), 0 ); - String collAlias = persister.getConcreteClassAlias(alias); String whereString=""; ! if ( collPersister.hasWhere() ) whereString = " and " + collPersister.getSQLWhereString(collAlias); List associations = walkTree(persister, alias, session); --- 42,48 ---- String alias = alias( collectionPersister.getQualifiedTableName(), 0 ); String whereString=""; ! if ( collPersister.hasWhere() ) whereString = " and " + collPersister.getSQLWhereString(alias); List associations = walkTree(persister, alias, session); *************** *** 56,60 **** Select select = new Select() .setSelectClause( ! collPersister.selectClauseFragment(collAlias) + ( joins==0 ? StringHelper.EMPTY_STRING : ", " + selectString(associations) ) + ", " + --- 55,59 ---- Select select = new Select() .setSelectClause( ! collPersister.selectClauseFragment(alias) + ( joins==0 ? StringHelper.EMPTY_STRING : ", " + selectString(associations) ) + ", " + *************** *** 66,70 **** ) .setWhereClause( ! new ConditionFragment().setTableAlias(collAlias) .setCondition( collPersister.getKeyColumnNames(), "?" ) .toFragmentString() --- 65,69 ---- ) .setWhereClause( ! new ConditionFragment().setTableAlias(alias) .setCondition( collPersister.getKeyColumnNames(), "?" ) .toFragmentString() *************** *** 76,80 **** persister.whereJoinFragment(alias, true, true) ); ! if ( collPersister.hasOrdering() ) select.setOrderByClause( collPersister.getSQLOrderByString(collAlias) ); sql = select.toStatementString(); --- 75,79 ---- persister.whereJoinFragment(alias, true, true) ); ! if ( collPersister.hasOrdering() ) select.setOrderByClause( collPersister.getSQLOrderByString(alias) ); sql = select.toStatementString(); Index: OuterJoinLoader.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/loader/OuterJoinLoader.java,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** OuterJoinLoader.java 3 May 2003 07:14:30 -0000 1.17 --- OuterJoinLoader.java 7 May 2003 15:09:05 -0000 1.18 *************** *** 50,55 **** public static final class OuterJoinableAssociation { public Loadable subpersister; ! public String[] foreignKeyColumns; // belong to persister public String subalias; } --- 50,57 ---- public static final class OuterJoinableAssociation { public Loadable subpersister; ! public String[] foreignKeyColumns; // belong to other persister public String subalias; + public String foreignKeyalias; + public boolean isOneToOne; } *************** *** 78,82 **** // fetch many-to-many by outerjoin depending value of outer-join in mapping String[] columns = StringHelper.prefix( persister.getElementColumnNames(), alias + StringHelper.DOT ); ! walkTree(etype, columns, persister, associations, new HashSet(), session); } } --- 80,84 ---- // fetch many-to-many by outerjoin depending value of outer-join in mapping String[] columns = StringHelper.prefix( persister.getElementColumnNames(), alias + StringHelper.DOT ); ! walkTree(etype, columns, persister, alias, associations, new HashSet(), session); } } *************** *** 109,121 **** columns = StringHelper.prefix( ! ( (Loadable) persister ).getIdentifierColumnNames(), //The cast is safe because collections can't contain a 1-to-1 alias + StringHelper.DOT ); } else { ! columns= persister.toColumns(alias, i); } ! walkTree(etype, columns, persister, associations, classPersisters, session); } } --- 111,123 ---- columns = StringHelper.prefix( ! persister.getIdentifierColumnNames(), //The cast is safe because collections can't contain a 1-to-1 alias + StringHelper.DOT ); } else { ! columns = persister.toColumns(alias, i); } ! walkTree(etype, columns, persister, alias, associations, classPersisters, session); } } *************** *** 142,146 **** if ( autoEager( act.enableJoinedFetch(i), etype, session ) ) { String[] columns = StringHelper.prefix( range, alias + StringHelper.DOT ); ! walkTree(etype, columns, persister, associations, classPersisters, session); } } --- 144,148 ---- if ( autoEager( act.enableJoinedFetch(i), etype, session ) ) { String[] columns = StringHelper.prefix( range, alias + StringHelper.DOT ); ! walkTree(etype, columns, persister, alias, associations, classPersisters, session); } } *************** *** 150,153 **** --- 152,156 ---- begin+=length; } + } *************** *** 162,172 **** * Add on association (one-to-one or many-to-one) to a list of associations be fetched by outerjoin (if necessary) */ ! private void walkTree(EntityType type, String[] columns, Object persister, List associations, Set classPersisters, SessionFactoryImplementor session) throws MappingException { Loadable subpersister = (Loadable) session.getPersister( type.getPersistentClass() ); - //TODO: remove this: - //if ( subpersister instanceof NormalizedEntityPersister ) return; - if ( !classPersisters.contains(subpersister) ) { // to avoid navigating back up bidirectional associations (and circularities) --- 165,172 ---- * Add on association (one-to-one or many-to-one) to a list of associations be fetched by outerjoin (if necessary) */ ! private void walkTree(EntityType type, String[] columns, Object persister, String alias, List associations, Set classPersisters, SessionFactoryImplementor session) throws MappingException { Loadable subpersister = (Loadable) session.getPersister( type.getPersistentClass() ); if ( !classPersisters.contains(subpersister) ) { // to avoid navigating back up bidirectional associations (and circularities) *************** *** 174,182 **** associations.add(assoc); classPersisters.add(persister); - //assoc.persister = persister; assoc.subpersister = subpersister; assoc.foreignKeyColumns = columns; String subalias = alias( subpersister.getClassName(), associations.size() ); assoc.subalias = subalias; walkTree(subpersister, subalias, associations, classPersisters, session); } --- 174,189 ---- associations.add(assoc); classPersisters.add(persister); assoc.subpersister = subpersister; assoc.foreignKeyColumns = columns; String subalias = alias( subpersister.getClassName(), associations.size() ); assoc.subalias = subalias; + + if ( type.isOneToOne() ) { + // only needed for oneToOne associations + // because we need to avoid unnecessary lookups + assoc.foreignKeyalias = alias; + assoc.isOneToOne = true; + } + walkTree(subpersister, subalias, associations, classPersisters, session); } *************** *** 261,268 **** oj.subpersister.whereJoinFragment(oj.subalias, false, true) ); - - //TODO: add the persister's outerjoins } return outerjoin; } --- 268,299 ---- oj.subpersister.whereJoinFragment(oj.subalias, false, true) ); } return outerjoin; + } + + protected static int[] getOneToOneOwners(String alias, List associations) { + int size = associations.size(); + int[] result = new int[size]; + for (int i=0; i<size; i++) { + OuterJoinableAssociation assoc = (OuterJoinableAssociation) associations.get(i); + if (assoc.isOneToOne) { + if ( assoc.foreignKeyalias.equals(alias) ) { + result[i] = i+1; //TODO: very dodgy, since this is actually defined by subclasses.... + } + else { + for (int j=0; j<size; j++) { + OuterJoinableAssociation possibleOwner = (OuterJoinableAssociation) associations.get(j); + if ( assoc.foreignKeyalias.equals(possibleOwner.subalias) ) { + result[i] = j; //TODO: again, quite dodgy.... + break; + } + } + } + } + else { + result[i] = -1; + } + } + return result; } |