package com.tinkerpop.pipes.sideeffect;
import com.tinkerpop.pipes.AbstractPipe;
import com.tinkerpop.pipes.PipeFunction;
import com.tinkerpop.pipes.util.AsPipe;
import com.tinkerpop.pipes.util.PipeHelper;
import com.tinkerpop.pipes.util.structures.Table;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public class TablePipe<S> extends AbstractPipe<S, S> implements SideEffectPipe.GreedySideEffectPipe<S, Table> {
private Table table;
private final PipeFunction[] columnFunctions;
private int currentFunction;
private final List<AsPipe> asPipes = new ArrayList<AsPipe>();
private final Collection<String> stepNames;
private final boolean doFunctions;
public TablePipe(final Table table, final Collection<String> stepNames, final List<AsPipe> allPreviousAsPipes, final PipeFunction... columnFunctions) {
this.table = table;
this.columnFunctions = columnFunctions;
this.stepNames = stepNames;
if (this.doFunctions = this.columnFunctions.length > 0)
currentFunction = 0;
final List<String> tempNames = new ArrayList<String>();
for (final AsPipe asPipe : allPreviousAsPipes) {
final String columnName = asPipe.getName();
if (null == this.stepNames || this.stepNames.contains(columnName)) {
tempNames.add(columnName);
this.asPipes.add(asPipe);
}
}
if (tempNames.size() > 0)
table.setColumnNames(tempNames.toArray(new String[tempNames.size()]));
}
public Table getSideEffect() {
return this.table;
}
public S processNextStart() {
final S s = this.starts.next();
final List row = new ArrayList();
for (final AsPipe asPipe : this.asPipes) {
if (doFunctions) {
row.add(this.columnFunctions[currentFunction++ % columnFunctions.length].compute(asPipe.getCurrentEnd()));
} else {
row.add(asPipe.getCurrentEnd());
}
}
this.table.addRow(row);
return s;
}
public void reset() {
this.table = new Table();
this.currentFunction = 0;
super.reset();
}
public String toString() {
if (null == this.stepNames)
return PipeHelper.makePipeString(this);
else
return PipeHelper.makePipeString(this, this.stepNames.toArray());
}
}