/*
* @(#)JoinParser.java 2013-4-3 下午23:33:33
*
* Copyright (c) 2011-2013 Makersoft.org all rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
*
*/
package org.makersoft.orm.hql;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
/**
* Class description goes here.
*
* @version 2013-4-3 下午5:15:25
* @author Feng Kuok
*/
public class JoinParser extends Parser {
private static final Set<String> KEYWORDS = new HashSet<String>();
static {
KEYWORDS.add("join fetch");
KEYWORDS.add("left join fetch");
KEYWORDS.add("right join fetch");
KEYWORDS.add("inner join fetch");
KEYWORDS.add("outer join fetch");
}
private List<String> joinClauses = new ArrayList<String>();
public JoinParser(Set<String> columns, String alias) {
super(columns, alias);
}
@Override
public void parse(String joins) {
StringTokenizer tokens = new StringTokenizer(joins, HQL_SEPARATORS, true);
while (tokens.hasMoreElements()) {
joinClauses.add(this.token(tokens.nextToken()));
}
}
@Override
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 = root(token);
if (super.getColumns().contains(prefixName)) {
if (prefixName.equals(super.getAlias())) {
return token;
} else {
return super.getAlias() + "." + token;
}
}
return token;
}
public static void main(String[] args) {
Set<String> columns = new HashSet<String>();
columns.add("name");
columns.add("age");
Parser parser = new JoinParser(columns, "t");
parser.parse("student s on name = s.name");
System.out.println(parser.toHQL());
}
}