|
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();
|