From: <hib...@li...> - 2006-07-27 14:13:30
|
Author: ste...@jb... Date: 2006-07-26 14:04:07 -0400 (Wed, 26 Jul 2006) New Revision: 10173 Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/hql/ast/tree/FromClause.java branches/Branch_3_2/Hibernate3/test/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java Log: ported fix for HHH-1948 to 3.2 branch Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/hql/ast/tree/FromClause.java =================================================================== --- branches/Branch_3_2/Hibernate3/src/org/hibernate/hql/ast/tree/FromClause.java 2006-07-26 18:01:49 UTC (rev 10172) +++ branches/Branch_3_2/Hibernate3/src/org/hibernate/hql/ast/tree/FromClause.java 2006-07-26 18:04:07 UTC (rev 10173) @@ -103,12 +103,27 @@ */ public FromElement getFromElement(String aliasOrClassName) { FromElement fromElement = ( FromElement ) fromElementByClassAlias.get( aliasOrClassName ); + if ( fromElement == null && getSessionFactoryHelper().isStrictJPAQLComplianceEnabled() ) { + fromElement = findIntendedAliasedFromElementBasedOnCrazyJPARequirements( aliasOrClassName ); + } if ( fromElement == null && parentFromClause != null ) { fromElement = parentFromClause.getFromElement( aliasOrClassName ); } return fromElement; } + private FromElement findIntendedAliasedFromElementBasedOnCrazyJPARequirements(String specifiedAlias) { + Iterator itr = fromElementByClassAlias.entrySet().iterator(); + while ( itr.hasNext() ) { + Map.Entry entry = ( Map.Entry ) itr.next(); + String alias = ( String ) entry.getKey(); + if ( alias.equalsIgnoreCase( specifiedAlias ) ) { + return ( FromElement ) entry.getValue(); + } + } + return null; + } + /** * Convenience method to check whether a given token represents a from-element alias. * @@ -117,7 +132,7 @@ * from this point in the query graph. */ public boolean isFromElementAlias(String possibleAlias) { - boolean isAlias = fromElementByClassAlias.containsKey( possibleAlias ); + boolean isAlias = containsClassAlias( possibleAlias ); if ( !isAlias && parentFromClause != null ) { // try the parent FromClause... isAlias = parentFromClause.isFromElementAlias( possibleAlias ); @@ -227,7 +242,11 @@ * @return true if the from node contains the class alias name. */ public boolean containsClassAlias(String alias) { - return fromElementByClassAlias.keySet().contains( alias ); + boolean isAlias = fromElementByClassAlias.containsKey( alias ); + if ( !isAlias && getSessionFactoryHelper().isStrictJPAQLComplianceEnabled() ) { + isAlias = findIntendedAliasedFromElementBasedOnCrazyJPARequirements( alias ) != null; + } + return isAlias; } /** Modified: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java =================================================================== --- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java 2006-07-26 18:01:49 UTC (rev 10172) +++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java 2006-07-26 18:04:07 UTC (rev 10173) @@ -19,6 +19,7 @@ public static Test suite() { return new TestSuite( JPAQLComplianceTest.class ); } + public void testAliasNameSameAsUnqualifiedEntityName() { Session s = openSession(); s.beginTransaction(); @@ -39,4 +40,16 @@ } s.close(); } + + public void testIdentifierCaseSensitive() throws Exception { + Session s = openSession( ); + s.createQuery( "select object(I) from Item i").list(); + s.close(); + } + + public void testSelectWithDistinctClause() { + Session s = openSession(); + s.createQuery( "select c FROM Item c WHERE c.parts IS EMPTY" ).list(); + s.close(); + } } |