Extend cross() function to take either a cell or a value #1204
This commit is contained in:
parent
a510145839
commit
f03be76475
@ -88,6 +88,15 @@ public class InterProjectModel {
|
|||||||
|
|
||||||
protected Map<String, ProjectJoin> _joins = new HashMap<String, ProjectJoin>();
|
protected Map<String, ProjectJoin> _joins = new HashMap<String, ProjectJoin>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute the ProjectJoin based on combination key, return the cached one from the HashMap if already computed
|
||||||
|
*
|
||||||
|
* @param fromProject
|
||||||
|
* @param fromColumn
|
||||||
|
* @param toProject
|
||||||
|
* @param toColumn
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
public ProjectJoin getJoin(String fromProject, String fromColumn, String toProject, String toColumn) {
|
public ProjectJoin getJoin(String fromProject, String fromColumn, String toProject, String toColumn) {
|
||||||
String key = fromProject + ";" + fromColumn + ";" + toProject + ";" + toColumn;
|
String key = fromProject + ";" + fromColumn + ";" + toProject + ";" + toColumn;
|
||||||
if (!_joins.containsKey(key)) {
|
if (!_joins.containsKey(key)) {
|
||||||
|
@ -47,39 +47,39 @@ import com.google.refine.grel.Function;
|
|||||||
import com.google.refine.model.Project;
|
import com.google.refine.model.Project;
|
||||||
|
|
||||||
public class Cross implements Function {
|
public class Cross implements Function {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object call(Properties bindings, Object[] args) {
|
public Object call(Properties bindings, Object[] args) {
|
||||||
if (args.length == 3) {
|
if (args.length == 3) {
|
||||||
// from project is implied
|
// from project is implied
|
||||||
|
|
||||||
Object wrappedCell = args[0]; // from cell
|
Object v = args[0]; // from cell
|
||||||
Object toProjectName = args[1];
|
Object toProjectName = args[1];
|
||||||
Object toColumnName = args[2];
|
Object toColumnName = args[2];
|
||||||
|
|
||||||
if (wrappedCell != null && wrappedCell instanceof WrappedCell &&
|
if (v != null && v instanceof String &&
|
||||||
toProjectName != null && toProjectName instanceof String &&
|
toProjectName != null && toProjectName instanceof String &&
|
||||||
toColumnName != null && toColumnName instanceof String) {
|
toColumnName != null && toColumnName instanceof String) {
|
||||||
|
|
||||||
ProjectJoin join = ProjectManager.singleton.getInterProjectModel().getJoin(
|
ProjectJoin join = ProjectManager.singleton.getInterProjectModel().getJoin(
|
||||||
ProjectManager.singleton.getProjectMetadata(((Project) bindings.get("project")).id).getName(),
|
ProjectManager.singleton.getProjectMetadata(((Project) bindings.get("project")).id).getName(),
|
||||||
((WrappedCell) wrappedCell).columnName,
|
(String) bindings.get("columnName"),
|
||||||
(String) toProjectName,
|
(String) toProjectName,
|
||||||
(String) toColumnName
|
(String) toColumnName
|
||||||
);
|
);
|
||||||
|
|
||||||
return join.getRows(((WrappedCell) wrappedCell).cell.value);
|
return join.getRows((String)v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new EvalError(ControlFunctionRegistry.getFunctionName(this) + " expects a cell, a project name to join with, and a column name in that project");
|
return new EvalError(ControlFunctionRegistry.getFunctionName(this) + " expects a string, a project name to join with, and a column name in that project");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(JSONWriter writer, Properties options)
|
public void write(JSONWriter writer, Properties options)
|
||||||
throws JSONException {
|
throws JSONException {
|
||||||
|
|
||||||
writer.object();
|
writer.object();
|
||||||
writer.key("description"); writer.value("TODO");
|
writer.key("description"); writer.value("join with anothe project by column");
|
||||||
writer.key("params"); writer.value("cell c, string projectName, string columnName");
|
writer.key("params"); writer.value("cell c, string projectName, string columnName");
|
||||||
writer.key("returns"); writer.value("array");
|
writer.key("returns"); writer.value("array");
|
||||||
writer.endObject();
|
writer.endObject();
|
||||||
|
@ -37,12 +37,14 @@ import java.io.IOException;
|
|||||||
import java.io.LineNumberReader;
|
import java.io.LineNumberReader;
|
||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONWriter;
|
import org.json.JSONWriter;
|
||||||
|
|
||||||
|
import com.google.refine.ProjectManager;
|
||||||
import com.google.refine.history.Change;
|
import com.google.refine.history.Change;
|
||||||
import com.google.refine.model.Cell;
|
import com.google.refine.model.Cell;
|
||||||
import com.google.refine.model.Project;
|
import com.google.refine.model.Project;
|
||||||
@ -71,6 +73,7 @@ public class MassReconChange implements Change {
|
|||||||
|
|
||||||
protected void switchRecons(Project project, Map<Long, Recon> reconMap) {
|
protected void switchRecons(Project project, Map<Long, Recon> reconMap) {
|
||||||
synchronized (project) {
|
synchronized (project) {
|
||||||
|
HashSet<String> flushedColumn = new HashSet<String>();
|
||||||
for (Row row : project.rows) {
|
for (Row row : project.rows) {
|
||||||
for (int c = 0; c < row.cells.size(); c++) {
|
for (int c = 0; c < row.cells.size(); c++) {
|
||||||
Cell cell = row.cells.get(c);
|
Cell cell = row.cells.get(c);
|
||||||
@ -78,6 +81,14 @@ public class MassReconChange implements Change {
|
|||||||
Recon recon = cell.recon;
|
Recon recon = cell.recon;
|
||||||
|
|
||||||
if (reconMap.containsKey(recon.id)) {
|
if (reconMap.containsKey(recon.id)) {
|
||||||
|
// skip the flushing if already done
|
||||||
|
String columnName = project.columnModel.getColumnByCellIndex(c).getName();
|
||||||
|
if (!flushedColumn.contains(columnName)) {
|
||||||
|
ProjectManager.singleton.getInterProjectModel().flushJoinsInvolvingProjectColumn(project.id,
|
||||||
|
columnName);
|
||||||
|
flushedColumn.add(columnName);
|
||||||
|
}
|
||||||
|
|
||||||
row.setCell(c, new Cell(cell.value, reconMap.get(recon.id)));
|
row.setCell(c, new Cell(cell.value, reconMap.get(recon.id)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@ import java.util.LinkedList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import com.google.refine.ProjectManager;
|
||||||
import com.google.refine.history.Change;
|
import com.google.refine.history.Change;
|
||||||
import com.google.refine.model.Column;
|
import com.google.refine.model.Column;
|
||||||
import com.google.refine.model.ColumnGroup;
|
import com.google.refine.model.ColumnGroup;
|
||||||
@ -80,6 +81,8 @@ public class MassRowColumnChange implements Change {
|
|||||||
project.rows.clear();
|
project.rows.clear();
|
||||||
project.rows.addAll(_newRows);
|
project.rows.addAll(_newRows);
|
||||||
|
|
||||||
|
ProjectManager.singleton.getInterProjectModel().flushJoinsInvolvingProject(project.id);
|
||||||
|
|
||||||
project.update();
|
project.update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -96,6 +99,8 @@ public class MassRowColumnChange implements Change {
|
|||||||
project.rows.clear();
|
project.rows.clear();
|
||||||
project.rows.addAll(_oldRows);
|
project.rows.addAll(_oldRows);
|
||||||
|
|
||||||
|
ProjectManager.singleton.getInterProjectModel().flushJoinsInvolvingProject(project.id);
|
||||||
|
|
||||||
project.update();
|
project.update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user