From: <one...@us...> - 2003-03-29 04:09:23
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql In directory sc8-pr-cvs1:/tmp/cvs-serv947/hibernate/hql Modified Files: PathExpressionParser.java QueryTranslator.java Log Message: * fixed a bug in SQLExpression * fixed a bug in Expression.ge() * improved proxy handling * fixed problems with select new * reworked import mechanism * added <any> mappings Index: PathExpressionParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/PathExpressionParser.java,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** PathExpressionParser.java 9 Mar 2003 04:04:07 -0000 1.14 --- PathExpressionParser.java 29 Mar 2003 04:08:47 -0000 1.15 *************** *** 111,115 **** } ! if ( propertyType.isComponentType() ) { if ( componentPath==null ) { componentPath = token; --- 111,115 ---- } ! if ( propertyType.isComponentType() || propertyType.isObjectType() ) { if ( componentPath==null ) { componentPath = token; Index: QueryTranslator.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/QueryTranslator.java,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** QueryTranslator.java 20 Mar 2003 13:59:06 -0000 1.21 --- QueryTranslator.java 29 Mar 2003 04:08:47 -0000 1.22 *************** *** 264,280 **** Queryable getPersisterUsingImports(String className) { - String[] imports = factory.getImports(); try { ! return (Queryable) factory.getPersister(className); } ! catch (Exception e) { ! for ( int i=0; i<imports.length; i++ ) { ! try { ! return (Queryable) factory.getPersister(imports[i] + StringHelper.DOT + className); ! } ! catch (Exception ex) {} ! } } - return null; } --- 264,273 ---- Queryable getPersisterUsingImports(String className) { try { ! return (Queryable) factory.getPersister( factory.getImportedClassName(className) ); } ! catch (MappingException me) { ! return null; } } *************** *** 759,770 **** 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++ ) { --- 752,772 ---- public static String[] concreteQueries(String query, SessionFactoryImplementor factory) { + + //scan the query string for class names appearing in the from clause and replace + //with all persistent implementors of the class/interface, returning multiple + //query strings (make sure we don't pick up a class in the select clause!) + //TODO: this is one of the ugliest and most fragile pieces of code in Hibernate.... ! ! String[] tokens = StringHelper.split( ParserHelper.WHITESPACE + "(),", query, true ); ! if (tokens.length==0) return new String[] { query }; // just especially for the trivial collection filter ArrayList placeholders = new ArrayList(); ArrayList replacements = new ArrayList(); + StringBuffer templateQuery = new StringBuffer(40); int count=0; String last = null; int nextIndex = 0; String next = null; + templateQuery.append( tokens[0] ); for ( int i=1; i<tokens.length; i++ ) { *************** *** 773,805 **** 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) { ! String[] implementors = factory.getImplementors(clazz); ! String placeholder = "$clazz" + count + "$"; ! query = StringHelper.replaceOnce(query, token, placeholder); ! if ( implementors!=null ) { ! placeholders.add(placeholder); ! replacements.add(implementors); } } } } ! String[] results = StringHelper.multiply( query, placeholders.iterator(), replacements.iterator() ); if (results.length==0) log.warn("no persistent classes found for query class: " + query); return results; --- 775,811 ---- String token = tokens[i]; ! if ( !ParserHelper.isWhitespace(token) || last==null ) { ! //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) { ! String[] implementors = factory.getImplementors(clazz); ! String placeholder = "$clazz" + count++ + "$"; ! if ( implementors!=null ) { ! placeholders.add(placeholder); ! replacements.add(implementors); ! } ! token = placeholder; // Note this!! } } + } + templateQuery.append(token); + } ! String[] results = StringHelper.multiply( templateQuery.toString(), placeholders.iterator(), replacements.iterator() ); if (results.length==0) log.warn("no persistent classes found for query class: " + query); return results; *************** *** 810,813 **** --- 816,820 ---- static { beforeClassTokens.add("from"); + //beforeClassTokens.add("new"); DEFINITELY DON'T HAVE THIS!! beforeClassTokens.add(","); notAfterClassTokens.add("in"); *************** *** 823,836 **** private static Class getImportedClass(String name, SessionFactoryImplementor factory) { try { ! return ReflectHelper.classForName(name); } catch (Throwable e) { - String[] imports = factory.getImports(); - for (int i=0; i<imports.length; i++) { - try { - return ReflectHelper.classForName( imports[i] + StringHelper.DOT + name ); - } - catch (Throwable t) {} - } return null; } --- 830,836 ---- private static Class getImportedClass(String name, SessionFactoryImplementor factory) { try { ! return ReflectHelper.classForName( factory.getImportedClassName(name) ); } catch (Throwable e) { return null; } |