package jeql.engine.query;
import java.util.List;
import jeql.api.row.Row;
import jeql.api.row.RowIterator;
import jeql.api.row.RowList;
import jeql.api.row.RowSchema;
import jeql.syntax.ParseTreeNode;
public class SplitRowList
implements RowList
{
private RowList rowStr;
private ParseTreeNode splitExpr;
private QueryScope scope;
public SplitRowList(RowList rowStr, ParseTreeNode splitExpr, QueryScope scope)
{
this.rowStr = rowStr;
this.splitExpr = splitExpr;
this.scope = scope;
}
public RowSchema getSchema() { return rowStr.getSchema(); }
public RowIterator iterator()
{
return new SplitRowIterator(rowStr, splitExpr, scope);
}
private static class SplitRowIterator implements RowIterator {
private RowSchema schema;
private ParseTreeNode splitExpr;
private QueryScope scope;
private RowIterator it;
private Row currRow;
private List splitValues = null;
private int splitIndex = 0;
public SplitRowIterator(RowList rowList,
ParseTreeNode splitExpr, QueryScope scope) {
schema = rowList.getSchema();
this.splitExpr = splitExpr;
this.scope = scope;
it = rowList.iterator();
}
public RowSchema getSchema() {
return schema;
}
public Row next()
{
if (splitValues != null
&& splitIndex < splitValues.size()) {
return nextSplitRow();
}
splitValues = null;
splitIndex = 0;
// get new row with non-null splitValues
while (true) {
currRow = it.next();
if (currRow == null)
return null;
((QueryScope) scope).setRow(currRow);
splitValues = ((List) splitExpr.eval(scope));
//if (splitValues != null) {
if (splitValues != null && ! splitValues.isEmpty()) {
return nextSplitRow();
}
}
}
private Row nextSplitRow()
{
Row splitRow = new SplitRow(currRow,
splitValues.get(splitIndex),
splitIndex);
splitIndex++;
return splitRow;
}
}
}