From: <hib...@li...> - 2006-07-28 03:05:01
|
Author: ste...@jb... Date: 2006-07-26 14:01:49 -0400 (Wed, 26 Jul 2006) New Revision: 10172 Modified: trunk/Hibernate3/src/org/hibernate/hql/ast/tree/FromClause.java trunk/Hibernate3/test/org/hibernate/test/hql/EJBQLTest.java trunk/Hibernate3/test/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java Log: HHH-1948 : (JPA) from-element alias references need to be case insensitive Modified: trunk/Hibernate3/src/org/hibernate/hql/ast/tree/FromClause.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/hql/ast/tree/FromClause.java 2006-07-26 17:16:46 UTC (rev 10171) +++ trunk/Hibernate3/src/org/hibernate/hql/ast/tree/FromClause.java 2006-07-26 18:01:49 UTC (rev 10172) @@ -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: trunk/Hibernate3/test/org/hibernate/test/hql/EJBQLTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/hql/EJBQLTest.java 2006-07-26 17:16:46 UTC (rev 10171) +++ trunk/Hibernate3/test/org/hibernate/test/hql/EJBQLTest.java 2006-07-26 18:01:49 UTC (rev 10172) @@ -80,7 +80,7 @@ //parse(hql); //parse(ejbql); assertEjbqlEqualsHql(ejbql, hql); - + hql = "from Animal a where exists (from a.mother.father.offspring)"; ejbql = "select object(a) from Animal a where a.mother.father.offspring is not empty"; assertEjbqlEqualsHql( ejbql, hql ); @@ -218,11 +218,7 @@ assertEjbqlEqualsHql( "from Human h where not(h.pregnant is true)", "from Human h where not( h.pregnant=true )" ); } - public void testIdentifierCaseSensitive() throws Exception { - Session s = openSession( ); - s.createQuery( "select object(H) from Human h").list(); - s.close(); - } + // Private private void assertEjbqlEqualsHql(String ejbql, String hql) { Modified: trunk/Hibernate3/test/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java 2006-07-26 17:16:46 UTC (rev 10171) +++ trunk/Hibernate3/test/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java 2006-07-26 18:01:49 UTC (rev 10172) @@ -19,6 +19,7 @@ public static Test suite() { return new TestSuite( JPAQLComplianceTest.class ); } + public void testAliasNameSameAsUnqualifiedEntityName() { Session s = openSession(); s.beginTransaction(); @@ -40,6 +41,12 @@ 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(); |