/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.query.sql.lang; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.teiid.core.util.EquivalenceUtil; import org.teiid.core.util.HashCodeUtil; import org.teiid.query.sql.LanguageObject; import org.teiid.query.sql.LanguageVisitor; import org.teiid.query.sql.symbol.GroupSymbol; import org.teiid.query.sql.visitor.SQLStringVisitor; /** * Represents a FROM clause in a SELECT query. The from clause holds a set of * FROM subclauses. Each FROM subclause can be either a single group * ({@link UnaryFromClause}) or a join predicate ({@link JoinPredicate}). */ public class From implements LanguageObject { private List<FromClause> clauses; /** * Constructs a default instance of this class. */ public From() { clauses = new ArrayList<FromClause>(); } /** * Constructs an instance of this class from an ordered set of from clauses * @param parameters The ordered list of from clauses */ public From( List<? extends FromClause> parameters ) { clauses = new ArrayList<FromClause>( parameters ); } // ========================================================================= // M E T H O D S // ========================================================================= /** * Add a clause to the FROM * @param clause Add a clause to the FROM */ public void addClause(FromClause clause) { this.clauses.add(clause); } /** * Add clauses to the FROM * @param clauses Collection of {@link FromClause}s */ public void addClauses(Collection<? extends FromClause> toAdd) { this.clauses.addAll(toAdd); } /** * Get all the clauses in FROM * @return List of {@link FromClause} */ public List<FromClause> getClauses() { return this.clauses; } /** * Set all the clauses * @param clauses List of {@link FromClause} */ public void setClauses(List<FromClause> clauses) { this.clauses = clauses; } /** * Adds a new group to the list (it will be wrapped in a UnaryFromClause) * @param group Group to add */ public void addGroup( GroupSymbol group ) { if( group != null ) { clauses.add(new UnaryFromClause(group)); } } /** * Adds a new collection of groups to the list * @param groups Collection of {@link GroupSymbol} */ public void addGroups( Collection<GroupSymbol> groups ) { if(groups != null) { for (GroupSymbol groupSymbol : groups) { clauses.add(new UnaryFromClause(groupSymbol)); } } } /** * Returns an ordered list of the groups in all sub-clauses. * @return List of {@link GroupSymbol} */ public List<GroupSymbol> getGroups() { List<GroupSymbol> groups = new ArrayList<GroupSymbol>(); if(clauses != null) { for(int i=0; i<clauses.size(); i++) { FromClause clause = clauses.get(i); clause.collectGroups(groups); } } return groups; } /** * Checks if a group is in the From * @param group Group to check for * @return True if the From contains the group */ public boolean containsGroup( GroupSymbol group ) { return getGroups().contains(group); } public void acceptVisitor(LanguageVisitor visitor) { visitor.visit(this); } // ========================================================================= // O V E R R I D D E N O B J E C T M E T H O D S // ========================================================================= /** * Return copy of this From clause. */ public Object clone() { return new From(LanguageObject.Util.deepClone(clauses, FromClause.class)); } /** * Compare two Froms for equality. Order is not important in the from, so * this is a set comparison. */ public boolean equals(Object obj) { if(obj == this) { return true; } if(!(obj instanceof From)) { return false; } return EquivalenceUtil.areEqual(getClauses(), ((From)obj).getClauses()); } /** * Get hashcode for From. WARNING: The hash code relies on the variables * in the select, so changing the variables will change the hash code, causing * a select to be lost in a hash structure. Do not hash a From if you plan * to change it. */ public int hashCode() { return HashCodeUtil.hashCode(0, getGroups()); } /** * Returns a string representation of an instance of this class. * @return String representation of object */ public String toString() { return SQLStringVisitor.getSQLString(this); } }