package net.sourceforge.mayfly.evaluation.from; import net.sourceforge.mayfly.MayflyInternalException; import net.sourceforge.mayfly.Options; import net.sourceforge.mayfly.datastore.Columns; import net.sourceforge.mayfly.datastore.Row; import net.sourceforge.mayfly.datastore.Rows; import net.sourceforge.mayfly.datastore.TableData; import net.sourceforge.mayfly.evaluation.ResultRow; import net.sourceforge.mayfly.evaluation.ResultRows; import net.sourceforge.mayfly.evaluation.expression.SingleColumn; import net.sourceforge.mayfly.evaluation.select.Evaluator; import net.sourceforge.mayfly.parser.Location; import net.sourceforge.mayfly.util.CaseInsensitiveString; import net.sourceforge.mayfly.util.ImmutableList; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class FromTable extends FromElement { public final String tableName; public final String alias; public final Location location = Location.UNKNOWN; public FromTable(String tableName) { this(tableName, tableName); } public FromTable(String tableName, String alias) { this.tableName = tableName; this.alias = alias; if (alias == null) { throw new MayflyInternalException("need a table alias"); } } @Override public ResultRows tableContents(Evaluator evaluator) { TableData table = evaluator.table(this); return applyAlias(table.rows(), table.columns(), evaluator.options()); } @Override public ResultRow dummyRow(Evaluator evaluator) { TableData table = evaluator.table(this); return applyAlias(table.dummyRow(), table.columns(), evaluator.options()); } private ResultRows applyAlias(Rows storedRows, Columns tableColumns, Options options) { List rows = new ArrayList(); for (Iterator iter = storedRows.iterator(); iter.hasNext();) { Row row = (Row) iter.next(); rows.add(applyAlias(row, tableColumns, options)); } return new ResultRows(new ImmutableList(rows)); } private ResultRow applyAlias(Row row, Columns tableColumns, Options options) { ResultRow result = new ResultRow(); for (CaseInsensitiveString column : tableColumns.asCaseNames()) { result = result.with( new SingleColumn(alias, column.getString(), options), row.cell(column)); } return result; } }