package org.quaere.alias; import java.util.ArrayList; import java.util.List; public class QueryJoin extends QueryBase { private ArrayList<Selector> selectors; QueryJoin(ArrayList<Selector> list) { this.selectors = list; } public QueryJoin where(Condition condition) { addCondition(condition); return this; } public <U> List<U> select(final U template, final Assign ... assign) { return select(false, template, assign); } public <U> List<U> selectDistinct(final U template, final Assign ... assign) { return select(true, template, assign); } private <U> List<U> select(boolean distinct, final U template, final Assign ... assign) { initSelect(); final ArrayList<Row<U>> result = Utils.createArrayList(); final FieldMapping<U> mapping = ListProvider.getMapping(template); final Class<U> clazz = mapping.getObjectClass(); final QueryJoin me = this; for (int i = 0; i < selectors.size() - 1; i++) { Selector s = selectors.get(i); s.setJoin(selectors.get(i + 1)); } Selector main = selectors.get(0); main.iterate(new ListVisitor<U>() { public void visit() { if (condition == null || condition.test(me)) { U obj = createFromTemplate(clazz, template); for (Assign a : assign) { a.set(me, mapping, obj); } addRow(result, obj); } index++; } }); return order(result, distinct); } Object getValue(Object o) { if (o instanceof Function) { Function f = (Function) o; return f.getValue(this); } // TODO use a hash map for performance for (Selector s : selectors) { Object t = s.getCurrentItem(); Object result = s.getMapping().getValue(o, t); if (result != o) { return result; } } return o; } }