package net.csdn.jpa.hql; import java.util.*; import static net.csdn.common.collections.WowCollections.join; import static net.csdn.common.collections.WowCollections.newHashSet; /** * User: WilliamZhu * Date: 12-7-23 * Time: 下午1:25 */ public class WowJoinParser { public static final String HQL_JOIN_SEPARATORS = WowWhereParser.HQL_SEPARATORS; private Set<String> keywords = newHashSet("join fetch", "left join fetch", "right join fetch", "inner join fetch", "outer join fetch"); private Set columns = new HashSet<String>(); private String alias = ""; private List<String> joinClauses = new ArrayList<String>(); public WowJoinParser(Set columns, String alias) { this.columns = columns; this.alias = alias; } public void parse(String joins) { StringTokenizer tokens = new StringTokenizer(joins, HQL_JOIN_SEPARATORS, true); while (tokens.hasMoreElements()) { joinClauses.add(this.token(tokens.nextToken())); } } public String toHql() { return join(joinClauses); } private String token(String token) { String lcToken = token.toLowerCase().trim(); if (lcToken.equals("left") || lcToken.equals("right") || lcToken.equals("inner") || lcToken.equals("outer") || lcToken.equals("inner") ) { return token; } if (lcToken.equals("join")) { return token + " fetch"; } String prefixName = WowWhereParser.root(token); if (columns.contains(prefixName)) { if (prefixName.equals(alias)) { return token; } else { return alias + "." + token; } } return token; } }