package org.quaere.alias;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
/**
* Provider implementation for object lists.
*
* @author Thomas Mueller
*/
public class ListProvider {
private static final WeakIdentityHashMap<Object, FieldMapping> ALIAS_MAP = new WeakIdentityHashMap<Object, FieldMapping>();
private ListProvider() {
}
public static final Object A = alias(), B = alias(), C = alias();
public static final Object D = alias(), E = alias(), F = alias();
public static final Object G = alias(), H = alias(), I = alias();
public static final Object J = alias(), K = alias(), L = alias();
public static final Object M = alias(), N = alias(), O = alias();
public static final Object P = alias(), Q = alias(), R = alias();
public static final Object S = alias(), T = alias(), U = alias();
public static final Object V = alias(), W = alias(), X = alias();
public static final Object Y = alias(), Z = alias();
private static Object alias() {
Object instance = new Object();
FieldMapping mapping = new FieldMapping(Object.class, null, instance);
addMapping(mapping, instance);
return instance;
}
private static <T> T alias(Class<T> clazz, T instance, T[] array) {
List<T> list = Arrays.asList(array);
FieldMapping<T> mapping = new FieldMapping<T>(clazz, list, instance);
addMapping(mapping, instance);
return instance;
}
public static Integer alias(int[] array) {
Integer[] a2 = new Integer[array.length];
for (int i = 0; i < array.length; i++) {
a2[i] = array[i];
}
return alias(Integer.class, new Integer(0), a2);
}
/**
* Create a new object alias for a given class.
* TODO: the class needs to have a public constructor without parameters
* TODO: each field in the class must be public
*/
public static <T> T alias(Class<T> clazz, List<T> list) {
T instance = Utils.createNew(clazz);
FieldMapping<T> mapping = new FieldMapping<T>(clazz, list, instance);
addMapping(mapping, instance);
return instance;
}
public static <T> T alias(Class<T> clazz) {
T instance = Utils.createNew(clazz);
FieldMapping<T> mapping = new FieldMapping<T>(clazz, null, instance);
addMapping(mapping, instance);
return instance;
}
public static String alias(String[] array) {
return alias(String.class, new String(), array);
}
public static <T> T template(Class<T> clazz) {
return alias(clazz, null);
}
public static Query<Integer> from(int[] array, Object alias) {
return from(Utils.toIntegerArray(array), alias);
}
public static Query<Double> from(double[] array, Object alias) {
return from(Utils.toDoubleArray(array), alias);
}
public static <T> Query<T> from(T[] array, Object alias) {
return from(Arrays.asList(array), alias);
}
public static <T> Query<T> from(List<T> list, Object alias) {
FieldMapping<T> mapping = new FieldMapping<T>(null, list, alias);
Selector selector = new Selector(alias, mapping, list);
return new Query<T>(selector);
}
public static <T> Query<T> from(T alias) {
FieldMapping mapping = getMapping(alias);
List<T> list = mapping.getList();
Selector selector = new Selector(alias, mapping, list);
return new Query<T>(selector);
}
// public static QueryJoin from(Object ... aliases) {
// ArrayList<Selector> selectors = new ArrayList<Selector>();
// for (Object alias : aliases) {
// FieldMapping mapping = null;
// synchronized (ALIAS_MAP) {
// mapping = ALIAS_MAP.get(alias);
// }
// if (mapping == null) {
// throw new Error("Not an alias: " + alias);
// }
// List list = mapping.getList();
// Selector s = new Selector(alias, mapping, list);
// selectors.add(s);
// }
// return new QueryJoin(selectors);
// }
public static Assign set(Object object, Object value) {
return new Assign(object, value);
}
public static Function length(Object o) {
return new Length(o);
}
public static Function index() {
return new Index();
}
public static Operation add(Object a, Object b) {
return new Operation(a, b, OperationType.PLUS);
}
public static Operation mod(Object a, Object b) {
return new Operation(a, b, OperationType.MODULO);
}
public static <T> Get get(T[] list, Object index) {
return new Get<T>(list, index);
}
public static Object upper(Object o) {
return new UpperLower(o, true);
}
public static Object lower(Object o) {
return new UpperLower(o, false);
}
public static Object charAt(Object o, Object index) {
return new CharAt(o, index);
}
public static <T> ConditionCompare<T> test(Object a, CompareType type, Object b) {
return new ConditionCompare<T>(a, b, type);
}
public static <T> ConditionCompare<T> equal(Object a, Object b) {
return test(a, CompareType.EQUAL, b);
}
static <T> FieldMapping<T> getMapping(Object template) {
FieldMapping mapping = null;
synchronized (ALIAS_MAP) {
mapping = ALIAS_MAP.get(template);
}
if (mapping == null) {
throw new Error("Not an template: " + template);
}
return mapping;
}
static void addMapping(FieldMapping mapping, Object instance) {
synchronized (ALIAS_MAP) {
ALIAS_MAP.put(instance, mapping);
}
}
public static <T> Order<T> desc(Object o) {
return new Order<T>(o, false, false, null);
}
public static <T> Order<T> desc(Object o, Comparator<T> comp) {
return new Order<T>(o, false, false, comp);
}
public static <T> Order<T> asc(Object o) {
return new Order<T>(o, true, true, null);
}
public static <T> Order<T> asc(Object o, Comparator<T> comp) {
return new Order<T>(o, true, true, comp);
}
}