package com.github.davidmoten.rx.jdbc.tuple;
import static com.github.davidmoten.rx.jdbc.Util.mapObject;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.github.davidmoten.rx.jdbc.ResultSetMapper;
import com.github.davidmoten.rx.jdbc.exceptions.SQLRuntimeException;
/**
* Utility methods for tuples.
*/
public final class Tuples {
/**
* Private constructor to prevent instantiation.
*/
private Tuples() {
// prevent instantiation.
}
public static <T> ResultSetMapper<T> single(final Class<T> cls) {
return new ResultSetMapper<T>() {
@SuppressWarnings("unchecked")
@Override
public T call(ResultSet rs) {
return (T) mapObject(rs, cls, 1);
}
};
}
public static <T1, T2> ResultSetMapper<Tuple2<T1, T2>> tuple(final Class<T1> cls1,
final Class<T2> cls2) {
return new ResultSetMapper<Tuple2<T1, T2>>() {
@SuppressWarnings("unchecked")
@Override
public Tuple2<T1, T2> call(ResultSet rs) {
return new Tuple2<T1, T2>((T1) mapObject(rs, cls1, 1), (T2) mapObject(rs, cls2, 2));
}
};
}
public static <T1, T2, T3> ResultSetMapper<Tuple3<T1, T2, T3>> tuple(final Class<T1> cls1,
final Class<T2> cls2, final Class<T3> cls3) {
return new ResultSetMapper<Tuple3<T1, T2, T3>>() {
@SuppressWarnings("unchecked")
@Override
public Tuple3<T1, T2, T3> call(ResultSet rs) {
return new Tuple3<T1, T2, T3>((T1) mapObject(rs, cls1, 1),
(T2) mapObject(rs, cls2, 2), (T3) mapObject(rs, cls3, 3));
}
};
}
public static <T1, T2, T3, T4> ResultSetMapper<Tuple4<T1, T2, T3, T4>> tuple(
final Class<T1> cls1, final Class<T2> cls2, final Class<T3> cls3,
final Class<T4> cls4) {
return new ResultSetMapper<Tuple4<T1, T2, T3, T4>>() {
@SuppressWarnings("unchecked")
@Override
public Tuple4<T1, T2, T3, T4> call(ResultSet rs) {
return new Tuple4<T1, T2, T3, T4>((T1) mapObject(rs, cls1, 1),
(T2) mapObject(rs, cls2, 2), (T3) mapObject(rs, cls3, 3),
(T4) mapObject(rs, cls4, 4));
}
};
}
public static <T1, T2, T3, T4, T5> ResultSetMapper<Tuple5<T1, T2, T3, T4, T5>> tuple(
final Class<T1> cls1, final Class<T2> cls2, final Class<T3> cls3, final Class<T4> cls4,
final Class<T5> cls5) {
return new ResultSetMapper<Tuple5<T1, T2, T3, T4, T5>>() {
@SuppressWarnings("unchecked")
@Override
public Tuple5<T1, T2, T3, T4, T5> call(ResultSet rs) {
return new Tuple5<T1, T2, T3, T4, T5>((T1) mapObject(rs, cls1, 1),
(T2) mapObject(rs, cls2, 2), (T3) mapObject(rs, cls3, 3),
(T4) mapObject(rs, cls4, 4), (T5) mapObject(rs, cls5, 5));
}
};
}
public static <T1, T2, T3, T4, T5, T6> ResultSetMapper<Tuple6<T1, T2, T3, T4, T5, T6>> tuple(
final Class<T1> cls1, final Class<T2> cls2, final Class<T3> cls3, final Class<T4> cls4,
final Class<T5> cls5, final Class<T6> cls6) {
return new ResultSetMapper<Tuple6<T1, T2, T3, T4, T5, T6>>() {
@SuppressWarnings("unchecked")
@Override
public Tuple6<T1, T2, T3, T4, T5, T6> call(ResultSet rs) {
return new Tuple6<T1, T2, T3, T4, T5, T6>((T1) mapObject(rs, cls1, 1),
(T2) mapObject(rs, cls2, 2), (T3) mapObject(rs, cls3, 3),
(T4) mapObject(rs, cls4, 4), (T5) mapObject(rs, cls5, 5),
(T6) mapObject(rs, cls6, 6));
}
};
}
public static <T1, T2, T3, T4, T5, T6, T7> ResultSetMapper<Tuple7<T1, T2, T3, T4, T5, T6, T7>> tuple(
final Class<T1> cls1, final Class<T2> cls2, final Class<T3> cls3, final Class<T4> cls4,
final Class<T5> cls5, final Class<T6> cls6, final Class<T7> cls7) {
return new ResultSetMapper<Tuple7<T1, T2, T3, T4, T5, T6, T7>>() {
@SuppressWarnings("unchecked")
@Override
public Tuple7<T1, T2, T3, T4, T5, T6, T7> call(ResultSet rs) {
return new Tuple7<T1, T2, T3, T4, T5, T6, T7>((T1) mapObject(rs, cls1, 1),
(T2) mapObject(rs, cls2, 2), (T3) mapObject(rs, cls3, 3),
(T4) mapObject(rs, cls4, 4), (T5) mapObject(rs, cls5, 5),
(T6) mapObject(rs, cls6, 6), (T7) mapObject(rs, cls7, 7));
}
};
}
public static <T> ResultSetMapper<TupleN<T>> tupleN(final Class<T> cls) {
return new ResultSetMapper<TupleN<T>>() {
@Override
public TupleN<T> call(ResultSet rs) {
return toTupleN(cls, rs);
}
};
}
@SuppressWarnings("unchecked")
private static <T> TupleN<T> toTupleN(final Class<T> cls, ResultSet rs) {
try {
int n = rs.getMetaData().getColumnCount();
List<T> list = new ArrayList<T>();
for (int i = 1; i <= n; i++) {
list.add((T) mapObject(rs, cls, i));
}
return new TupleN<T>(list);
} catch (SQLException e) {
throw new SQLRuntimeException(e);
}
}
}