From: <one...@us...> - 2002-11-22 07:03:10
|
Update of /cvsroot/hibernate/Hibernate/cirrus/hibernate/query In directory sc8-pr-cvs1:/tmp/cvs-serv5673/hibernate/query Modified Files: PathExpressionParser.java QueryTranslator.java SelectParser.java Log Message: experimental support for scalar selects in find() Index: PathExpressionParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/query/PathExpressionParser.java,v retrieving revision 1.64 retrieving revision 1.65 diff -C2 -d -r1.64 -r1.65 *** PathExpressionParser.java 22 Nov 2002 01:07:12 -0000 1.64 --- PathExpressionParser.java 22 Nov 2002 07:03:07 -0000 1.65 *************** *** 175,178 **** --- 175,179 ---- } + componentPath = null; } else if ( propertyType.isPersistentCollectionType() ) { *************** *** 188,205 **** currentName=null; currentProperty=null; } else { ! throw new QueryException( "dereferenced: " + ! currentProperty + ! " (possibly a scalar value appears in the select clause)" ); } - componentPath = null; } - //prepare the next LHS } } --- 189,204 ---- currentName=null; currentProperty=null; + componentPath = null; } else { ! if (token!=null) throw new QueryException( "dereferenced: " + ! currentProperty ); } } } } Index: QueryTranslator.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/query/QueryTranslator.java,v retrieving revision 1.45 retrieving revision 1.46 diff -C2 -d -r1.45 -r1.46 *** QueryTranslator.java 20 Nov 2002 07:06:44 -0000 1.45 --- QueryTranslator.java 22 Nov 2002 07:03:07 -0000 1.46 *************** *** 414,420 **** private String renderSQL() throws QueryException, MappingException { boolean isSubselect = superQuery!=null; ! if ( returnTypes.size()==0 ) { returnTypes = fromTypes; } --- 414,423 ---- 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; } *************** *** 430,436 **** } ! StringBuffer buf = new StringBuffer(20).append("SELECT "); ! ! if (distinct) buf.append("DISTINCT "); if ( scalarTypes.size()==0 ) { --- 433,437 ---- } ! StringBuffer buf = new StringBuffer(20); if ( scalarTypes.size()==0 ) { *************** *** 490,494 **** } ! scalarSelectString = buf.toString(); int ttsize = scalarTypes.size(); --- 491,496 ---- } ! String scalarSelectString = buf.toString(); ! this.scalarSelectString = selectPerhapsDistinct + scalarSelectString; //TODO: clean up int ttsize = scalarTypes.size(); *************** *** 501,507 **** // depending upon how the query is to return its results ! buf = new StringBuffer(40).append("SELECT "); ! ! if (distinct) buf.append("DISTINCT ");; for ( int k=0; k<size; k++ ) { --- 503,507 ---- // depending upon how the query is to return its results ! buf = new StringBuffer(40); for ( int k=0; k<size; k++ ) { *************** *** 512,516 **** } ! selectIDString = buf.toString(); for ( int k=0; k<size; k++ ) { --- 512,516 ---- } ! selectIDString = selectPerhapsDistinct + buf.toString(); for ( int k=0; k<size; k++ ) { *************** *** 520,524 **** } ! selectPropertiesString = buf.toString(); //FROM --- 520,527 ---- } ! selectPropertiesString = selectPerhapsDistinct + ! buf.append( (size==0) ? "" : ", " ) ! .append(scalarSelectString) ! .toString(); //FROM *************** *** 842,845 **** --- 845,860 ---- } return StringHelper.multiply( query, placeholders.iterator(), replacements.iterator() ); + } + + public static String[][] generateColumnNames(Type[] types, SessionFactoryImplementor f) throws MappingException { + String[][] names = new String[types.length][]; + for (int i=0; i<types.length; i++) { + int span = types[i].getColumnSpan(f); + names[i] = new String[span]; + for ( int j=0; j<span; j++ ) { + names[i][j] = scalarName(i, j); + } + } + return names; } } Index: SelectParser.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/query/SelectParser.java,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** SelectParser.java 19 Nov 2002 15:28:07 -0000 1.34 --- SelectParser.java 22 Nov 2002 07:03:07 -0000 1.35 *************** *** 81,87 **** else if ( aggregateFunctions.contains(lctoken) ) { if (!ready) throw new QueryException(", expected before aggregate function in SELECT: " + token); ! if ( !q.supportsScalars() ) throw new QueryException( "aggregate functions may only be used in the select clause of iterate() queries: " + token ! ); if ( lctoken.equals("count") ) { q.addScalarType(Hibernate.INTEGER); --- 81,87 ---- else if ( aggregateFunctions.contains(lctoken) ) { if (!ready) throw new QueryException(", expected before aggregate function in SELECT: " + token); ! /*if ( !q.supportsScalars() ) throw new QueryException( "aggregate functions may only be used in the select clause of iterate() queries: " + token ! );*/ if ( lctoken.equals("count") ) { q.addScalarType(Hibernate.INTEGER); |