package org.quaere.alias;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public abstract class QueryBase implements RowVisitor {
protected int index;
protected Condition condition;
protected List<Order> order;
protected void addCondition(Condition condition) {
if (this.condition != null) {
this.condition = new ConditionAnd(this.condition, condition);
} else {
this.condition = condition;
}
}
protected void addOrder(Object... orderList) {
if (this.order == null) {
order = new ArrayList<Order>();
}
for (Object x : orderList) {
if (!(x instanceof Order)) {
x = new Order(x, true, true, null);
}
order.add((Order) x);
}
}
<T> List<T> order(List<Row<T>> list, boolean distinct) {
if (distinct) {
Set<Row<T>> set = new HashSet<Row<T>>(list);
list = new ArrayList<Row<T>>(set);
}
if (order != null) {
Collections.sort(list, new Comparator<Row <T>>() {
public int compare(Row<T> a, Row<T> b) {
for (int i = 0; i < order.size(); i++) {
int comp = order.get(i).compare(a.getOrderList()[i], b.getOrderList()[i]);
if (comp != 0) {
return comp;
}
}
return 0;
}
});
}
List<T> result = new ArrayList<T>();
for (Row<T> r : list) {
result.add(r.getData());
}
return result;
}
<T> void addRow(List<Row<T>> list, T item) {
Object[] o;
if (order == null) {
o = null;
} else {
int len = order.size();
o = new Object[len];
for (int i = 0; i < len; i++) {
o[i] = getValue(order.get(i).getItem());
}
}
Row<T> row = new Row<T>(item, o);
list.add(row);
}
protected <T> void initSelect() {
index = 0;
}
public int getIndex() {
return index;
}
protected <U, T> U createFromTemplate(Class<U> clazz, U template) {
U obj = Utils.createNew(clazz);
return obj;
}
abstract Object getValue(Object o);
}