From: <one...@us...> - 2003-03-02 06:59:23
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql In directory sc8-pr-cvs1:/tmp/cvs-serv18450/hibernate/hql Modified Files: PathExpressionParser.java QueryTranslator.java WhereParser.java Log Message: fixed a problem with outer joins and subclasses Index: PathExpressionParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/PathExpressionParser.java,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** PathExpressionParser.java 1 Mar 2003 12:15:27 -0000 1.11 --- PathExpressionParser.java 2 Mar 2003 06:58:48 -0000 1.12 *************** *** 385,389 **** join.addJoin( p.getTableName(), elementName, collectionElementColumns, keyColumnNames, joinType); } ! q.addFromType(elementName, clazz, join); return elementName; --- 385,389 ---- join.addJoin( p.getTableName(), elementName, collectionElementColumns, keyColumnNames, joinType); } ! q.addFromType(elementName, clazz, join, false); return elementName; Index: QueryTranslator.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/QueryTranslator.java,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** QueryTranslator.java 1 Mar 2003 12:15:27 -0000 1.16 --- QueryTranslator.java 2 Mar 2003 06:58:48 -0000 1.17 *************** *** 60,64 **** private final List scalarTypes = new ArrayList(); private final Map namedParameters = new HashMap(); ! private final HashMap aliasNames = new HashMap(); private final List scalarSelectTokens = new ArrayList(); --- 60,65 ---- private final List scalarTypes = new ArrayList(); private final Map namedParameters = new HashMap(); ! private final Map aliasNames = new HashMap(); ! private final Set crossJoins = new HashSet(); private final List scalarSelectTokens = new ArrayList(); *************** *** 321,328 **** } ! void addFromType(String name, Class type, JoinFragment join) { addType(name, type); fromTypes.add(name); addJoin(name, join); } --- 322,331 ---- } ! void addFromType(String name, Class type, JoinFragment join, boolean crossJoin) { ! //TODO: join type!! addType(name, type); fromTypes.add(name); addJoin(name, join); + if (crossJoin) crossJoins.add(name); } *************** *** 330,334 **** JoinFragment ojf = createJoinFragment(); ojf.addCrossJoin( classPersister.getTableName(), name ); ! addFromType( name, classPersister.getMappedClass(), ojf ); } --- 333,337 ---- JoinFragment ojf = createJoinFragment(); ojf.addCrossJoin( classPersister.getTableName(), name ); ! addFromType(name, classPersister.getMappedClass(), ojf, true); } *************** *** 615,622 **** JoinFragment join = (JoinFragment) joins.get(name); if (join!=null) { ojf.addFragment(join); ojf.addJoins( ! p.fromJoinFragment(name, true, includeSubclasses), ! p.queryWhereFragment(name, includeSubclasses) ); } --- 618,626 ---- JoinFragment join = (JoinFragment) joins.get(name); if (join!=null) { + boolean isCrossJoin = crossJoins.contains(name); ojf.addFragment(join); ojf.addJoins( ! p.fromJoinFragment(name, isCrossJoin, includeSubclasses), ! p.queryWhereFragment(name, isCrossJoin, includeSubclasses) ); } *************** *** 696,700 **** ); } ! addFromType( elementName, elemType.getPersistentClass(), join ); } --- 700,704 ---- ); } ! addFromType(elementName, elemType.getPersistentClass(), join, false); } *************** *** 852,859 **** } } - /*else if ( returnTypes.length==1 && persisters.length>1 ) { - // we are doing some outerjoining - return row[ persisters.length-1 ]; - }*/ else if (holderClass==null) { return (row.length==1) ? row[0] : row; --- 856,859 ---- Index: WhereParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/WhereParser.java,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** WhereParser.java 1 Mar 2003 21:27:29 -0000 1.9 --- WhereParser.java 2 Mar 2003 06:58:49 -0000 1.10 *************** *** 167,174 **** name = pathExpressionParser.continueFromManyToMany(clazz, element.elementColumns, q); } - /*else if ( type.isPersistentCollectionType() ) { //ie. a subcollection - String role = ( (PersistentCollectionType) type ).getRole(); - name = pathExpressionParser.continueFromSubcollection(role, element.elementColumns, q); - }*/ else { throw new QueryException("illegally dereferenced collection element"); --- 167,170 ---- *************** *** 286,292 **** openExpression(q, lcToken); } - /*else if ( lcToken.equals("not") ) { - startNot(q); - }*/ //Cope with special cases of AND, NOT, ) --- 282,285 ---- *************** *** 323,335 **** appendToken(q, ( (StringBuffer) joins.removeLast() ).toString() ); - // finish off any unary operations - /*int count = ( (Integer) unaryCounts.removeLast() ).intValue(); - for ( int i=0; i<count; i++ ) { //to allow not not, not not not, etc... - appendToken(q, StringHelper.CLOSE); - }*/ - } else { - //unaryCounts.removeLast(); //check that its zero? (As an assertion) StringBuffer join = (StringBuffer) joins.removeLast(); ( (StringBuffer) joins.getLast() ).append( join.toString() ); --- 316,321 ---- *************** *** 342,346 **** private void openExpression(QueryTranslator q, String lcToken) { - //unaryCounts.addLast( new Integer(0) ); nots.addLast(Boolean.FALSE); booleanTests.addLast(Boolean.FALSE); --- 328,331 ---- *************** *** 348,359 **** if ( !StringHelper.OPEN_PAREN.equals(lcToken) ) appendToken(q, StringHelper.OPEN_PAREN); } ! ! /*private void startNot(QueryTranslator q) { ! // increment the count ! Integer count = new Integer( ( (Integer) unaryCounts.removeLast() ).intValue() + 1 ); ! unaryCounts.addLast(count); ! appendToken(q, StringHelper.OPEN); ! }*/ ! private void doPathExpression(String token, QueryTranslator q) throws QueryException { q.unalias(token); --- 333,337 ---- if ( !StringHelper.OPEN_PAREN.equals(lcToken) ) appendToken(q, StringHelper.OPEN_PAREN); } ! private void doPathExpression(String token, QueryTranslator q) throws QueryException { q.unalias(token); |