Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/sql
In directory sc8-pr-cvs1:/tmp/cvs-serv27226/sf/hibernate/sql
Added Files:
QuerySelect.java
Log Message:
reworked HQL, adding support for AS syntax in FROM clause
non-collection associations may now be aliased
--- NEW FILE: QuerySelect.java ---
package net.sf.hibernate.sql;
import java.util.HashSet;
import java.util.Iterator;
import net.sf.hibernate.util.StringHelper;
public class QuerySelect {
private JoinFragment joins = new QueryJoinFragment();
private StringBuffer select = new StringBuffer();
private StringBuffer where = new StringBuffer();
private StringBuffer groupBy = new StringBuffer();
private StringBuffer orderBy = new StringBuffer();
private StringBuffer having = new StringBuffer();
private boolean distinct=false;
private static final HashSet dontSpace = new HashSet();
static {
//dontSpace.add("'");
dontSpace.add(".");
dontSpace.add("+");
dontSpace.add("-");
dontSpace.add("/");
dontSpace.add("*");
dontSpace.add("<");
dontSpace.add(">");
dontSpace.add("=");
dontSpace.add("#");
dontSpace.add("~");
dontSpace.add("|");
dontSpace.add("&");
dontSpace.add("<=");
dontSpace.add(">=");
dontSpace.add("=>");
dontSpace.add("=<");
dontSpace.add("!=");
dontSpace.add("<>");
dontSpace.add("!#");
dontSpace.add("!~");
dontSpace.add("!<");
dontSpace.add("!>");
dontSpace.add(StringHelper.OPEN_PAREN); //for MySQL
dontSpace.add(StringHelper.CLOSE_PAREN);
}
public JoinFragment getJoinFragment() {
return joins;
}
public void addSelectFragmentString(String fragment) {
if ( fragment.length()>0 && fragment.charAt(0)==',' ) fragment = fragment.substring(1);
fragment = fragment.trim();
if ( fragment.length()>0 ) {
if ( select.length()>0 ) select.append(StringHelper.COMMA_SPACE);
select.append(fragment);
}
}
public void addSelectColumn(String columnName, String alias) {
addSelectFragmentString(columnName + ' ' + alias);
}
public void setDistinct(boolean distinct) {
this.distinct = distinct;
}
public void setWhereTokens(Iterator tokens) {
//if ( conjunctiveWhere.length()>0 ) conjunctiveWhere.append(" and ");
appendTokens(where, tokens);
}
public void setGroupByTokens(Iterator tokens) {
//if ( groupBy.length()>0 ) groupBy.append(" and ");
appendTokens(groupBy, tokens);
}
public void setOrderByTokens(Iterator tokens) {
//if ( orderBy.length()>0 ) orderBy.append(" and ");
appendTokens(orderBy, tokens);
}
public void setHavingTokens(Iterator tokens) {
//if ( having.length()>0 ) having.append(" and ");
appendTokens(having, tokens);
}
public String toQueryString() {
StringBuffer buf = new StringBuffer(50)
.append("select ");
if (distinct) buf.append("distinct ");
buf.append(select)
.append(" from")
.append( joins.toFromFragmentString().substring(1) );
String part1 = joins.toWhereFragmentString().trim();
String part2 = where.toString().trim();
boolean hasPart1 = part1.length() > 0;
boolean hasPart2 = part2.length() > 0;
if (hasPart1 || hasPart2) buf.append(" where ");
if (hasPart1) buf.append( part1.substring(4) );
if (hasPart2) {
if (hasPart1) buf.append(" and (");
buf.append(part2);
if (hasPart1) buf.append(")");
}
if ( groupBy.length() > 0 ) buf.append(" group by ").append(groupBy);
if ( having.length() > 0 ) buf.append(" having ").append(having);
if ( orderBy.length() > 0 ) buf.append(" order by ").append(orderBy);
return buf.toString();
}
private void appendTokens(StringBuffer buf, Iterator iter) {
boolean lastSpaceable=true;
while ( iter.hasNext() ) {
String token = (String) iter.next();
boolean spaceable = !dontSpace.contains(token);
if (spaceable && lastSpaceable) buf.append(' ');
lastSpaceable = spaceable;
buf.append(token);
}
}
}
|