From: <one...@us...> - 2002-11-24 06:30:15
|
Update of /cvsroot/hibernate/Hibernate/cirrus/hibernate/query In directory sc8-pr-cvs1:/tmp/cvs-serv11168/cirrus/hibernate/query Modified Files: QueryTranslator.java Log Message: QueryTranslator code cleanup Index: QueryTranslator.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/query/QueryTranslator.java,v retrieving revision 1.47 retrieving revision 1.48 diff -C2 -d -r1.47 -r1.48 *** QueryTranslator.java 23 Nov 2002 01:16:21 -0000 1.47 --- QueryTranslator.java 24 Nov 2002 06:30:12 -0000 1.48 *************** *** 89,92 **** --- 89,93 ---- private Queryable[] persisters; private Type[] types; + private String[][] scalarColumnNames; protected SessionFactoryImplementor factory; private Map replacements; *************** *** 95,99 **** private String queryString; private boolean distinct=false; ! private String sql; private String selectPropertiesString; private String selectIDString; --- 96,100 ---- private String queryString; private boolean distinct=false; ! private String fromWhereString; private String selectPropertiesString; private String selectIDString; *************** *** 149,153 **** try { ParserHelper.parse( new PreprocessingParser(replacements), queryString, ParserHelper.HQL_SEPERATORS, this ); ! sql = renderSQL(); } catch (QueryException qe) { --- 150,154 ---- try { ParserHelper.parse( new PreprocessingParser(replacements), queryString, ParserHelper.HQL_SEPERATORS, this ); ! renderSQL(); } catch (QueryException qe) { *************** *** 189,192 **** --- 190,197 ---- } + public String[][] getScalarColumnNames() { + return scalarColumnNames; + } + private void logQuery(String hql, String sql) { if ( log.isDebugEnabled() ) { *************** *** 203,207 **** String result = new StringBuffer(50) .append(selectPropertiesString) ! .append(sql) .toString(); logQuery(queryString, result); --- 208,212 ---- String result = new StringBuffer(50) .append(selectPropertiesString) ! .append(fromWhereString) .toString(); logQuery(queryString, result); *************** *** 215,219 **** String result = new StringBuffer(50) .append(selectIDString) ! .append(sql) .toString(); logQuery(queryString, result); --- 220,224 ---- String result = new StringBuffer(50) .append(selectIDString) ! .append(fromWhereString) .toString(); logQuery(queryString, result); *************** *** 227,231 **** String result= new StringBuffer(50) .append(scalarSelectString) ! .append(sql) .toString(); logQuery(queryString, result); --- 232,236 ---- String result= new StringBuffer(50) .append(scalarSelectString) ! .append(fromWhereString) .toString(); logQuery(queryString, result); *************** *** 416,431 **** } ! private String renderSQL() throws QueryException, MappingException { ! ! String selectPerhapsDistinct = "SELECT "; ! if (distinct) selectPerhapsDistinct += "DISTINCT "; ! ! boolean isSubselect = superQuery!=null; ! if ( returnTypes.size()==0 && scalarTypes.size()==0) { returnTypes = fromTypes; } - int size = returnTypes.size(); persisters = new Queryable[size]; suffixes = new String[size]; --- 421,432 ---- } ! private void renderSQL() throws QueryException, MappingException { ! if ( returnTypes.size()==0 && scalarTypes.size()==0 ) { ! //ie no select clause in HQL returnTypes = fromTypes; } int size = returnTypes.size(); + persisters = new Queryable[size]; suffixes = new String[size]; *************** *** 437,444 **** } StringBuffer buf = new StringBuffer(20); if ( scalarTypes.size()==0 ) { ! for ( int k=0; k<size; k++ ) { --- 438,531 ---- } + String selectPerhapsDistinct = "SELECT "; + if (distinct) selectPerhapsDistinct += "DISTINCT "; + String selectScalars = renderScalarSelect(); + scalarSelectString = selectPerhapsDistinct + selectScalars; + String selectIdentifiers = renderIdentifierSelect(); + selectIDString = selectPerhapsDistinct + selectIdentifiers + renderOrderByPropertiesSelect(); + selectPropertiesString = selectPerhapsDistinct + selectIdentifiers + renderPropertiesSelect(); + //TODO: for some dialiects it would be appropriate to add the renderOrderByPropertiesSelect() to other select strings + fromWhereString = renderFromClause() + renderWhereClause(); + + if ( scalarTypes.size()!=size ) { + if (size!=0) selectPropertiesString += ", "; + selectPropertiesString += selectScalars; + } + + int scalarSize = scalarTypes.size(); + types = new Type[scalarSize]; + for ( int i=0; i<scalarSize; i++ ) { + types[i] = (Type) scalarTypes.get(i); + } + + scalarColumnNames = generateColumnNames(types, factory); + + // initialize the Set of queried identifier spaces (ie. tables) + Iterator iter = collections.values().iterator(); + while ( iter.hasNext() ) { + CollectionPersister p = getCollectionPersister( (String) iter.next() ); + addIdentifierSpace( p.getQualifiedTableName() ); + } + iter = typeMap.keySet().iterator(); + while ( iter.hasNext() ) { + Queryable p = getPersisterForName( (String) iter.next() ); + addIdentifierSpace( p.getIdentifierSpace() ); + } + + } + + private String renderIdentifierSelect() { + StringBuffer buf = new StringBuffer(40); + int size = returnTypes.size(); + + for ( int k=0; k<size; k++ ) { + String name = (String) returnTypes.get(k); + String suffix = size==1 ? "" : Integer.toString(k); + buf.append( persisters[k].selectIdentifierString(name, suffix) ); + if ( k!=size-1 ) buf.append(", "); + } + + return buf.toString(); + } + + private String renderOrderByPropertiesSelect() { + StringBuffer buf = new StringBuffer(10); + + //add the columns we are ordering by to the select ID select clause + Iterator iter = orderByTokens.iterator(); + while ( iter.hasNext() ) { + String token = (String) iter.next(); + if ( token.lastIndexOf(".") > 0 ) { + //ie. it is of form "foo.bar", not of form "asc" or "desc" + buf.append(", ").append(token); + } + } + + 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) ? "" : Integer.toString(k); + String name = (String) returnTypes.get(k) ; + buf.append( persisters[k].propertySelectClauseFragment(name, suffix) ); + } + return buf.toString(); + } + + /** + * WARNING: side-effecty + */ + private String renderScalarSelect() { + + boolean isSubselect = superQuery!=null; + StringBuffer buf = new StringBuffer(20); if ( scalarTypes.size()==0 ) { ! //ie. no select clause ! int size = returnTypes.size(); for ( int k=0; k<size; k++ ) { *************** *** 458,462 **** } else { ! Iterator iter = scalarSelectTokens.iterator(); int c=0; --- 545,549 ---- } else { ! //there _was_ a select clause Iterator iter = scalarSelectTokens.iterator(); int c=0; *************** *** 495,557 **** } ! String scalarSelectString = buf.toString(); ! this.scalarSelectString = selectPerhapsDistinct + scalarSelectString; //TODO: clean up ! ! int ttsize = scalarTypes.size(); ! types = new Type[ttsize]; ! for ( int i=0; i<ttsize; i++ ) { ! types[i] = (Type) scalarTypes.get(i); ! } ! ! // The selectIDString or selectPropertiesString is used ! // depending upon how the query is to return its results ! ! buf = new StringBuffer(40); ! ! for ( int k=0; k<size; k++ ) { ! String name = (String) returnTypes.get(k); ! String suffix = size==1 ? "" : Integer.toString(k); ! buf.append( persisters[k].selectIdentifierString(name, suffix) ); ! if ( k!=size-1 ) buf.append(", "); ! } ! ! selectIDString = selectPerhapsDistinct + buf.toString(); ! ! for ( int k=0; k<size; k++ ) { ! String suffix = (size==1) ? "" : Integer.toString(k); ! String name = (String) returnTypes.get(k) ; ! buf.append( persisters[k].propertySelectClauseFragment(name, suffix) ); ! } ! ! selectPropertiesString = selectPerhapsDistinct + buf.toString(); ! if (ttsize!=size) { ! if (size!=0) selectPropertiesString += ", "; ! selectPropertiesString += scalarSelectString; ! } ! //FROM ! buf = new StringBuffer(120) .append(" FROM"); Iterator iter = typeMap.keySet().iterator(); - StringBuffer inClassWheres = new StringBuffer(50); - boolean first = true; while ( iter.hasNext() ) { ! String name = (String) iter.next(); Queryable p = getPersisterForName(name); - addIdentifierSpace( p.getIdentifierSpace() ); - - //render the " foo_table foo," bit buf.append(' ') .append( p.fromClauseFragment(name) ); if ( iter.hasNext() || collections.size()!=0 ) buf.append(','); - - //render the " and foo.class in ( 'Foo', 'Bar' ) " bit - String where = p.getQueryWhereClause(name); - if ( where!=null ) { - if (!first) inClassWheres.append(" and "); first=false; - inClassWheres.append(where); - } - } --- 582,600 ---- } ! return buf.toString(); ! } ! ! private String renderFromClause() throws QueryException, MappingException { //FROM ! StringBuffer buf = new StringBuffer(120) .append(" FROM"); Iterator iter = typeMap.keySet().iterator(); while ( iter.hasNext() ) { ! //render the " foo_table foo," bit String name = (String) iter.next(); Queryable p = getPersisterForName(name); buf.append(' ') .append( p.fromClauseFragment(name) ); if ( iter.hasNext() || collections.size()!=0 ) buf.append(','); } *************** *** 564,571 **** CollectionPersister p = getCollectionPersister(role); buf.append( p.getQualifiedTableName() ).append(' ').append(name); - addIdentifierSpace( p.getQualifiedTableName() ); if ( iter.hasNext() ) buf.append(','); } //WHERE StringBuffer whereTokenBuf = new StringBuffer(40); --- 607,638 ---- CollectionPersister p = getCollectionPersister(role); buf.append( p.getQualifiedTableName() ).append(' ').append(name); if ( iter.hasNext() ) buf.append(','); } + return buf.toString(); + } + + private String renderWhereClause() throws QueryException, MappingException { + + Iterator iter = typeMap.keySet().iterator(); + StringBuffer inClassWheres = new StringBuffer(50); + boolean first = true; + while ( iter.hasNext() ) { + + String name = (String) iter.next(); + Queryable p = getPersisterForName(name); + addIdentifierSpace( p.getIdentifierSpace() ); + + //render the " and foo.class in ( 'Foo', 'Bar' ) " bit + String where = p.getQueryWhereClause(name); + if ( where!=null ) { + if (!first) inClassWheres.append(" and "); first=false; + inClassWheres.append(where); + } + + } + + StringBuffer buf = new StringBuffer(120); + //WHERE StringBuffer whereTokenBuf = new StringBuffer(40); *************** *** 605,619 **** buf.append(" ORDER BY "); appendTokens( buf, orderByTokens.iterator() ); - - //add the columns we are ordering by to the select ID select clause - StringBuffer buf2 = new StringBuffer(selectIDString); - iter = orderByTokens.iterator(); - while ( iter.hasNext() ) { - String token; - if ( ( token = (String) iter.next() ).lastIndexOf(".") > 0 ) { - buf2.append(", ").append(token); - } - } - selectIDString = buf2.toString(); } --- 672,675 ---- *************** *** 744,748 **** ResultSet rs = st.executeQuery(); advance(rs, selection, session); ! return new IteratorImpl( rs, session, getReturnTypes() ); } catch (SQLException sqle) { --- 800,804 ---- ResultSet rs = st.executeQuery(); advance(rs, selection, session); ! return new IteratorImpl( rs, session, getReturnTypes(), getScalarColumnNames() ); } catch (SQLException sqle) { *************** *** 852,856 **** } ! public static String[][] generateColumnNames(Type[] types, SessionFactoryImplementor f) throws MappingException { String[][] names = new String[types.length][]; for (int i=0; i<types.length; i++) { --- 908,912 ---- } ! private static String[][] generateColumnNames(Type[] types, SessionFactoryImplementor f) throws MappingException { String[][] names = new String[types.length][]; for (int i=0; i<types.length; i++) { |