package org.teiid.query.sql.lang;
import java.util.List;
import org.teiid.common.buffer.TupleBuffer;
import org.teiid.core.util.EquivalenceUtil;
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.LanguageVisitor;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.visitor.SQLStringVisitor;
public class WithQueryCommand implements SubqueryContainer<QueryCommand> {
public static final String NO_INLINE = "no_inline"; //$NON-NLS-1$
public static final String MATERIALIZE = "materialize"; //$NON-NLS-1$
private GroupSymbol groupSymbol;
private List<ElementSymbol> columns;
private QueryCommand queryExpression;
private TupleBuffer tupleBuffer;
private boolean recursive;
private boolean noInline;
private boolean materialize;
public WithQueryCommand(GroupSymbol groupSymbol, List<ElementSymbol> columns, QueryCommand queryExpression) {
this.groupSymbol = groupSymbol;
this.columns = columns;
this.queryExpression = queryExpression;
}
public GroupSymbol getGroupSymbol() {
return groupSymbol;
}
public void setColumns(List<ElementSymbol> columns) {
this.columns = columns;
}
public List<ElementSymbol> getColumns() {
return columns;
}
@Override
public QueryCommand getCommand() {
return queryExpression;
}
public void setCommand(QueryCommand command) {
this.queryExpression = command;
}
@Override
public void acceptVisitor(LanguageVisitor visitor) {
visitor.visit(this);
}
@Override
public WithQueryCommand clone() {
WithQueryCommand clone = new WithQueryCommand(groupSymbol.clone(), LanguageObject.Util.deepClone(columns, ElementSymbol.class), null);
if (queryExpression != null) {
clone.queryExpression = (QueryCommand)queryExpression.clone();
}
clone.tupleBuffer = this.tupleBuffer;
clone.recursive = recursive;
clone.noInline = noInline;
clone.materialize = materialize;
return clone;
}
@Override
public int hashCode() {
return groupSymbol.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof WithQueryCommand)) {
return false;
}
WithQueryCommand other = (WithQueryCommand)obj;
return EquivalenceUtil.areEqual(groupSymbol, other.getGroupSymbol()) &&
EquivalenceUtil.areEqual(this.columns, other.getColumns()) &&
EquivalenceUtil.areEqual(this.queryExpression, other.queryExpression) &&
noInline == other.noInline &&
materialize == other.materialize &&
recursive == other.recursive;
}
@Override
public String toString() {
return SQLStringVisitor.getSQLString(this);
}
public void setTupleBuffer(TupleBuffer tupleBuffer) {
this.tupleBuffer = tupleBuffer;
}
public TupleBuffer getTupleBuffer() {
return tupleBuffer;
}
public void setGroupSymbol(GroupSymbol groupSymbol) {
this.groupSymbol = groupSymbol;
}
public boolean isRecursive() {
return recursive;
}
public void setRecursive(boolean recursive) {
this.recursive = recursive;
}
public boolean isNoInline() {
return noInline || materialize;
}
public void setNoInline(boolean noUnnest) {
this.noInline = noUnnest;
}
public boolean isMaterialize() {
return materialize;
}
public void setMaterialize(boolean materialize) {
this.materialize = materialize;
}
}