Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql In directory sc8-pr-cvs1:/tmp/cvs-serv18694/hibernate/hql Modified Files: FromParser.java PathExpressionParser.java QueryTranslator.java SelectParser.java WhereParser.java Log Message: much better fix for problem with normalized mapping and querying associations Index: FromParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/FromParser.java,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** FromParser.java 3 Mar 2003 09:30:57 -0000 1.11 --- FromParser.java 7 May 2003 15:09:04 -0000 1.12 *************** *** 6,10 **** import net.sf.hibernate.QueryException; ! import net.sf.hibernate.persister.Loadable; import net.sf.hibernate.sql.JoinFragment; import net.sf.hibernate.util.StringHelper; --- 6,10 ---- import net.sf.hibernate.QueryException; ! import net.sf.hibernate.persister.Queryable; import net.sf.hibernate.sql.JoinFragment; import net.sf.hibernate.util.StringHelper; *************** *** 27,31 **** private boolean expectingAs; private boolean afterJoinType; ! private Loadable classPersister; private int joinType; --- 27,31 ---- private boolean expectingAs; private boolean afterJoinType; ! private Queryable classPersister; private int joinType; *************** *** 129,133 **** if (afterClass) { // treat it as a classname ! Loadable p = q.getPersisterUsingImports(token); if (p==null) throw new QueryException("persister not found: " + token); q.addFromClass(alias, p); --- 129,133 ---- if (afterClass) { // treat it as a classname ! Queryable p = q.getPersisterUsingImports(token); if (p==null) throw new QueryException("persister not found: " + token); q.addFromClass(alias, p); *************** *** 153,157 **** // in the "old" HQL style ! Loadable p = q.getPersisterUsingImports(token); if (p!=null) { // starts with the name of a mapped class (new style) --- 153,157 ---- // in the "old" HQL style ! Queryable p = q.getPersisterUsingImports(token); if (p!=null) { // starts with the name of a mapped class (new style) Index: PathExpressionParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/PathExpressionParser.java,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** PathExpressionParser.java 3 May 2003 06:58:30 -0000 1.18 --- PathExpressionParser.java 7 May 2003 15:09:04 -0000 1.19 *************** *** 8,12 **** import net.sf.hibernate.collection.CollectionPersister; import net.sf.hibernate.persister.ClassPersister; - import net.sf.hibernate.persister.Loadable; import net.sf.hibernate.persister.Queryable; import net.sf.hibernate.sql.JoinFragment; --- 8,11 ---- *************** *** 59,63 **** private boolean continuation; private int joinType = JoinFragment.INNER_JOIN; //default mode - private boolean endsWithCollectionProperty = false; void setJoinType(int joinType) { --- 58,61 ---- *************** *** 66,74 **** private void addJoin(String table, String name, String[] rhsCols, QueryTranslator q) throws QueryException { - addJoin(table, name, name, rhsCols, q); - } - private void addJoin(String table, String name, String concreteAlias, String[] rhsCols, QueryTranslator q) throws QueryException { String[] lhsCols = currentColumns(q); ! join.addJoin(table, name, concreteAlias, lhsCols, rhsCols, joinType); } --- 64,69 ---- private void addJoin(String table, String name, String[] rhsCols, QueryTranslator q) throws QueryException { String[] lhsCols = currentColumns(q); ! join.addJoin(table, name, lhsCols, rhsCols, joinType); } *************** *** 78,82 **** currentName = q.createNameFor(clazz); q.addType(currentName, clazz); ! Loadable p = q.getPersister(clazz); join.addJoin( p.getTableName(), currentName, joinColumns, p.getIdentifierColumnNames(), joinType ); return currentName; --- 73,77 ---- currentName = q.createNameFor(clazz); q.addType(currentName, clazz); ! Queryable p = q.getPersister(clazz); join.addJoin( p.getTableName(), currentName, joinColumns, p.getIdentifierColumnNames(), joinType ); return currentName; *************** *** 175,196 **** CollectionPersister collPersister = q.getCollectionPersister(collectionRole); String[] colNames = collPersister.getKeyColumnNames(); - String name= q.createNameForCollection(collectionRole); ! ! String tableName; ! String concreteAlias; ! if ( collPersister.isOneToMany() && !endsWithCollectionProperty ) { ! Queryable persister = q.getPersister( ( (EntityType) collPersister.getElementType() ).getPersistentClass() ); ! tableName = persister.getTableName(); ! concreteAlias = persister.getConcreteClassAlias(name); ! if ( joinType!=JoinFragment.INNER_JOIN && !name.equals(concreteAlias) ) ! throw new QueryException("outer and full join to collection of a subclass not currently supported by this mapping strategy: " +path); ! } ! else { ! tableName = collPersister.getQualifiedTableName(); ! concreteAlias=name; ! } ! ! addJoin(tableName, name, concreteAlias, colNames, q); if ( collPersister.hasWhere() ) join.addCondition( collPersister.getSQLWhereString(name) ); doCollectionProperty(token, collPersister, name); --- 170,176 ---- CollectionPersister collPersister = q.getCollectionPersister(collectionRole); String[] colNames = collPersister.getKeyColumnNames(); String name= q.createNameForCollection(collectionRole); ! String tableName = collPersister.getQualifiedTableName(); ! addJoin(tableName, name, colNames, q); if ( collPersister.hasWhere() ) join.addCondition( collPersister.getSQLWhereString(name) ); doCollectionProperty(token, collPersister, name); *************** *** 277,281 **** public void end(QueryTranslator q) throws QueryException { - endsWithCollectionProperty = false; ignoreInitialJoin = false; --- 257,260 ---- *************** *** 303,326 **** String[] keyCols = collPersister.getKeyColumnNames(); - String concreteAlias; JoinFragment ojf = q.createJoinFragment(); if ( collPersister.isOneToMany() ) { Queryable persister = q.getPersister( ( (EntityType) collPersister.getElementType() ).getPersistentClass() ); - ojf.addCrossJoin( persister.getTableName(), collectionName ); ojf.addJoins( persister.fromJoinFragment(collectionName, true, false), persister.whereJoinFragment(collectionName, true, false) ); - concreteAlias = persister.getConcreteClassAlias(collectionName); - } - else { - ojf.addCrossJoin( collPersister.getQualifiedTableName(), collectionName ); - concreteAlias = collectionName; } if (!continuation) { ! addJoin( collPersister.getQualifiedTableName(), concreteAlias, keyCols, q ); } ! join.addCondition(concreteAlias, indexCols, " = "); String[] eltCols = collPersister.getElementColumnNames(); --- 282,299 ---- String[] keyCols = collPersister.getKeyColumnNames(); JoinFragment ojf = q.createJoinFragment(); + ojf.addCrossJoin( collPersister.getQualifiedTableName(), collectionName ); if ( collPersister.isOneToMany() ) { Queryable persister = q.getPersister( ( (EntityType) collPersister.getElementType() ).getPersistentClass() ); ojf.addJoins( persister.fromJoinFragment(collectionName, true, false), persister.whereJoinFragment(collectionName, true, false) ); } if (!continuation) { ! addJoin( collPersister.getQualifiedTableName(), collectionName, keyCols, q ); } ! join.addCondition(collectionName, indexCols, " = "); String[] eltCols = collPersister.getElementColumnNames(); *************** *** 445,449 **** else { q.addCollection(collectionName, collectionRole); ! Loadable p = q.getPersister(clazz); elementName = q.createNameFor(clazz); String[] keyColumnNames = p.getIdentifierColumnNames(); --- 418,422 ---- else { q.addCollection(collectionName, collectionRole); ! Queryable p = q.getPersister(clazz); elementName = q.createNameFor(clazz); String[] keyColumnNames = p.getIdentifierColumnNames(); *************** *** 510,527 **** throw new QueryException("expecting 'elements' or 'indices' after: " + path); } - } - - /** - * Very ugly hack to allow collection paths to be processed correctly - * for normalized mappings - */ - public final void setPath(String path) { - endsWithCollectionProperty = path.endsWith(COLLECTION_ELEMENTS) || - path.endsWith(COLLECTION_INDICES) || - path.endsWith(COLLECTION_SIZE) || - path.endsWith(COLLECTION_MAX_INDEX) || - path.endsWith(COLLECTION_MAX_ELEMENT) || - path.endsWith(COLLECTION_MIN_INDEX) || - path.endsWith(COLLECTION_MIN_ELEMENT); } --- 483,486 ---- Index: QueryTranslator.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/QueryTranslator.java,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** QueryTranslator.java 3 May 2003 06:58:30 -0000 1.26 --- QueryTranslator.java 7 May 2003 15:09:04 -0000 1.27 *************** *** 308,312 **** } ! void addFromClass(String name, Loadable classPersister) { JoinFragment ojf = createJoinFragment(); ojf.addCrossJoin( classPersister.getTableName(), name ); --- 308,312 ---- } ! void addFromClass(String name, Queryable classPersister) { JoinFragment ojf = createJoinFragment(); ojf.addCrossJoin( classPersister.getTableName(), name ); *************** *** 486,490 **** for ( int k=0; k<size; k++ ) { String name = (String) returnTypes.get(k); ! String suffix = size==1 ? StringHelper.EMPTY_STRING : Integer.toString(k) + StringHelper.UNDERSCORE; sql.addSelectFragmentString( persisters[k].identifierSelectFragment(name, suffix) ); } --- 486,492 ---- for ( int k=0; k<size; k++ ) { String name = (String) returnTypes.get(k); ! String suffix = size==1 ? ! StringHelper.EMPTY_STRING : ! Integer.toString(k) + StringHelper.UNDERSCORE; sql.addSelectFragmentString( persisters[k].identifierSelectFragment(name, suffix) ); } *************** *** 511,515 **** int size = returnTypes.size(); for ( int k=0; k<size; k++ ) { ! String suffix = (size==1) ? StringHelper.EMPTY_STRING : Integer.toString(k) + StringHelper.UNDERSCORE; String name = (String) returnTypes.get(k) ; sql.addSelectFragmentString( persisters[k].propertySelectFragment(name, suffix) ); --- 513,519 ---- int size = returnTypes.size(); for ( int k=0; k<size; k++ ) { ! String suffix = (size==1) ? ! StringHelper.EMPTY_STRING : ! Integer.toString(k) + StringHelper.UNDERSCORE; String name = (String) returnTypes.get(k) ; sql.addSelectFragmentString( persisters[k].propertySelectFragment(name, suffix) ); *************** *** 657,673 **** //if (keyColumnNames.length!=1) throw new QueryException("composite-key collection in filter: " + collectionRole); JoinFragment join = createJoinFragment(); if ( persister.isOneToMany() ) { ! Queryable classPersister = getPersister( ( (EntityType) persister.getElementType() ).getPersistentClass() ); ! String concreteAlias = classPersister.getConcreteClassAlias(elementName); ! join.addCrossJoin( classPersister.getTableName(), elementName ); ! join.addCondition(concreteAlias, keyColumnNames, " = ?"); ! if ( persister.hasWhere() ) join.addCondition( persister.getSQLWhereString(concreteAlias) ); } else { //many-to-many ! String collectionName = createNameForCollection(collectionRole); addCollection(collectionName, collectionRole); - join.addCrossJoin( persister.getQualifiedTableName(), collectionName ); - join.addCondition(collectionName, keyColumnNames, " = ?"); Queryable p = getPersister( elemType.getPersistentClass() ); --- 661,672 ---- //if (keyColumnNames.length!=1) throw new QueryException("composite-key collection in filter: " + collectionRole); + String collectionName; JoinFragment join = createJoinFragment(); if ( persister.isOneToMany() ) { ! collectionName = elementName; } else { //many-to-many ! collectionName = createNameForCollection(collectionRole); addCollection(collectionName, collectionRole); Queryable p = getPersister( elemType.getPersistentClass() ); *************** *** 681,686 **** JoinFragment.INNER_JOIN ); - if ( persister.hasWhere() ) join.addCondition( persister.getSQLWhereString(collectionName) ); } addFrom(elementName, elemType.getPersistentClass(), join); --- 680,687 ---- JoinFragment.INNER_JOIN ); } + join.addCrossJoin( persister.getQualifiedTableName(), collectionName ); + join.addCondition(collectionName, keyColumnNames, " = ?"); + if ( persister.hasWhere() ) join.addCondition( persister.getSQLWhereString(collectionName) ); addFrom(elementName, elemType.getPersistentClass(), join); Index: SelectParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/SelectParser.java,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** SelectParser.java 3 May 2003 06:58:30 -0000 1.11 --- SelectParser.java 7 May 2003 15:09:05 -0000 1.12 *************** *** 121,125 **** else if (aggregate) { if (!ready) throw new QueryException("( expected after aggregate function in SELECT"); - aggregatePathExpressionParser.setPath(token); ParserHelper.parse(aggregatePathExpressionParser, q.unalias(token), ParserHelper.PATH_SEPARATORS, q); --- 121,124 ---- *************** *** 136,140 **** else { if (!ready) throw new QueryException(", expected in SELECT"); - pathExpressionParser.setPath(token); ParserHelper.parse(pathExpressionParser, q.unalias(token), ParserHelper.PATH_SEPARATORS, q); if ( pathExpressionParser.isCollectionValued() ) { --- 135,138 ---- Index: WhereParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/WhereParser.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** WhereParser.java 3 May 2003 06:58:30 -0000 1.13 --- WhereParser.java 7 May 2003 15:09:05 -0000 1.14 *************** *** 357,362 **** preprocess(token, q); - pathExpressionParser.setPath(token); - StringTokenizer tokens = new StringTokenizer(token, ".", true); pathExpressionParser.start(q); --- 357,360 ---- |