package net.sourceforge.mayfly.evaluation;
import net.sourceforge.mayfly.MayflyInternalException;
import net.sourceforge.mayfly.evaluation.condition.Condition;
import net.sourceforge.mayfly.evaluation.select.Evaluator;
import net.sourceforge.mayfly.util.ImmutableList;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @internal
* Rows that we might return as part of evaluating.
* That is, they may have aliases applied, or
* various things other than just a cell in
* each column.
*/
public class ResultRows implements Iterable<ResultRow> {
private final ImmutableList<ResultRow> rows;
public ResultRows(ResultRow singleRow) {
this(ImmutableList.singleton(singleRow));
}
public ResultRows() {
this(new ImmutableList());
}
public ResultRows(ImmutableList<ResultRow> rows) {
this.rows = rows;
}
public int rowCount() {
return rows.size();
}
public ResultRow row(int index) {
return rows.get(index);
}
public Iterator<ResultRow> iterator() {
return rows.iterator();
}
public ImmutableList asList() {
return rows;
}
public ResultRows with(ResultRow row) {
return new ResultRows(rows.with(row));
}
public ResultRows select(Condition condition) {
return select(condition, Evaluator.NO_SUBSELECT_NEEDED);
}
public ResultRows select(Condition condition, Evaluator evaluator) {
ResultRows selected = new ResultRows();
for (ResultRow row : rows) {
if (condition.evaluate(row, evaluator)) {
selected = selected.with(row);
}
}
return selected;
}
public ResultRows join(ResultRows right) {
List result = new ArrayList();
for (Iterator leftIterator = iterator(); leftIterator.hasNext();) {
ResultRow leftRow = (ResultRow) leftIterator.next();
for (Iterator rightIterator = right.iterator(); rightIterator.hasNext();) {
ResultRow rightRow = (ResultRow) rightIterator.next();
result.add(leftRow.combine(rightRow));
}
}
return new ResultRows(new ImmutableList(result));
}
public ResultRow singleRow() {
if (rowCount() != 1) {
throw new MayflyInternalException("expected one row, got " + rowCount());
}
return row(0);
}
public String debugString() {
StringBuilder out = new StringBuilder();
out.append("row count = " + rowCount() + "\n");
for (ResultRow row : rows) {
out.append(row.debugString());
}
return out.toString();
}
}