package org.embulk.spi.util;
import java.util.List;
import java.util.ArrayList;
import org.embulk.spi.time.Timestamp;
import org.embulk.spi.time.TimestampFormatter;
import org.embulk.spi.Schema;
import org.embulk.spi.Column;
import org.embulk.spi.PageReader;
import org.embulk.spi.ColumnVisitor;
import org.embulk.spi.type.TimestampType;
public class PagePrinter
{
private final Schema schema;
private final TimestampFormatter[] timestampFormatters;
private final ArrayList<String> record;
public PagePrinter(Schema schema, TimestampFormatter.FormatterTask task)
{
this.schema = schema;
this.timestampFormatters = new TimestampFormatter[schema.getColumnCount()];
for (int i=0; i < timestampFormatters.length; i++) {
if (schema.getColumnType(i) instanceof TimestampType) {
TimestampType type = (TimestampType) schema.getColumnType(i);
timestampFormatters[i] = new TimestampFormatter(type.getFormat(), task);
}
}
this.record = new ArrayList<String>(schema.getColumnCount());
for (int i=0; i < schema.getColumnCount(); i++) {
record.add("");
}
}
public String printRecord(PageReader reader, String delimiter)
{
StringBuilder sb = new StringBuilder();
for (Column c : schema.getColumns()) {
if (c.getIndex() != 0) {
sb.append(delimiter);
}
sb.append(printColumn(reader, c));
}
return sb.toString();
}
public List<String> printRecord(PageReader reader)
{
for (Column c : schema.getColumns()) {
record.set(c.getIndex(), printColumn(reader, c));
}
return record;
}
public String printColumn(PageReader reader, Column column)
{
if (reader.isNull(column)) {
return "";
}
ToStringColumnVisitor visitor = new ToStringColumnVisitor(reader);
column.visit(visitor);
return visitor.string;
}
private class ToStringColumnVisitor
implements ColumnVisitor
{
private final PageReader reader;
String string = "";
public ToStringColumnVisitor(PageReader reader)
{
this.reader = reader;
}
public void booleanColumn(Column column)
{
string = Boolean.toString(reader.getBoolean(column));
}
public void longColumn(Column column)
{
string = Long.toString(reader.getLong(column));
}
public void doubleColumn(Column column)
{
string = Double.toString(reader.getDouble(column));
}
public void stringColumn(Column column)
{
string = reader.getString(column);
}
public void timestampColumn(Column column)
{
string = timestampFormatters[column.getIndex()].format(reader.getTimestamp(column));
}
public void jsonColumn(Column column)
{
string = reader.getJson(column).toString();
}
}
}