package org.raidenjpa.query.parser; import java.util.ArrayList; import java.util.List; import org.raidenjpa.util.BadSmell; import org.raidenjpa.util.FixMe; public class QueryParser { private QueryWords words; private SelectClause select; private FromClause from; private WhereClause where; private List<JoinClause> joins = new ArrayList<JoinClause>(); private GroupByClause groupBy; private OrderByClause orderBy; public QueryParser(String jpql) { this.words = new QueryWords(jpql); prepareSelect(); prepareFrom(); prepareJoins(); prepareWhere(); prepareGroupBy(); prepareOrderBy(); } private void prepareOrderBy() { orderBy = new OrderByClause(); orderBy.parse(words); } @BadSmell("Call parse in groupBy") private void prepareGroupBy() { if(!words.hasMoreWord() || !"GROUP".equalsIgnoreCase(words.current())) { return; } groupBy = new GroupByClause(words); } private void prepareJoins() { if (!words.hasMoreWord()) { return; } while(words.hasMoreJoin()) { JoinClause join = new JoinClause(); join.parse(words); if (!join.isFetch()) { joins.add(join); } } } private void prepareSelect() { select = new SelectClause(); select.parse(words); } @FixMe("Beware about more than one from without select") private void prepareFrom() { from = new FromClause(); from.parse(words); if (select.getElements().isEmpty()) { select.addElement(from.getAliasName(0)); } } private void prepareWhere() { where = new WhereClause(); where.parse(words); } public SelectClause getSelect() { return select; } public FromClause getFrom() { return from; } public WhereClause getWhere() { return where; } public List<JoinClause> getJoins() { return joins; } public GroupByClause getGroupBy() { return groupBy; } public OrderByClause getOrderBy() { return orderBy; } public QueryWords getWords() { return words; } }