|
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);
|