From: <one...@us...> - 2003-04-08 09:50:02
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql In directory sc8-pr-cvs1:/tmp/cvs-serv11660/sf/hibernate/hql Modified Files: QueryTranslator.java SelectParser.java Log Message: * imporvements to CompositeUserType * cascades for <any> mappings * fixed some bugs withy collection Filter parameters * correct Type for avg(int) Index: QueryTranslator.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/QueryTranslator.java,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** QueryTranslator.java 3 Apr 2003 12:34:24 -0000 1.23 --- QueryTranslator.java 8 Apr 2003 09:49:27 -0000 1.24 *************** *** 701,705 **** } ! protected void bindNamedParameters(PreparedStatement ps, Map namedParams, SessionImplementor session) throws SQLException, HibernateException { if (namedParams!=null) { Iterator iter = namedParams.entrySet().iterator(); --- 701,705 ---- } ! protected void bindNamedParameters(PreparedStatement ps, Map namedParams, int start, SessionImplementor session) throws SQLException, HibernateException { if (namedParams!=null) { Iterator iter = namedParams.entrySet().iterator(); *************** *** 710,714 **** int[] locs = getNamedParameterLocs(name); for ( int i=0; i<locs.length; i++ ) { ! typedval.getType().nullSafeSet( ps, typedval.getValue(), locs[i], session ); } } --- 710,714 ---- int[] locs = getNamedParameterLocs(name); for ( int i=0; i<locs.length; i++ ) { ! typedval.getType().nullSafeSet( ps, typedval.getValue(), locs[i] + start, session ); } } *************** *** 718,724 **** public Iterator iterate(Object[] values, Type[] types, RowSelection selection, Map namedParams, SessionImplementor session) throws HibernateException, SQLException { ! PreparedStatement st = prepareQueryStatement( getSQLString(), values, types, selection, false, session ); try { - bindNamedParameters(st, namedParams, session); setMaxRows(st, selection); ResultSet rs = st.executeQuery(); --- 718,723 ---- public Iterator iterate(Object[] values, Type[] types, RowSelection selection, Map namedParams, SessionImplementor session) throws HibernateException, SQLException { ! PreparedStatement st = prepareQueryStatement( getSQLString(), values, types, namedParams, selection, false, session ); try { setMaxRows(st, selection); ResultSet rs = st.executeQuery(); *************** *** 735,741 **** public ScrollableResults scroll(Object[] values, Type[] types, RowSelection selection, Map namedParams, SessionImplementor session) throws HibernateException, SQLException { ! PreparedStatement st = prepareQueryStatement( getSQLString(), values, types, selection, true, session ); try { - bindNamedParameters(st, namedParams, session); setMaxRows(st, selection); ResultSet rs = st.executeQuery(); --- 734,739 ---- public ScrollableResults scroll(Object[] values, Type[] types, RowSelection selection, Map namedParams, SessionImplementor session) throws HibernateException, SQLException { ! PreparedStatement st = prepareQueryStatement( getSQLString(), values, types, namedParams, selection, true, session ); try { setMaxRows(st, selection); ResultSet rs = st.executeQuery(); Index: SelectParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/hql/SelectParser.java,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** SelectParser.java 6 Apr 2003 10:11:09 -0000 1.9 --- SelectParser.java 8 Apr 2003 09:49:29 -0000 1.10 *************** *** 2,10 **** --- 2,14 ---- package net.sf.hibernate.hql; + import java.sql.Types; import java.util.HashSet; import java.util.Set; + import net.sf.hibernate.AssertionFailure; import net.sf.hibernate.Hibernate; + import net.sf.hibernate.MappingException; import net.sf.hibernate.QueryException; + import net.sf.hibernate.type.Type; import net.sf.hibernate.util.StringHelper; *************** *** 32,35 **** --- 36,40 ---- private boolean aggregate; private boolean count; + private boolean avg; private boolean first; private boolean afterNew; *************** *** 104,110 **** if (!ready) throw new QueryException(", expected before aggregate function in SELECT: " + token); if ( lctoken.equals("count") ) { ! q.addSelectScalar(Hibernate.INTEGER); count = true; } aggregate = true; ready = false; --- 109,118 ---- if (!ready) throw new QueryException(", expected before aggregate function in SELECT: " + token); if ( lctoken.equals("count") ) { ! q.addSelectScalar(Hibernate.INTEGER); //must be handled differently 'cos of count(*) count = true; } + else if ( lctoken.equals("avg") ) { + avg = true; + } aggregate = true; ready = false; *************** *** 122,126 **** } q.appendScalarSelectToken( aggregatePathExpressionParser.getWhereColumn() ); ! if (!count) q.addSelectScalar( aggregatePathExpressionParser.getWhereColumnType() ); aggregatePathExpressionParser.addAssociation(q); } --- 130,134 ---- } q.appendScalarSelectToken( aggregatePathExpressionParser.getWhereColumn() ); ! if (!count) q.addSelectScalar( aggregateType( aggregatePathExpressionParser.getWhereColumnType(), q ) ); aggregatePathExpressionParser.addAssociation(q); } *************** *** 146,149 **** --- 154,184 ---- } + public Type aggregateType(Type type, QueryTranslator q) throws QueryException { + if (count) { + throw new AssertionFailure("count(*) must be handled differently"); + } + else if (avg) { + int[] sqlTypes; + try { + sqlTypes = type.sqlTypes(q.factory); + } + catch (MappingException me) { + throw new QueryException(me); + } + if (sqlTypes.length!=1) throw new QueryException("multi-column type in avg()"); + int sqlType = sqlTypes[0]; + if ( sqlType==Types.INTEGER || sqlType==Types.BIGINT || sqlType==Types.TINYINT ) { + return Hibernate.FLOAT; + } + else { + return type; + } + + } + else { + return type; + } + } + public void start(QueryTranslator q) { ready=true; *************** *** 151,154 **** --- 186,190 ---- aggregate=false; count = false; + avg = false; afterNew = false; holderClass = null; |