From: <one...@us...> - 2003-02-28 07:01:31
|
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); } } } |