package org.embulk.spi.util;
import java.util.List;
import java.util.Iterator;
import com.google.common.collect.ImmutableList;
import org.embulk.spi.time.Timestamp;
import org.embulk.spi.Schema;
import org.embulk.spi.ColumnVisitor;
import org.embulk.spi.Column;
import org.embulk.spi.Page;
import org.embulk.spi.PageReader;
public class Pages
{
public static List<Object[]> toObjects(Schema schema, Page page)
{
return toObjects(schema, ImmutableList.of(page));
}
// TODO use streaming and return Iterable
public static List<Object[]> toObjects(Schema schema, Iterable<Page> pages)
{
ImmutableList.Builder<Object[]> builder = ImmutableList.builder();
Iterator<Page> ite = pages.iterator();
try (PageReader reader = new PageReader(schema)) {
while (ite.hasNext()) {
reader.setPage(ite.next());
while (reader.nextRecord()) {
builder.add(toObjects(reader));
}
}
}
return builder.build();
}
public static Object[] toObjects(final PageReader record)
{
final Object[] values = new Object[record.getSchema().getColumns().size()];
record.getSchema().visitColumns(new ObjectColumnVisitor(record) {
@Override
public void visit(Column column, Object object)
{
values[column.getIndex()] = object;
}
});
return values;
}
public static abstract class ObjectColumnVisitor
implements ColumnVisitor
{
private final PageReader record;
public ObjectColumnVisitor(PageReader record)
{
this.record = record;
}
public abstract void visit(Column column, Object obj);
@Override
public void booleanColumn(Column column)
{
if (record.isNull(column)) {
visit(column, null);
} else {
visit(column, record.getBoolean(column));
}
}
@Override
public void longColumn(Column column)
{
if (record.isNull(column)) {
visit(column, null);
} else {
visit(column, record.getLong(column));
}
}
@Override
public void doubleColumn(Column column)
{
if (record.isNull(column)) {
visit(column, null);
} else {
visit(column, record.getDouble(column));
}
}
@Override
public void stringColumn(Column column)
{
if (record.isNull(column)) {
visit(column, null);
} else {
visit(column, record.getString(column));
}
}
@Override
public void timestampColumn(Column column)
{
if (record.isNull(column)) {
visit(column, null);
} else {
visit(column, record.getTimestamp(column));
}
}
@Override
public void jsonColumn(Column column)
{
if (record.isNull(column)) {
visit(column, null);
} else {
visit(column, record.getJson(column));
}
}
}
public static Object getObject(PageReader record, Column column)
{
GetObjectColumnVisitor visitor = new GetObjectColumnVisitor(record);
column.visit(visitor);
return visitor.get();
}
private static class GetObjectColumnVisitor
extends ObjectColumnVisitor
{
private Object object;
public GetObjectColumnVisitor(PageReader record)
{
super(record);
}
public Object get()
{
return object;
}
public void visit(Column column, Object object)
{
this.object = object;
}
}
}