package net.sourceforge.mayfly.evaluation; import net.sourceforge.mayfly.datastore.Cell; import net.sourceforge.mayfly.evaluation.select.Evaluator; import net.sourceforge.mayfly.util.ImmutableList; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class GroupByKeys { private final ImmutableList<GroupItem> items; public GroupByKeys(GroupItem... items) { this(ImmutableList.fromArray(items)); } public GroupByKeys(ImmutableList<GroupItem> items) { this.items = items; } List expressions() { List columns = new ArrayList(); for (GroupItem item : items) { columns.add(item.expression()); } return Collections.unmodifiableList(columns); } public GroupByCells evaluate(ResultRow row, Evaluator evaluator) { List<Cell> keyCells = new ArrayList<Cell>(); for (GroupItem item : items) { keyCells.add(item.expression().evaluate(row, evaluator)); } return new GroupByCells(keyCells); } public int keyCount() { return items.size(); } public boolean containsExpresion(Expression target) { for (GroupItem item : items) { if (target.sameExpression(item.expression())) { return true; } } return false; } public GroupByKeys resolve(ResultRow row, Evaluator evaluator) { List<GroupItem> resolvedItems = new ArrayList<GroupItem>(); boolean changed = false; for (GroupItem item : items) { GroupItem resolved = item.resolve(row, evaluator); if (resolved != item) { changed = true; } resolvedItems.add(resolved); } if (changed) { return new GroupByKeys(new ImmutableList(resolvedItems)); } else { return this; } } public int size() { return items.size(); } public GroupItem get(int index) { return items.get(index); } }