From: <one...@us...> - 2003-02-28 07:01:31
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql In directory sc8-pr-cvs1:/tmp/cvs-serv27226/sf/hibernate/hql Modified Files: FromParser.java GroupByParser.java OrderByParser.java ParserHelper.java PathExpressionParser.java QueryTranslator.java SelectParser.java SelectPathExpressionParser.java WhereParser.java Log Message: reworked HQL, adding support for AS syntax in FROM clause non-collection associations may now be aliased Index: FromParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/FromParser.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** FromParser.java 23 Feb 2003 07:22:11 -0000 1.6 --- FromParser.java 28 Feb 2003 07:01:28 -0000 1.7 *************** *** 18,28 **** public class FromParser implements Parser { ! private boolean expectingIn; private boolean expectingJoin; private boolean expectingJoinToken; private boolean fromClass; private String joinType; private String name; ! private PathExpressionParser peParser = new PathExpressionParser(); private static final Set joinTokens = new HashSet(); --- 18,30 ---- public class FromParser implements Parser { ! //private boolean expectingIn; private boolean expectingJoin; + private boolean expectingAs; + private String entityName; private boolean expectingJoinToken; private boolean fromClass; private String joinType; private String name; ! private PathExpressionParser peParser = new FromPathExpressionParser(); private static final Set joinTokens = new HashSet(); *************** *** 39,51 **** fromClass = true; } ! else if (expectingIn) { if ( lcToken.equals("in") ) { ! expectingIn = false; } ! else { throw new QueryException("IN expected but found: " + token); ! } } ! else if (expectingJoin) { if ( token.equals(StringHelper.COMMA) ) { expectingJoin = false; --- 41,57 ---- fromClass = true; } ! else //if (expectingIn) { if ( lcToken.equals("in") ) { ! //expectingIn = false; } ! /*else { throw new QueryException("IN expected but found: " + token); ! }*/ ! //} ! else if (lcToken.equals("as") ) { ! if (!expectingAs) throw new QueryException("AS not expected here"); ! expectingAs=false; } ! else //if (expectingJoin) { if ( token.equals(StringHelper.COMMA) ) { expectingJoin = false; *************** *** 63,74 **** expectingJoinToken = true; } ! else { throw new QueryException(", or WHERE expected but found: " + token); ! } ! } ! else { ! if (name==null) { ! name = token; ! expectingIn=true; } else { --- 69,85 ---- expectingJoinToken = true; } ! /*else { throw new QueryException(", or WHERE expected but found: " + token); ! }*/ ! //} ! else //{ ! if ( name==null && token.indexOf(StringHelper.DOT)<0 ) { ! //expectingIn=true; ! if (entityName==null) { ! name = token; ! } ! else { ! q.setAliasName(token, entityName); ! } } else { *************** *** 78,89 **** ojf.addCrossJoin( p.getTableName(), name ); q.addFromType( name, p.getMappedClass(), ojf ); } else { ! peParser.presetCollectionName(name); ! ParserHelper.parse(peParser, token, ParserHelper.PATH_SEPERATORS, q); ! peParser.addFromCollection(q, name, JoinFragment.INNER_JOIN); ! } ! name = null; ! expectingJoin=true; } } --- 89,115 ---- ojf.addCrossJoin( p.getTableName(), name ); q.addFromType( name, p.getMappedClass(), ojf ); + name = null; + expectingJoin=true; } else { ! ParserHelper.parse(peParser, q.unalias(token), ParserHelper.PATH_SEPARATORS, q); ! if ( peParser.isCollectionValued() ) { ! entityName = peParser.addFromCollection(q); ! } ! else { ! entityName = peParser.addFromAssociation(q); ! ! } ! if (name!=null) { ! q.setAliasName(name, entityName); ! name = null; ! expectingJoin=true; ! entityName = null; ! } ! else { ! expectingAs = true; ! } ! ! //} } } *************** *** 91,95 **** public void start(QueryTranslator q) { ! expectingIn = false; expectingJoin = false; expectingJoinToken = false; --- 117,121 ---- public void start(QueryTranslator q) { ! //expectingIn = false; expectingJoin = false; expectingJoinToken = false; Index: GroupByParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/GroupByParser.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** GroupByParser.java 23 Feb 2003 01:32:20 -0000 1.4 --- GroupByParser.java 28 Feb 2003 07:01:28 -0000 1.5 *************** *** 25,31 **** if ( q.isName( StringHelper.root(token) ) ) { ! ParserHelper.parse(pathExpressionParser, token, ParserHelper.PATH_SEPERATORS, q); q.appendGroupByToken( pathExpressionParser.getWhereColumn() ); ! q.addJoin( pathExpressionParser.getName(), pathExpressionParser.getWhereJoin() ); } else { --- 25,31 ---- if ( q.isName( StringHelper.root(token) ) ) { ! ParserHelper.parse(pathExpressionParser, q.unalias(token), ParserHelper.PATH_SEPARATORS, q); q.appendGroupByToken( pathExpressionParser.getWhereColumn() ); ! pathExpressionParser.addFromAssociation(q); } else { Index: OrderByParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/OrderByParser.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** OrderByParser.java 23 Feb 2003 01:32:20 -0000 1.4 --- OrderByParser.java 28 Feb 2003 07:01:28 -0000 1.5 *************** *** 24,30 **** if ( q.isName( StringHelper.root(token) ) ) { ! ParserHelper.parse(pathExpressionParser, token, ParserHelper.PATH_SEPERATORS, q); q.appendOrderByToken( pathExpressionParser.getWhereColumn() ); ! q.addJoin( pathExpressionParser.getName(), pathExpressionParser.getWhereJoin() ); } else { --- 24,30 ---- if ( q.isName( StringHelper.root(token) ) ) { ! ParserHelper.parse(pathExpressionParser, q.unalias(token), ParserHelper.PATH_SEPARATORS, q); q.appendOrderByToken( pathExpressionParser.getWhereColumn() ); ! pathExpressionParser.addFromAssociation(q); } else { Index: ParserHelper.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/ParserHelper.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ParserHelper.java 5 Jan 2003 02:11:21 -0000 1.3 --- ParserHelper.java 28 Feb 2003 07:01:28 -0000 1.4 *************** *** 10,16 **** public static final String HQL_VARIABLE_PREFIX = ":"; ! public static final String HQL_SEPERATORS = " \n\r\f\t,()=<>&|+-=/*'^![]#~"; //NOTICE: no " or . since they are part of (compound) identifiers ! public static final String PATH_SEPERATORS = "."; public static final String whitespace = " \n\r\f\t"; --- 10,16 ---- public static final String HQL_VARIABLE_PREFIX = ":"; ! public static final String HQL_SEPARATORS = " \n\r\f\t,()=<>&|+-=/*'^![]#~"; //NOTICE: no " or . since they are part of (compound) identifiers ! public static final String PATH_SEPARATORS = "."; public static final String whitespace = " \n\r\f\t"; Index: PathExpressionParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/PathExpressionParser.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** PathExpressionParser.java 23 Feb 2003 07:22:11 -0000 1.8 --- PathExpressionParser.java 28 Feb 2003 07:01:28 -0000 1.9 *************** *** 39,43 **** protected String[] columns; protected String[] collectionElementColumns; ! private String collectionName; private String collectionRole; private String collectionTable; --- 39,43 ---- protected String[] columns; protected String[] collectionElementColumns; ! protected String collectionName; private String collectionRole; private String collectionTable; *************** *** 48,56 **** private boolean skippedId; private boolean continuation; ! private String presetCollectionName; ! void presetCollectionName(String name) { presetCollectionName=name; ! } private void addJoin(String table, String name, String[] rhsCols, QueryTranslator q) throws QueryException { --- 48,56 ---- private boolean skippedId; private boolean continuation; ! //private String presetCollectionName; ! /*void presetCollectionName(String name) { presetCollectionName=name; ! }*/ private void addJoin(String table, String name, String[] rhsCols, QueryTranslator q) throws QueryException { *************** *** 109,113 **** if (propertyType==null) { ! throw new QueryException("unresolved property: " + currentProperty); } --- 109,113 ---- if (propertyType==null) { ! throw new QueryException("unresolved property: " + path); } *************** *** 156,161 **** String[] colNames = p.getKeyColumnNames(); ! String name; ! if ( presetCollectionName==null || !p.isOneToMany() ) { name = q.createNameForCollection(collectionRole); } --- 156,161 ---- String[] colNames = p.getKeyColumnNames(); ! String name= q.createNameForCollection(collectionRole); ! /*if ( presetCollectionName==null || !p.isOneToMany() ) { name = q.createNameForCollection(collectionRole); } *************** *** 163,167 **** name = presetCollectionName; } ! presetCollectionName = null; addJoin( p.getQualifiedTableName(), name, colNames, q ); --- 163,167 ---- name = presetCollectionName; } ! presetCollectionName = null;*/ addJoin( p.getQualifiedTableName(), name, colNames, q ); *************** *** 176,181 **** else { if (token!=null) throw new QueryException( ! "dereferenced: " + ! currentProperty ); } --- 176,180 ---- else { if (token!=null) throw new QueryException( ! "dereferenced: " + path ); } *************** *** 208,212 **** } ! private Type getPropertyType(QueryTranslator q) throws QueryException { return q.getPersisterForName(currentName).getPropertyType( getPropertyPath() ); } --- 207,211 ---- } ! protected Type getPropertyType(QueryTranslator q) throws QueryException { return q.getPersisterForName(currentName).getPropertyType( getPropertyPath() ); } *************** *** 261,267 **** CollectionPersister memberPersister = q.getCollectionPersister(collectionRole); ! if ( !memberPersister.hasIndex() ) throw new QueryException("unindexed collection before []"); String[] indexCols = memberPersister.getIndexColumnNames(); ! if ( indexCols.length!=1 ) throw new QueryException("composite-index appears in []"); String[] keyCols = memberPersister.getKeyColumnNames(); --- 260,266 ---- CollectionPersister memberPersister = q.getCollectionPersister(collectionRole); ! if ( !memberPersister.hasIndex() ) throw new QueryException("unindexed collection before []: " + path); String[] indexCols = memberPersister.getIndexColumnNames(); ! if ( indexCols.length!=1 ) throw new QueryException("composite-index appears in []: " + path); String[] keyCols = memberPersister.getKeyColumnNames(); *************** *** 297,301 **** //important!! continuation=false; ! presetCollectionName = null; } --- 296,300 ---- //important!! continuation=false; ! //presetCollectionName = null; } *************** *** 333,337 **** public String getWhereColumn() throws QueryException { ! if (columns.length!=1) throw new QueryException("path expression ends in a composite value"); return columns[0]; } --- 332,336 ---- public String getWhereColumn() throws QueryException { ! if (columns.length!=1) throw new QueryException("path expression ends in a composite value: " + path); return columns[0]; } *************** *** 349,353 **** public String getCollectionSubquery() throws QueryException { ! return new StringBuffer( "SELECT " ) .append( StringHelper.join( ", ", collectionElementColumns ) ) --- 348,352 ---- public String getCollectionSubquery() throws QueryException { ! //TODO: refactor to .sql package return new StringBuffer( "SELECT " ) .append( StringHelper.join( ", ", collectionElementColumns ) ) *************** *** 366,392 **** } ! public void addFromCollection(QueryTranslator q, String elementName, int joinType) throws QueryException { ! if ( collectionElementType==null ) throw new QueryException("must specify 'elements' for collection valued property in from clause: " + elementName); if ( !collectionElementType.isEntityType() ) throw new QueryException( ! "collection of values in from clause: " + elementName ); EntityType elemType = (EntityType) collectionElementType; ! CollectionPersister persister = q.getCollectionPersister(collectionRole); if ( persister.isOneToMany() ) { ! //join.addCrossJoin( persister.getQualifiedTableName(), elementName ); } else { q.addCollection(collectionName, collectionRole); ! //join.addCrossJoin( persister.getQualifiedTableName(), collectionName ); ! Loadable p = q.getPersister( elemType.getPersistentClass() ); String[] keyColumnNames = p.getIdentifierColumnNames(); ! join.addJoin( p.getTableName(), elementName, collectionElementColumns, keyColumnNames, joinType); } ! q.addFromType( elementName, elemType.getPersistentClass(), join ); ! // q.addJoin(join); } --- 365,400 ---- } ! public String addFromAssociation(QueryTranslator q) { ! q.addJoin( getName(), join ); ! return currentName; ! } ! ! public String addFromCollection(QueryTranslator q) throws QueryException { ! if ( collectionElementType==null ) throw new QueryException( ! "must specify 'elements' for collection valued property in from clause: " + path ! ); if ( !collectionElementType.isEntityType() ) throw new QueryException( ! "collection of values in from clause: " + path ); EntityType elemType = (EntityType) collectionElementType; ! Class clazz = elemType.getPersistentClass(); CollectionPersister persister = q.getCollectionPersister(collectionRole); + final String elementName; if ( persister.isOneToMany() ) { ! elementName = collectionName; } else { q.addCollection(collectionName, collectionRole); ! Loadable p = q.getPersister(clazz); ! elementName = q.createNameFor(clazz); String[] keyColumnNames = p.getIdentifierColumnNames(); ! join.addJoin( p.getTableName(), elementName, collectionElementColumns, keyColumnNames, JoinFragment.INNER_JOIN); } ! q.addFromType(elementName, clazz, join); ! ! return elementName; } *************** *** 444,448 **** } else { ! throw new QueryException("expecting 'elements' or 'indices' after " + currentProperty + StringHelper.DOT); } } --- 452,456 ---- } else { ! throw new QueryException("expecting 'elements' or 'indices' after: " + path); } } Index: QueryTranslator.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/QueryTranslator.java,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** QueryTranslator.java 23 Feb 2003 07:22:11 -0000 1.12 --- QueryTranslator.java 28 Feb 2003 07:01:28 -0000 1.13 *************** *** 16,19 **** --- 16,20 ---- import java.util.StringTokenizer; + import net.sf.hibernate.AssertionFailure; import net.sf.hibernate.Hibernate; import net.sf.hibernate.HibernateException; *************** *** 29,37 **** import net.sf.hibernate.impl.ScrollableResultsImpl; import net.sf.hibernate.loader.Loader; - import net.sf.hibernate.loader.OuterJoinLoader; import net.sf.hibernate.persister.Loadable; import net.sf.hibernate.persister.Queryable; import net.sf.hibernate.sql.JoinFragment; import net.sf.hibernate.sql.QueryJoinFragment; import net.sf.hibernate.type.EntityType; import net.sf.hibernate.type.Type; --- 30,38 ---- import net.sf.hibernate.impl.ScrollableResultsImpl; import net.sf.hibernate.loader.Loader; import net.sf.hibernate.persister.Loadable; import net.sf.hibernate.persister.Queryable; import net.sf.hibernate.sql.JoinFragment; import net.sf.hibernate.sql.QueryJoinFragment; + import net.sf.hibernate.sql.QuerySelect; import net.sf.hibernate.type.EntityType; import net.sf.hibernate.type.Type; *************** *** 50,82 **** public class QueryTranslator extends Loader { - private static final HashSet dontSpace = new HashSet(); - static { - //dontSpace.add("'"); - dontSpace.add("."); - dontSpace.add("+"); - dontSpace.add("-"); - dontSpace.add("/"); - dontSpace.add("*"); - dontSpace.add("<"); - dontSpace.add(">"); - dontSpace.add("="); - dontSpace.add("#"); - dontSpace.add("~"); - dontSpace.add("|"); - dontSpace.add("&"); - dontSpace.add("<="); - dontSpace.add(">="); - dontSpace.add("=>"); - dontSpace.add("=<"); - dontSpace.add("!="); - dontSpace.add("<>"); - dontSpace.add("!#"); - dontSpace.add("!~"); - dontSpace.add("!<"); - dontSpace.add("!>"); - dontSpace.add(StringHelper.OPEN_PAREN); //for MySQL - dontSpace.add(StringHelper.CLOSE_PAREN); - } - private final Map typeMap = new HashMap(); private final Map collections = new HashMap(); --- 51,54 ---- *************** *** 85,88 **** --- 57,61 ---- private final List scalarTypes = new ArrayList(); private final Map namedParameters = new HashMap(); + private final HashMap aliasNames = new HashMap(); private final List scalarSelectTokens = new ArrayList(); *************** *** 103,110 **** private String queryString; private boolean distinct=false; - private String fromWhereString; - private String selectPropertiesString; - private String scalarSelectString; protected boolean compiled; private boolean hasScalars; --- 76,81 ---- private String queryString; private boolean distinct=false; protected boolean compiled; + private String sqlString; private boolean hasScalars; *************** *** 159,163 **** new PreprocessingParser(replacements), queryString, ! ParserHelper.HQL_SEPERATORS, this ); --- 130,134 ---- new PreprocessingParser(replacements), queryString, ! ParserHelper.HQL_SEPARATORS, this ); *************** *** 213,216 **** --- 184,202 ---- } + void setAliasName(String alias, String name) { + aliasNames.put(alias, name); + } + + String unalias(String path) { + String alias = StringHelper.root(path); + String name = (String) aliasNames.get(alias); + if (name!=null) { + return name + path.substring( alias.length() ); + } + else { + return path; + } + } + /** * Return the SQL for a <tt>find()</tt> style query. *************** *** 218,227 **** */ protected String getSQLString() { ! String result = new StringBuffer(50) ! .append(selectPropertiesString) ! .append(fromWhereString) ! .toString(); ! logQuery(queryString, result); ! return result; } --- 204,210 ---- */ protected String getSQLString() { ! if ( shallowQuery ) throw new AssertionFailure(""); ! logQuery(queryString, sqlString); ! return sqlString; } *************** *** 231,240 **** */ protected String getScalarSelectSQL() { ! String result= new StringBuffer(50) ! .append(scalarSelectString) ! .append(fromWhereString) ! .toString(); ! logQuery(queryString, result); ! return result; } --- 214,220 ---- */ protected String getScalarSelectSQL() { ! if ( !shallowQuery ) throw new AssertionFailure(""); ! logQuery(queryString, sqlString); ! return sqlString; } *************** *** 274,278 **** boolean isName(String name) { ! return typeMap.containsKey(name) || collections.containsKey(name) || ( superQuery!=null && superQuery.isName(name) --- 254,259 ---- boolean isName(String name) { ! return aliasNames.containsKey(name) || ! typeMap.containsKey(name) || collections.containsKey(name) || ( superQuery!=null && superQuery.isName(name) *************** *** 438,502 **** } int size = returnTypes.size(); ! ! String outerJoinedProperties=null; ! JoinFragment outerjoin=null; ! String selectProperties; ! String selectIdentifiers; ! if ( !isShallowQuery() && returnTypes.size()==1 && typeMap.size()==1 ) { ! OuterJoinLoader ojl = new OuterJoinLoader( factory.getDialect() ); ! String name = (String) returnTypes.get(0); ! if ( !isName(name) ) throw new QueryException("unknown type: " + name); ! Queryable persister = getPersisterForName(name); ! associations = ojl.walkTree(persister, name, factory); ! int joins=associations.size(); ! String[] ojsuffixes = new String[joins]; ! for ( int i=0; i<joins; i++ ) ojsuffixes[i] = Integer.toString(i) + StringHelper.UNDERSCORE; ! ojl.setSuffixes(ojsuffixes); ! selectProperties = persister.propertySelectFragment(name, StringHelper.EMPTY_STRING); ! selectIdentifiers = persister.identifierSelectFragment(name, StringHelper.EMPTY_STRING); ! outerJoinedProperties = ojl.selectString(associations); ! outerjoin = ojl.outerJoins(associations); ! persisters = new Queryable[joins+1]; ! suffixes = new String[joins+1]; ! persisters[joins] = persister; ! suffixes[joins] = StringHelper.EMPTY_STRING; ! for ( int i=0; i<joins; i++ ) { ! suffixes[i] = Integer.toString(i) + StringHelper.UNDERSCORE; ! persisters[i] = (Queryable) ( (OuterJoinLoader.OuterJoinableAssociation) associations.get(i) ).subpersister; //TODO: dont like the typecast to Queryable ! } ! } ! else { ! persisters = new Queryable[size]; ! suffixes = new String[size]; ! for ( int i=0; i<size; i++ ) { ! String name = (String) returnTypes.get(i); ! if ( !isName(name) ) throw new QueryException("unknown type: " + name); ! persisters[i] = getPersisterForName(name); ! suffixes[i] = (size==1) ? StringHelper.EMPTY_STRING : Integer.toString(i) + StringHelper.UNDERSCORE; ! } ! selectProperties = renderPropertiesSelect(); ! selectIdentifiers = renderIdentifierSelect(); } ! String selectPerhapsDistinct = "SELECT "; ! if (distinct) selectPerhapsDistinct += "DISTINCT "; ! String selectScalars = renderScalarSelect(); ! scalarSelectString = selectPerhapsDistinct + selectScalars; ! selectPropertiesString = selectPerhapsDistinct + selectIdentifiers + selectProperties; ! if ( outerJoinedProperties!=null && outerJoinedProperties.length() > 0 ) selectPropertiesString += ", " + outerJoinedProperties; ! //TODO: for some dialiects it would be appropriate to add the renderOrderByPropertiesSelect() to other select strings ! JoinFragment mergedJoins = mergeJoins(outerjoin); ! fromWhereString = " FROM" + mergedJoins.toFromFragmentString().substring(1) + renderWhereClause(mergedJoins); ! ! if ( scalarTypes.size()!=size ) { ! hasScalars=true; ! if (size!=0) selectPropertiesString += ", "; ! selectPropertiesString += selectScalars; ! } ! else { ! hasScalars=false; ! } int scalarSize = scalarTypes.size(); types = new Type[scalarSize]; for ( int i=0; i<scalarSize; i++ ) { --- 419,436 ---- } int size = returnTypes.size(); ! persisters = new Queryable[size]; ! suffixes = new String[size]; ! for ( int i=0; i<size; i++ ) { ! String name = (String) returnTypes.get(i); ! //if ( !isName(name) ) throw new QueryException("unknown type: " + name); ! persisters[i] = getPersisterForName(name); ! suffixes[i] = (size==1) ? StringHelper.EMPTY_STRING : Integer.toString(i) + StringHelper.UNDERSCORE; } ! String scalarSelect = renderScalarSelect(); //Must be done here because of side-effect! yuck... int scalarSize = scalarTypes.size(); + hasScalars = scalarTypes.size()!=size; + types = new Type[scalarSize]; for ( int i=0; i<scalarSize; i++ ) { *************** *** 504,507 **** --- 438,460 ---- } + QuerySelect sql = new QuerySelect(); + sql.setDistinct(distinct); + + if ( !shallowQuery ) { + renderIdentifierSelect(sql); + renderPropertiesSelect(sql); + } + + if ( hasScalars || shallowQuery ) sql.addSelectFragmentString(scalarSelect); + + //TODO: for some dialiects it would be appropriate to add the renderOrderByPropertiesSelect() to other select strings + mergeJoins( sql.getJoinFragment() ); + + sql.setWhereTokens( whereTokens.iterator() ); + + sql.setGroupByTokens( groupByTokens.iterator() ); + sql.setHavingTokens( havingTokens.iterator() ); + sql.setOrderByTokens( orderByTokens.iterator() ); + scalarColumnNames = generateColumnNames(types, factory); *************** *** 518,525 **** } } ! private String renderIdentifierSelect() { ! StringBuffer buf = new StringBuffer(40); int size = returnTypes.size(); --- 471,479 ---- } + sqlString = sql.toQueryString(); + } ! private void renderIdentifierSelect(QuerySelect sql) { int size = returnTypes.size(); *************** *** 527,538 **** String name = (String) returnTypes.get(k); String suffix = size==1 ? StringHelper.EMPTY_STRING : Integer.toString(k) + StringHelper.UNDERSCORE; ! buf.append( persisters[k].identifierSelectFragment(name, suffix) ); ! if ( k!=size-1 ) buf.append(StringHelper.COMMA_SPACE); } - return buf.toString(); } ! private String renderOrderByPropertiesSelect() { StringBuffer buf = new StringBuffer(10); --- 481,490 ---- String name = (String) returnTypes.get(k); String suffix = size==1 ? StringHelper.EMPTY_STRING : Integer.toString(k) + StringHelper.UNDERSCORE; ! sql.addSelectFragmentString( persisters[k].identifierSelectFragment(name, suffix) ); } } ! /*private String renderOrderByPropertiesSelect() { StringBuffer buf = new StringBuffer(10); *************** *** 548,562 **** return buf.toString(); ! } ! private String renderPropertiesSelect() { ! StringBuffer buf = new StringBuffer(40); int size = returnTypes.size(); for ( int k=0; k<size; k++ ) { String suffix = (size==1) ? StringHelper.EMPTY_STRING : Integer.toString(k) + StringHelper.UNDERSCORE; String name = (String) returnTypes.get(k) ; ! buf.append( persisters[k].propertySelectFragment(name, suffix) ); } - return buf.toString(); } --- 500,512 ---- return buf.toString(); ! }*/ ! private void renderPropertiesSelect(QuerySelect sql) { int size = returnTypes.size(); for ( int k=0; k<size; k++ ) { String suffix = (size==1) ? StringHelper.EMPTY_STRING : Integer.toString(k) + StringHelper.UNDERSCORE; String name = (String) returnTypes.get(k) ; ! sql.addSelectFragmentString( persisters[k].propertySelectFragment(name, suffix) ); } } *************** *** 630,635 **** } ! private JoinFragment mergeJoins(JoinFragment outerjoin) throws MappingException, QueryException { ! JoinFragment ojf = new QueryJoinFragment(); //classes --- 580,584 ---- } ! private JoinFragment mergeJoins(JoinFragment ojf) throws MappingException, QueryException { //classes *************** *** 650,657 **** } - // add any outerjoins required for association fetching - // TODO: (need to move inside loop, eventually) - if (outerjoin!=null) ojf.addFragment(outerjoin); - iter = collections.keySet().iterator(); while ( iter.hasNext() ) { --- 599,602 ---- *************** *** 663,727 **** } - private String renderWhereClause(JoinFragment mergedJoins) throws QueryException, MappingException { - - //SET UP IDENTIFIER SPACES. TODO: move elsewhere! - - Iterator iter = typeMap.keySet().iterator(); - while ( iter.hasNext() ) { - String name = (String) iter.next(); - Queryable p = getPersisterForName(name); - addIdentifierSpace( p.getIdentifierSpace() ); - } - - StringBuffer buf = new StringBuffer(120); - - StringBuffer whereTokenBuf = new StringBuffer(40); - appendTokens( whereTokenBuf, whereTokens.iterator() ); - - String part2 = mergedJoins.toWhereFragmentString(); - String part3 = whereTokenBuf.toString().trim(); - - boolean hasPart2 = part2.length()!=0; - boolean hasPart3 = part3.length()!=0; - - if (hasPart2 || hasPart3) buf.append(" WHERE "); - if (hasPart2) buf.append( part2.substring(5) ); //remove leading "and " - if (hasPart3) { - if (hasPart2) buf.append(" AND ("); - buf.append(part3); - if (hasPart2) buf.append(')'); - } - - if ( groupByTokens.size()!=0 ) { - //GROUP BY - buf.append(" GROUP BY "); - appendTokens( buf, groupByTokens.iterator() ); - } - - if ( havingTokens.size()!=0 ) { - buf.append(" HAVING "); - appendTokens( buf, havingTokens.iterator() ); - } - - if ( orderByTokens.size()!=0 ) { - //ORDER BY - buf.append(" ORDER BY "); - appendTokens( buf, orderByTokens.iterator() ); - } - - return buf.toString(); - } - - private void appendTokens(StringBuffer buf, Iterator iter) { - boolean lastSpaceable=true; - while ( iter.hasNext() ) { - String token = (String) iter.next(); - boolean spaceable = !dontSpace.contains(token); - if (spaceable && lastSpaceable) buf.append(' '); - lastSpaceable = spaceable; - buf.append(token); - } - } - public Set getQuerySpaces() { return identifierSpaces; --- 608,611 ---- *************** *** 789,793 **** } addFromType( elementName, elemType.getPersistentClass(), join ); - // addJoin(join); } --- 673,676 ---- Index: SelectParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/SelectParser.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** SelectParser.java 23 Feb 2003 01:32:20 -0000 1.5 --- SelectParser.java 28 Feb 2003 07:01:28 -0000 1.6 *************** *** 97,101 **** else if (aggregate) { if (!ready) throw new QueryException("( expected after aggregate function in SELECT"); ! ParserHelper.parse(aggregatePathExpressionParser, token, ParserHelper.PATH_SEPERATORS, q); if ( aggregatePathExpressionParser.isCollectionValued() ) { --- 97,101 ---- else if (aggregate) { if (!ready) throw new QueryException("( expected after aggregate function in SELECT"); ! ParserHelper.parse(aggregatePathExpressionParser, q.unalias(token), ParserHelper.PATH_SEPARATORS, q); if ( aggregatePathExpressionParser.isCollectionValued() ) { *************** *** 107,116 **** q.appendScalarSelectToken( aggregatePathExpressionParser.getWhereColumn() ); if (!count) q.addScalarType( aggregatePathExpressionParser.getWhereColumnType() ); ! q.addJoin( aggregatePathExpressionParser.getName(), aggregatePathExpressionParser.getWhereJoin() ); } else { if (!ready) throw new QueryException(", expected in SELECT"); ! ParserHelper.parse(pathExpressionParser, token, ParserHelper.PATH_SEPERATORS, q); if ( pathExpressionParser.isCollectionValued() ) { q.addCollection( --- 107,116 ---- q.appendScalarSelectToken( aggregatePathExpressionParser.getWhereColumn() ); if (!count) q.addScalarType( aggregatePathExpressionParser.getWhereColumnType() ); ! aggregatePathExpressionParser.addFromAssociation(q); } else { if (!ready) throw new QueryException(", expected in SELECT"); ! ParserHelper.parse(pathExpressionParser, q.unalias(token), ParserHelper.PATH_SEPARATORS, q); if ( pathExpressionParser.isCollectionValued() ) { q.addCollection( *************** *** 124,128 **** q.appendScalarSelectTokens( pathExpressionParser.getWhereColumns() ); q.addScalarType( pathExpressionParser.getWhereColumnType() ); ! q.addJoin( pathExpressionParser.getName(), pathExpressionParser.getWhereJoin() ); ready = false; --- 124,128 ---- q.appendScalarSelectTokens( pathExpressionParser.getWhereColumns() ); q.addScalarType( pathExpressionParser.getWhereColumnType() ); ! pathExpressionParser.addFromAssociation(q); ready = false; Index: SelectPathExpressionParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/SelectPathExpressionParser.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** SelectPathExpressionParser.java 5 Jan 2003 02:11:21 -0000 1.3 --- SelectPathExpressionParser.java 28 Feb 2003 07:01:28 -0000 1.4 *************** *** 12,20 **** token(null, q); } - /*if ( isCollectionValued() ) { - //if ( !q.supportsScalars() ) throw new QueryException("Can't use collection valued property in SELECT: " + currentProperty); - column = collectionElementColumn; - type = collectionElementType; - }*/ super.end(q); } --- 12,15 ---- *************** *** 23,27 **** throw new QueryException("expecting .elements or .indices after collection path expression in select"); } - public String getSelectName() { --- 18,21 ---- Index: WhereParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/WhereParser.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** WhereParser.java 23 Feb 2003 07:22:11 -0000 1.6 --- WhereParser.java 28 Feb 2003 07:01:28 -0000 1.7 *************** *** 354,357 **** --- 354,358 ---- private void doPathExpression(String token, QueryTranslator q) throws QueryException { + q.unalias(token); StringTokenizer tokens = new StringTokenizer(token, ".", true); pathExpressionParser.start(q); *************** *** 383,387 **** private void doToken(String token, QueryTranslator q) throws QueryException { if ( q.isName( StringHelper.root(token) ) ) { //path expression ! doPathExpression(token, q); } else if ( token.startsWith(ParserHelper.HQL_VARIABLE_PREFIX) ) { //named query parameter --- 384,388 ---- private void doToken(String token, QueryTranslator q) throws QueryException { if ( q.isName( StringHelper.root(token) ) ) { //path expression ! doPathExpression( q.unalias(token), q); } else if ( token.startsWith(ParserHelper.HQL_VARIABLE_PREFIX) ) { //named query parameter |