RandomSec/src/main/java/com/metaweb/gridworks/model/operations/TextTransformOperation.java
David Huynh 4b2e48614b Actual work in operations must be delayed until their changes are applied.
Column addition change must track the new cell index that it allocates when it is first applied.

git-svn-id: http://google-refine.googlecode.com/svn/trunk@103 7d457c2a-affb-35e4-300a-418c747d4874
2010-02-18 23:27:40 +00:00

91 lines
3.1 KiB
Java

package com.metaweb.gridworks.model.operations;
import java.util.List;
import java.util.Properties;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONWriter;
import com.metaweb.gridworks.browsing.RowVisitor;
import com.metaweb.gridworks.expr.Evaluable;
import com.metaweb.gridworks.expr.ExpressionUtils;
import com.metaweb.gridworks.expr.Parser;
import com.metaweb.gridworks.model.Cell;
import com.metaweb.gridworks.model.Column;
import com.metaweb.gridworks.model.Project;
import com.metaweb.gridworks.model.Row;
import com.metaweb.gridworks.model.changes.CellChange;
public class TextTransformOperation extends EngineDependentMassCellOperation {
private static final long serialVersionUID = -7698202759999537298L;
final protected String _expression;
public TextTransformOperation(JSONObject engineConfig, String columnName, String expression) {
super(engineConfig, columnName, true);
_expression = expression;
}
public void write(JSONWriter writer, Properties options)
throws JSONException {
writer.object();
writer.key("op"); writer.value("text-transform");
writer.key("description"); writer.value("Text transform on cells in column " + _columnName + " with expression " + _expression);
writer.key("engineConfig"); writer.value(getEngineConfig());
writer.key("columnName"); writer.value(_columnName);
writer.key("expression"); writer.value(_expression);
writer.endObject();
}
protected String getBriefDescription() {
return "Text transform on cells in column " + _columnName + " using " + _expression;
}
protected String createDescription(Column column,
List<CellChange> cellChanges) {
return "Text transform on " + cellChanges.size() +
" cells in column " + column.getHeaderLabel() + ": " + _expression;
}
protected RowVisitor createRowVisitor(Project project, List<CellChange> cellChanges) throws Exception {
Column column = project.columnModel.getColumnByName(_columnName);
Evaluable eval = new Parser(_expression).getExpression();
Properties bindings = ExpressionUtils.createBindings(project);
return new RowVisitor() {
int cellIndex;
Properties bindings;
List<CellChange> cellChanges;
Evaluable eval;
public RowVisitor init(int cellIndex, Properties bindings, List<CellChange> cellChanges, Evaluable eval) {
this.cellIndex = cellIndex;
this.bindings = bindings;
this.cellChanges = cellChanges;
this.eval = eval;
return this;
}
public boolean visit(Project project, int rowIndex, Row row, boolean contextual) {
Cell cell = row.getCell(cellIndex);
ExpressionUtils.bind(bindings, row, cell);
Object v = eval.evaluate(bindings);
if ((cell != null && cell.value != null) || v != null) {
Cell newCell = new Cell(v, cell.recon);
CellChange cellChange = new CellChange(rowIndex, cellIndex, cell, newCell);
cellChanges.add(cellChange);
}
return false;
}
}.init(column.getCellIndex(), bindings, cellChanges, eval);
}
}