package uk.ac.imperial.lsds.streamsql.operator;
import java.util.ArrayList;
import java.util.List;
import uk.ac.imperial.lsds.seep.comm.serialization.DataTuple;
import uk.ac.imperial.lsds.seep.operator.StatelessOperator;
import uk.ac.imperial.lsds.streamsql.expressions.Constants;
import uk.ac.imperial.lsds.streamsql.visitors.OperatorVisitor;
public class Projection implements StatelessOperator, IStreamSQLOperator {
/*
* Attributes for the projection
*/
List<String> attributes;
public Projection(List<String> attributes) {
this.attributes = attributes;
}
public Projection(String attribute) {
this(new ArrayList<String>());
attributes.add(attribute);
}
public Projection() {
this(new ArrayList<String>());
}
@Override
public void setUp() {
}
@Override
public void processData(DataTuple data) {
List<Object> projectedValues = new ArrayList<>();
/*
* Add timestamp attribute
*/
projectedValues.add(data.getValue(Constants.TIMESTAMP));
/*
* Add all attributes referred to in the projection operator
*/
for (String att : attributes)
projectedValues.add(data.getValue(att));
/*
* Send the projected tuple
*/
DataTuple output = data.setValues(projectedValues);
api.send(output);
}
@Override
public void processData(List<DataTuple> dataList) {
for (DataTuple tuple : dataList)
processData(tuple);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Projection (");
for (String att : attributes)
sb.append(att.toString() + " ");
sb.append(")");
return sb.toString();
}
@Override
public void accept(OperatorVisitor ov) {
ov.visit(this);
}
}