package sqlancer.sqlite3.ast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import sqlancer.common.ast.newast.Select;
import sqlancer.sqlite3.SQLite3Visitor;
import sqlancer.sqlite3.ast.SQLite3Expression.Join;
import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Column;
import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Column.SQLite3CollateSequence;
import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Table;
public class SQLite3Select extends SQLite3Expression
implements Select {
private SelectType fromOptions = SelectType.ALL;
private List fromList = Collections.emptyList();
private SQLite3Expression whereClause;
private List groupByClause = Collections.emptyList();
private SQLite3Expression limitClause;
private List orderByClause = Collections.emptyList();
private SQLite3Expression offsetClause;
private List fetchColumns = Collections.emptyList();
private List joinStatements = Collections.emptyList();
private SQLite3Expression havingClause;
public SQLite3Select() {
}
public SQLite3Select(SQLite3Select other) {
fromOptions = other.fromOptions;
fromList = new ArrayList<>(other.fromList);
whereClause = other.whereClause;
groupByClause = other.groupByClause;
limitClause = other.limitClause;
orderByClause = new ArrayList<>(other.orderByClause);
offsetClause = other.offsetClause;
fetchColumns = new ArrayList<>(other.fetchColumns);
joinStatements = new ArrayList<>();
for (Join j : other.joinStatements) {
joinStatements.add(new Join(j));
}
havingClause = other.havingClause;
}
public enum SelectType {
DISTINCT, ALL;
}
public void setSelectType(SelectType fromOptions) {
this.setFromOptions(fromOptions);
}
public SelectType getFromOptions() {
return fromOptions;
}
public void setFromOptions(SelectType fromOptions) {
this.fromOptions = fromOptions;
}
@Override
public List getFromList() {
return fromList;
}
@Override
public void setFromList(List fromList) {
this.fromList = fromList;
}
@Override
public SQLite3Expression getWhereClause() {
return whereClause;
}
@Override
public void setWhereClause(SQLite3Expression whereClause) {
this.whereClause = whereClause;
}
@Override
public void setGroupByClause(List groupByClause) {
this.groupByClause = groupByClause;
}
@Override
public List getGroupByClause() {
return groupByClause;
}
@Override
public void setLimitClause(SQLite3Expression limitClause) {
this.limitClause = limitClause;
}
@Override
public SQLite3Expression getLimitClause() {
return limitClause;
}
@Override
public List getOrderByClauses() {
return orderByClause;
}
@Override
public void setOrderByClauses(List orderBy) {
this.orderByClause = orderBy;
}
@Override
public void setOffsetClause(SQLite3Expression offsetClause) {
this.offsetClause = offsetClause;
}
@Override
public SQLite3Expression getOffsetClause() {
return offsetClause;
}
@Override
public void setFetchColumns(List fetchColumns) {
this.fetchColumns = fetchColumns;
}
@Override
public List getFetchColumns() {
return fetchColumns;
}
@Override
public void setJoinClauses(List joinStatements) {
this.joinStatements = joinStatements;
}
@Override
public List getJoinClauses() {
return joinStatements;
}
@Override
public SQLite3CollateSequence getExplicitCollateSequence() {
// TODO implement?
return null;
}
@Override
public void setHavingClause(SQLite3Expression havingClause) {
this.havingClause = havingClause;
}
@Override
public SQLite3Expression getHavingClause() {
assert orderByClause != null;
return havingClause;
}
@Override
public String asString() {
return SQLite3Visitor.asString(this);
}
}