From: <one...@us...> - 2003-03-09 04:04:40
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql In directory sc8-pr-cvs1:/tmp/cvs-serv31647/hibernate/hql Modified Files: ParserHelper.java PathExpressionParser.java QueryTranslator.java Log Message: expanded Criteria API allowed unmapped-class queries with new from syntax Index: ParserHelper.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/ParserHelper.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ParserHelper.java 28 Feb 2003 07:01:28 -0000 1.4 --- ParserHelper.java 9 Mar 2003 04:04:07 -0000 1.5 *************** *** 14,21 **** public static final String PATH_SEPARATORS = "."; ! public static final String whitespace = " \n\r\f\t"; public static boolean isWhitespace(String str) { ! return whitespace.indexOf(str) > -1; } --- 14,21 ---- public static final String PATH_SEPARATORS = "."; ! public static final String WHITESPACE = " \n\r\f\t"; public static boolean isWhitespace(String str) { ! return WHITESPACE.indexOf(str) > -1; } Index: PathExpressionParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/PathExpressionParser.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** PathExpressionParser.java 3 Mar 2003 09:31:02 -0000 1.13 --- PathExpressionParser.java 9 Mar 2003 04:04:07 -0000 1.14 *************** *** 158,161 **** --- 158,162 ---- addJoin( p.getQualifiedTableName(), name, colNames, q ); + if ( p.hasWhere() ) join.addCondition( p.getSQLWhereString(name) ); doCollectionProperty(token, p, name); collectionName = name; Index: QueryTranslator.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/QueryTranslator.java,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** QueryTranslator.java 4 Mar 2003 10:53:46 -0000 1.19 --- QueryTranslator.java 9 Mar 2003 04:04:07 -0000 1.20 *************** *** 15,19 **** import java.util.Map; import java.util.Set; - import java.util.StringTokenizer; import net.sf.hibernate.Hibernate; --- 15,18 ---- *************** *** 669,672 **** --- 668,672 ---- join.addCrossJoin( persister.getQualifiedTableName(), elementName ); join.addCondition(elementName, keyColumnNames, " = ?"); + if ( persister.hasWhere() ) join.addCondition( persister.getSQLWhereString(elementName) ); } else { //many-to-many *************** *** 686,689 **** --- 686,690 ---- JoinFragment.INNER_JOIN ); + if ( persister.hasWhere() ) join.addCondition( persister.getSQLWhereString(collectionName) ); } addFrom(elementName, elemType.getPersistentClass(), join); *************** *** 758,773 **** public static String[] concreteQueries(String query, SessionFactoryImplementor factory) { ! StringTokenizer tokens = new StringTokenizer(query, StringHelper.COMMA_SPACE); ArrayList placeholders = new ArrayList(); ArrayList replacements = new ArrayList(); int count=0; ! boolean check = false; ! while ( tokens.hasMoreTokens() ) { ! String token = tokens.nextToken(); ! if ( "class".equals( token.toLowerCase() ) ) { ! check = true; } ! else if (check) { ! check = false; Class clazz= getImportedClass(token, factory); if (clazz!=null) { --- 759,791 ---- public static String[] concreteQueries(String query, SessionFactoryImplementor factory) { ! //TODO: this is one of the ugliest and most fragile pieces of code in Hibernate.... ! String[] tokens = StringHelper.split( ParserHelper.WHITESPACE + ",", query, true ); ArrayList placeholders = new ArrayList(); ArrayList replacements = new ArrayList(); int count=0; ! String last = null; ! int nextIndex = 0; ! String next = null; ! for ( int i=1; i<tokens.length; i++ ) { ! ! //update last non-whitespace token, if necessary ! if ( !ParserHelper.isWhitespace( tokens[i-1] ) ) last = tokens[i-1].toLowerCase(); ! ! String token = tokens[i]; ! if ( ParserHelper.isWhitespace(token) || last==null ) continue; ! ! //scan for next non-whitespace token ! if (nextIndex<=i) { ! for ( nextIndex=i+1; nextIndex<tokens.length; nextIndex++ ) { ! next = tokens[nextIndex].toLowerCase(); ! if ( !ParserHelper.isWhitespace(next) ) break; ! } } ! ! //if ( Character.isUpperCase( token.charAt( token.lastIndexOf(".") + 1 ) ) ) { ! if ( ! ( beforeClassTokens.contains(last) && !notAfterClassTokens.contains(next) ) || ! "class".equals(last) ! ){ Class clazz= getImportedClass(token, factory); if (clazz!=null) { *************** *** 781,788 **** --- 799,818 ---- } } + } return StringHelper.multiply( query, placeholders.iterator(), replacements.iterator() ); } + private static final Set beforeClassTokens = new HashSet(); + private static final Set notAfterClassTokens = new HashSet(); + static { + beforeClassTokens.add("from"); + beforeClassTokens.add(","); + notAfterClassTokens.add("in"); + notAfterClassTokens.add(","); + notAfterClassTokens.add("from"); + notAfterClassTokens.add(")"); + } + Class getImportedClass(String name) { return getImportedClass(name, factory); *************** *** 793,797 **** return ReflectHelper.classForName(name); } ! catch (Exception e) { String[] imports = factory.getImports(); for (int i=0; i<imports.length; i++) { --- 823,827 ---- return ReflectHelper.classForName(name); } ! catch (Throwable e) { String[] imports = factory.getImports(); for (int i=0; i<imports.length; i++) { *************** *** 799,803 **** return ReflectHelper.classForName( imports[i] + StringHelper.DOT + name ); } ! catch (Exception ex) {} } return null; --- 829,833 ---- return ReflectHelper.classForName( imports[i] + StringHelper.DOT + name ); } ! catch (Throwable t) {} } return null; |