|
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++) {
|