From: <one...@us...> - 2003-04-03 12:34:32
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql In directory sc8-pr-cvs1:/tmp/cvs-serv28961/hibernate/hql Modified Files: PathExpressionParser.java QueryTranslator.java WhereParser.java Log Message: * improved foreign id-generator * fixed a bug with long path expressions ending in elements or indices in where clause Index: PathExpressionParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/PathExpressionParser.java,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** PathExpressionParser.java 29 Mar 2003 04:08:47 -0000 1.15 --- PathExpressionParser.java 3 Apr 2003 12:34:24 -0000 1.16 *************** *** 22,25 **** --- 22,29 ---- public class PathExpressionParser implements Parser { + //TODO: this class does too many things! we need a different + //kind of path expression parser for each of the diffferent + //ways in which path expressions can occur + public static final String ENTITY_ID = "id"; public static final String ENTITY_CLASS = "class"; *************** *** 46,49 **** --- 50,54 ---- private String path; private boolean skippedId; + private boolean ignoreInitialJoin; private boolean continuation; private int joinType = JoinFragment.INNER_JOIN; //default mode *************** *** 68,71 **** --- 73,80 ---- } + public void ignoreInitialJoin() { + ignoreInitialJoin=true; + } + public void token(String token, QueryTranslator q) throws QueryException { *************** *** 76,81 **** reset(q); //reset the dotcount (but not the path) currentName = alias; //after reset! ! JoinFragment ojf = q.getPathJoin(path); ! join.addCondition( ojf.toWhereFragmentString() ); //after reset! } else if ( ".".equals(token) ) { --- 85,92 ---- reset(q); //reset the dotcount (but not the path) currentName = alias; //after reset! ! if (!ignoreInitialJoin) { ! JoinFragment ojf = q.getPathJoin(path); ! join.addCondition( ojf.toWhereFragmentString() ); //after reset! ! } } else if ( ".".equals(token) ) { *************** *** 241,244 **** --- 252,256 ---- public void end(QueryTranslator q) throws QueryException { + ignoreInitialJoin = false; if ( isCollectionValued() ) { columns = collectionElementColumns; *************** *** 350,357 **** .append( StringHelper.join( ", ", collectionElementColumns ) ) .append(" FROM ") ! .append(collectionTable) .append(' ') ! .append(collectionName) ! //.append( join.toFromFragmentString() ) .append(" WHERE ") .append( join.toWhereFragmentString().substring(5) ) // remove initial " and " --- 362,369 ---- .append( StringHelper.join( ", ", collectionElementColumns ) ) .append(" FROM ") ! /*.append(collectionTable) .append(' ') ! .append(collectionName)*/ ! .append( join.toFromFragmentString().substring(2) ) // remove initial ", " .append(" WHERE ") .append( join.toWhereFragmentString().substring(5) ) // remove initial " and " Index: QueryTranslator.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/QueryTranslator.java,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** QueryTranslator.java 29 Mar 2003 04:08:47 -0000 1.22 --- QueryTranslator.java 3 Apr 2003 12:34:24 -0000 1.23 *************** *** 701,705 **** } - protected void bindNamedParameters(PreparedStatement ps, Map namedParams, SessionImplementor session) throws SQLException, HibernateException { if (namedParams!=null) { --- 701,704 ---- Index: WhereParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/WhereParser.java,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** WhereParser.java 3 Mar 2003 09:31:06 -0000 1.11 --- WhereParser.java 3 Apr 2003 12:34:25 -0000 1.12 *************** *** 334,339 **** } private void doPathExpression(String token, QueryTranslator q) throws QueryException { ! q.unalias(token); StringTokenizer tokens = new StringTokenizer(token, ".", true); pathExpressionParser.start(q); --- 334,360 ---- } + private void preprocess(String token, QueryTranslator q) throws QueryException { + // ugly hack for cases like "foo.bar.collection.elements" + // (multi-part path expression ending in elements or indices) + String[] tokens = StringHelper.split(".", token, true); + if ( + tokens.length>5 && + ( "elements".equals( tokens[tokens.length-1] ) || "indices".equals( tokens[tokens.length-1] ) ) + ) { + pathExpressionParser.start(q); + for( int i=0; i<tokens.length-3; i++ ) { + pathExpressionParser.token( tokens[i], q); + } + pathExpressionParser.token(null, q); + pathExpressionParser.end(q); + addJoin( pathExpressionParser.getWhereJoin(), q ); + pathExpressionParser.ignoreInitialJoin(); + } + } + private void doPathExpression(String token, QueryTranslator q) throws QueryException { ! ! preprocess(token, q); ! StringTokenizer tokens = new StringTokenizer(token, ".", true); pathExpressionParser.start(q); *************** *** 353,364 **** } else { ! JoinFragment ojf = pathExpressionParser.getWhereJoin(); ! JoinFragment fromClause = q.createJoinFragment(); ! fromClause.addJoins( ojf.toFromFragmentString(), StringHelper.EMPTY_STRING ); ! q.addJoin( pathExpressionParser.getName(), fromClause ); ! addToCurrentJoin( ojf.toWhereFragmentString() ); appendToken( q, pathExpressionParser.getWhereColumn() ); } } } --- 374,388 ---- } else { ! addJoin( pathExpressionParser.getWhereJoin(), q ); appendToken( q, pathExpressionParser.getWhereColumn() ); } } + } + + private void addJoin(JoinFragment ojf, QueryTranslator q) { + JoinFragment fromClause = q.createJoinFragment(); + fromClause.addJoins( ojf.toFromFragmentString(), StringHelper.EMPTY_STRING ); + q.addJoin( pathExpressionParser.getName(), fromClause ); + addToCurrentJoin( ojf.toWhereFragmentString() ); } |