When transposing data to triple loader output, pass row indices and cell indices deep down so later we can generate more context information for recon.

git-svn-id: http://google-refine.googlecode.com/svn/trunk@1051 7d457c2a-affb-35e4-300a-418c747d4874
This commit is contained in:
David Huynh 2010-06-29 17:30:16 +00:00
parent 7a914f01e8
commit 2e3984d54a
6 changed files with 212 additions and 106 deletions

View File

@ -41,7 +41,7 @@ public class PreviewProtographCommand extends Command {
{ {
StringWriter stringWriter = new StringWriter(); StringWriter stringWriter = new StringWriter();
TripleLoaderTransposedNodeFactory nodeFactory = new TripleLoaderTransposedNodeFactory(stringWriter); TripleLoaderTransposedNodeFactory nodeFactory = new TripleLoaderTransposedNodeFactory(project, stringWriter);
Transposer.transpose(project, filteredRows, protograph, protograph.getRootNode(0), nodeFactory); Transposer.transpose(project, filteredRows, protograph, protograph.getRootNode(0), nodeFactory);
nodeFactory.flush(); nodeFactory.flush();

View File

@ -39,7 +39,7 @@ abstract public class ProtographTransposeExporter implements Exporter {
if (project.protograph != null) { if (project.protograph != null) {
Protograph protograph = project.protograph; Protograph protograph = project.protograph;
TransposedNodeFactory nodeFactory = createNodeFactory(writer); TransposedNodeFactory nodeFactory = createNodeFactory(project, writer);
Transposer.transpose(project, engine.getAllFilteredRows(), protograph, protograph.getRootNode(0), nodeFactory, -1); Transposer.transpose(project, engine.getAllFilteredRows(), protograph, protograph.getRootNode(0), nodeFactory, -1);
@ -47,7 +47,7 @@ abstract public class ProtographTransposeExporter implements Exporter {
} }
} }
abstract protected TransposedNodeFactory createNodeFactory(Writer writer); abstract protected TransposedNodeFactory createNodeFactory(Project project, Writer writer);
static public class TripleLoaderExporter extends ProtographTransposeExporter { static public class TripleLoaderExporter extends ProtographTransposeExporter {
public TripleLoaderExporter() { public TripleLoaderExporter() {
@ -55,8 +55,8 @@ abstract public class ProtographTransposeExporter implements Exporter {
} }
@Override @Override
protected TransposedNodeFactory createNodeFactory(Writer writer) { protected TransposedNodeFactory createNodeFactory(Project project, Writer writer) {
return new TripleLoaderTransposedNodeFactory(writer); return new TripleLoaderTransposedNodeFactory(project, writer);
} }
} }
@ -66,7 +66,7 @@ abstract public class ProtographTransposeExporter implements Exporter {
} }
@Override @Override
protected TransposedNodeFactory createNodeFactory(Writer writer) { protected TransposedNodeFactory createNodeFactory(Project project, Writer writer) {
return new MqlwriteLikeTransposedNodeFactory(writer); return new MqlwriteLikeTransposedNodeFactory(writer);
} }
} }

View File

@ -247,7 +247,7 @@ public class MqlwriteLikeTransposedNodeFactory implements TransposedNodeFactory
public TransposedNode transposeAnonymousNode( public TransposedNode transposeAnonymousNode(
TransposedNode parentNode, TransposedNode parentNode,
FreebaseProperty property, FreebaseProperty property,
AnonymousNode node) { AnonymousNode node, int rowIndex) {
return new AnonymousTransposedNode( return new AnonymousTransposedNode(
parentNode instanceof JsonObjectTransposedNode ? (JsonObjectTransposedNode) parentNode : null, parentNode instanceof JsonObjectTransposedNode ? (JsonObjectTransposedNode) parentNode : null,
@ -260,7 +260,7 @@ public class MqlwriteLikeTransposedNodeFactory implements TransposedNodeFactory
TransposedNode parentNode, TransposedNode parentNode,
FreebaseProperty property, FreebaseProperty property,
CellNode node, CellNode node,
Cell cell) { int rowIndex, Cell cell) {
JsonTransposedNode tnode = null; JsonTransposedNode tnode = null;
if (node instanceof CellTopicNode) { if (node instanceof CellTopicNode) {
@ -280,7 +280,7 @@ public class MqlwriteLikeTransposedNodeFactory implements TransposedNodeFactory
public TransposedNode transposeTopicNode( public TransposedNode transposeTopicNode(
TransposedNode parentNode, TransposedNode parentNode,
FreebaseProperty property, FreebaseProperty property,
FreebaseTopicNode node) { FreebaseTopicNode node, int rowIndex) {
JsonTransposedNode tnode = new TopicTransposedNode(node); JsonTransposedNode tnode = new TopicTransposedNode(node);
@ -292,7 +292,7 @@ public class MqlwriteLikeTransposedNodeFactory implements TransposedNodeFactory
public TransposedNode transposeValueNode( public TransposedNode transposeValueNode(
TransposedNode parentNode, TransposedNode parentNode,
FreebaseProperty property, FreebaseProperty property,
ValueNode node) { ValueNode node, int rowIndex) {
JsonTransposedNode tnode = new ValueTransposedNode(node); JsonTransposedNode tnode = new ValueTransposedNode(node);

View File

@ -13,26 +13,29 @@ public interface TransposedNodeFactory {
public TransposedNode transposeAnonymousNode( public TransposedNode transposeAnonymousNode(
TransposedNode parentNode, TransposedNode parentNode,
FreebaseProperty property, FreebaseProperty property,
AnonymousNode node AnonymousNode node, int rowIndex
); );
public TransposedNode transposeCellNode( public TransposedNode transposeCellNode(
TransposedNode parentNode, TransposedNode parentNode,
FreebaseProperty property, FreebaseProperty property,
CellNode node, CellNode node,
int rowIndex,
Cell cell Cell cell
); );
public TransposedNode transposeValueNode( public TransposedNode transposeValueNode(
TransposedNode parentNode, TransposedNode parentNode,
FreebaseProperty property, FreebaseProperty property,
ValueNode node ValueNode node,
int rowIndex
); );
public TransposedNode transposeTopicNode( public TransposedNode transposeTopicNode(
TransposedNode parentNode, TransposedNode parentNode,
FreebaseProperty property, FreebaseProperty property,
FreebaseTopicNode node FreebaseTopicNode node,
int rowIndex
); );
public void flush() throws IOException; public void flush() throws IOException;

View File

@ -25,7 +25,7 @@ import com.metaweb.gridworks.protograph.ValueNode;
public class Transposer { public class Transposer {
static public void transpose( static public void transpose(
Project project, Project project,
FilteredRows filteredRows, FilteredRows filteredRows,
Protograph protograph, Protograph protograph,
Node rootNode, Node rootNode,
TransposedNodeFactory nodeFactory TransposedNodeFactory nodeFactory
@ -35,7 +35,7 @@ public class Transposer {
static public void transpose( static public void transpose(
Project project, Project project,
FilteredRows filteredRows, FilteredRows filteredRows,
Protograph protograph, Protograph protograph,
Node rootNode, Node rootNode,
TransposedNodeFactory nodeFactory, TransposedNodeFactory nodeFactory,
@ -43,56 +43,57 @@ public class Transposer {
) { ) {
Context rootContext = new Context(rootNode, null, null, limit); Context rootContext = new Context(rootNode, null, null, limit);
filteredRows.accept(project, new RowVisitor() { filteredRows.accept(project, new RowVisitor() {
Context rootContext; Context rootContext;
Protograph protograph; Protograph protograph;
Node rootNode; Node rootNode;
TransposedNodeFactory nodeFactory; TransposedNodeFactory nodeFactory;
@Override @Override
public boolean visit(Project project, int rowIndex, Row row) { public boolean visit(Project project, int rowIndex, Row row) {
if (rootContext.limit <= 0 || rootContext.count < rootContext.limit) { if (rootContext.limit <= 0 || rootContext.count < rootContext.limit) {
descend(project, protograph, nodeFactory, row, rootNode, rootContext); descend(project, protograph, nodeFactory, rowIndex, row, rootNode, rootContext);
} }
if (rootContext.limit > 0 && rootContext.count > rootContext.limit) { if (rootContext.limit > 0 && rootContext.count > rootContext.limit) {
return true; return true;
} }
return false; return false;
} }
@Override @Override
public void start(Project project) { public void start(Project project) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override @Override
public void end(Project project) { public void end(Project project) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
public RowVisitor init( public RowVisitor init(
Context rootContext, Context rootContext,
Protograph protograph, Protograph protograph,
Node rootNode, Node rootNode,
TransposedNodeFactory nodeFactory TransposedNodeFactory nodeFactory
) { ) {
this.rootContext = rootContext; this.rootContext = rootContext;
this.protograph = protograph; this.protograph = protograph;
this.rootNode = rootNode; this.rootNode = rootNode;
this.nodeFactory = nodeFactory; this.nodeFactory = nodeFactory;
return this; return this;
} }
}.init(rootContext, protograph, rootNode, nodeFactory)); }.init(rootContext, protograph, rootNode, nodeFactory));
} }
static protected void descend( static protected void descend(
Project project, Project project,
Protograph protograph, Protograph protograph,
TransposedNodeFactory nodeFactory, TransposedNodeFactory nodeFactory,
int rowIndex,
Row row, Row row,
Node node, Node node,
Context context Context context
@ -122,6 +123,7 @@ public class Transposer {
parentNode, parentNode,
property, property,
node2, node2,
rowIndex,
cell cell
); );
} }
@ -130,19 +132,22 @@ public class Transposer {
tnode = nodeFactory.transposeAnonymousNode( tnode = nodeFactory.transposeAnonymousNode(
parentNode, parentNode,
property, property,
(AnonymousNode) node (AnonymousNode) node,
rowIndex
); );
} else if (node instanceof FreebaseTopicNode) { } else if (node instanceof FreebaseTopicNode) {
tnode = nodeFactory.transposeTopicNode( tnode = nodeFactory.transposeTopicNode(
parentNode, parentNode,
property, property,
(FreebaseTopicNode) node (FreebaseTopicNode) node,
rowIndex
); );
} else if (node instanceof ValueNode) { } else if (node instanceof ValueNode) {
tnode = nodeFactory.transposeValueNode( tnode = nodeFactory.transposeValueNode(
parentNode, parentNode,
property, property,
(ValueNode) node (ValueNode) node,
rowIndex
); );
} }
} }
@ -164,7 +169,8 @@ public class Transposer {
descend( descend(
project, project,
protograph, protograph,
nodeFactory, nodeFactory,
rowIndex,
row, row,
node2.getLink(i).getTarget(), node2.getLink(i).getTarget(),
context.subContexts.get(i) context.subContexts.get(i)

View File

@ -11,9 +11,14 @@ import java.util.Set;
import org.json.JSONObject; import org.json.JSONObject;
import com.metaweb.gridworks.expr.ExpressionUtils;
import com.metaweb.gridworks.model.Cell; import com.metaweb.gridworks.model.Cell;
import com.metaweb.gridworks.model.Column;
import com.metaweb.gridworks.model.Project;
import com.metaweb.gridworks.model.Recon; import com.metaweb.gridworks.model.Recon;
import com.metaweb.gridworks.model.Row;
import com.metaweb.gridworks.model.Recon.Judgment; import com.metaweb.gridworks.model.Recon.Judgment;
import com.metaweb.gridworks.model.RecordModel.RowDependency;
import com.metaweb.gridworks.protograph.AnonymousNode; import com.metaweb.gridworks.protograph.AnonymousNode;
import com.metaweb.gridworks.protograph.CellKeyNode; import com.metaweb.gridworks.protograph.CellKeyNode;
import com.metaweb.gridworks.protograph.CellNode; import com.metaweb.gridworks.protograph.CellNode;
@ -24,6 +29,8 @@ import com.metaweb.gridworks.protograph.FreebaseTopicNode;
import com.metaweb.gridworks.protograph.ValueNode; import com.metaweb.gridworks.protograph.ValueNode;
public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory { public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory {
protected Project project;
protected boolean start = true; protected boolean start = true;
protected Writer writer; protected Writer writer;
protected WritingTransposedNode lastRootNode; protected WritingTransposedNode lastRootNode;
@ -31,14 +38,15 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
protected Map<Long, String> newTopicVars = new HashMap<Long, String>(); protected Map<Long, String> newTopicVars = new HashMap<Long, String>();
protected Set<Long> serializedRecons = new HashSet<Long>(); protected Set<Long> serializedRecons = new HashSet<Long>();
public TripleLoaderTransposedNodeFactory(Writer writer) { public TripleLoaderTransposedNodeFactory(Project project, Writer writer) {
this.project = project;
this.writer = writer; this.writer = writer;
} }
@Override @Override
public void flush() throws IOException { public void flush() throws IOException {
if (lastRootNode != null) { if (lastRootNode != null) {
lastRootNode.write(null, null, null); lastRootNode.write(null, null, project, -1, -1, null);
lastRootNode = null; lastRootNode = null;
} }
} }
@ -56,28 +64,81 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
} }
} }
protected void writeRecon(StringBuffer sb, Cell cell) { protected void writeRecon(StringBuffer sb, Project project, int rowIndex, int cellIndex, Cell cell) {
Recon recon = cell.recon; Recon recon = cell.recon;
if (serializedRecons.contains(recon.id)) { Column column = project.columnModel.getColumnByCellIndex(cellIndex);
sb.append(Long.toString(recon.id));
} else { sb.append("{ ");
sb.append("\"id\" : "); sb.append(Long.toString(recon.id));
if (!serializedRecons.contains(recon.id)) {
serializedRecons.add(recon.id); serializedRecons.add(recon.id);
String s = cell.value instanceof String ? (String) cell.value : cell.value.toString(); String s = cell.value instanceof String ? (String) cell.value : cell.value.toString();
sb.append("{ ");
sb.append("\"id\" : "); sb.append(Long.toString(recon.id));
sb.append(", \"history_entry\" : "); sb.append(Long.toString(recon.judgmentHistoryEntry)); sb.append(", \"history_entry\" : "); sb.append(Long.toString(recon.judgmentHistoryEntry));
sb.append(", \"text\" : "); sb.append(JSONObject.quote(s)); sb.append(", \"text\" : "); sb.append(JSONObject.quote(s));
sb.append(", \"column\" : "); sb.append(JSONObject.quote(column.getName()));
sb.append(", \"service\" : "); sb.append(JSONObject.quote(recon.service)); sb.append(", \"service\" : "); sb.append(JSONObject.quote(recon.service));
sb.append(", \"action\" : "); sb.append(JSONObject.quote(recon.judgmentAction)); sb.append(", \"action\" : "); sb.append(JSONObject.quote(recon.judgmentAction));
sb.append(", \"batch\" : "); sb.append(Integer.toString(recon.judgmentBatchSize)); sb.append(", \"batch\" : "); sb.append(Integer.toString(recon.judgmentBatchSize));
sb.append(", \"matchRank\" : "); sb.append(Integer.toString(recon.matchRank)); sb.append(", \"matchRank\" : "); sb.append(Integer.toString(recon.matchRank));
sb.append(" }");
} }
/*
sb.append(", \"row\" : [");
{
boolean first = true;
Row row = project.rows.get(rowIndex);
RowDependency rowDependency = project.recordModel.getRowDependency(rowIndex);
List<Integer> contextRows = rowDependency.contextRows;
int maxColumns = project.columnModel.columns.size();
for (int c = 0; c < maxColumns; c++) {
Column column2 = project.columnModel.columns.get(c);
int cellIndex2 = column2.getCellIndex();
if (cellIndex2 != cellIndex) {
Object value = row.getCellValue(cellIndex2);
if (!ExpressionUtils.isNonBlankData(value) && contextRows != null) {
for (int i = contextRows.size() - 1; i >= 0; i--) {
int rowIndex2 = contextRows.get(i);
Row row2 = project.rows.get(rowIndex2);
value = row2.getCellValue(cellIndex2);
if (ExpressionUtils.isNonBlankData(value)) {
break;
}
}
}
if (ExpressionUtils.isNonBlankData(value)) {
if (first) {
first = false;
} else {
sb.append(",");
}
String s2 = value instanceof String ? (String) value : value.toString();
sb.append("{\"c\":"); sb.append(JSONObject.quote(column2.getName()));
sb.append(",\"v\":"); sb.append(JSONObject.quote(s2));
sb.append("}");
}
}
}
}
sb.append("]");
*/
sb.append(" }");
} }
protected void writeLine(String subject, String predicate, Object object, Cell subjectCell, Cell objectCell) { protected void writeLine(
String subject, String predicate, Object object,
Project project,
int subjectRowIndex, int subjectCellIndex, Cell subjectCell,
int objectRowIndex, int objectCellIndex, Cell objectCell
) {
if (subject != null && object != null) { if (subject != null && object != null) {
String s = object instanceof String ? String s = object instanceof String ?
JSONObject.quote((String) object) : object.toString(); JSONObject.quote((String) object) : object.toString();
@ -91,14 +152,14 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
if (subjectCell != null) { if (subjectCell != null) {
sb.append("\"srecon\" : "); sb.append("\"srecon\" : ");
writeRecon(sb, subjectCell); writeRecon(sb, project, subjectRowIndex, subjectCellIndex, subjectCell);
} }
if (objectCell != null) { if (objectCell != null) {
if (subjectCell != null) { if (subjectCell != null) {
sb.append(", "); sb.append(", ");
} }
sb.append("\"orecon\" : "); sb.append("\"orecon\" : ");
writeRecon(sb, objectCell); writeRecon(sb, project, objectRowIndex, objectCellIndex, objectCell);
} }
sb.append(" }"); sb.append(" }");
@ -109,7 +170,10 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
} }
} }
protected void writeLine(String subject, String predicate, Object object, String lang, Cell subjectCell) { protected void writeLine(
String subject, String predicate, Object object, String lang,
Project project, int subjectRowIndex, int subjectCellIndex, Cell subjectCell
) {
if (subject != null && object != null) { if (subject != null && object != null) {
String s = object instanceof String ? String s = object instanceof String ?
JSONObject.quote((String) object) : object.toString(); JSONObject.quote((String) object) : object.toString();
@ -123,7 +187,7 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
if (subjectCell != null) { if (subjectCell != null) {
sb.append(", \"meta\" : { "); sb.append(", \"meta\" : { ");
sb.append("\"srecon\" : "); sb.append("\"srecon\" : ");
writeRecon(sb, subjectCell); writeRecon(sb, project, subjectRowIndex, subjectCellIndex, subjectCell);
sb.append(" }"); sb.append(" }");
} }
sb.append(" }"); sb.append(" }");
@ -133,19 +197,19 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
} }
protected interface WritingTransposedNode extends TransposedNode { protected interface WritingTransposedNode extends TransposedNode {
public Object write(String subject, String predicate, Cell subjectCell); public Object write(String subject, String predicate, Project project, int subjectRowIndex, int subjectCellIndex, Cell subjectCell);
} }
abstract protected class TransposedNodeWithChildren implements WritingTransposedNode { abstract protected class TransposedNodeWithChildren implements WritingTransposedNode {
public List<FreebaseProperty> properties = new LinkedList<FreebaseProperty>(); public List<FreebaseProperty> properties = new LinkedList<FreebaseProperty>();
public List<WritingTransposedNode> children = new LinkedList<WritingTransposedNode>(); public List<WritingTransposedNode> children = new LinkedList<WritingTransposedNode>();
protected void writeChildren(String subject, Cell subjectCell) { protected void writeChildren(String subject, Project project, int subjectRowIndex, int subjectCellIndex, Cell subjectCell) {
for (int i = 0; i < children.size(); i++) { for (int i = 0; i < children.size(); i++) {
WritingTransposedNode child = children.get(i); WritingTransposedNode child = children.get(i);
String predicate = properties.get(i).id; String predicate = properties.get(i).id;
child.write(subject, predicate, subjectCell); child.write(subject, predicate, project, subjectRowIndex, subjectCellIndex, subjectCell);
} }
} }
} }
@ -154,7 +218,7 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
//protected AnonymousTransposedNode(AnonymousNode node) { } //protected AnonymousTransposedNode(AnonymousNode node) { }
public Object write(String subject, String predicate, Cell subjectCell) { public Object write(String subject, String predicate, Project project, int subjectRowIndex, int subjectCellIndex, Cell subjectCell) {
if (children.size() == 0 || subject == null) { if (children.size() == 0 || subject == null) {
return null; return null;
} }
@ -164,7 +228,7 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
boolean first = true; boolean first = true;
for (int i = 0; i < children.size(); i++) { for (int i = 0; i < children.size(); i++) {
Object c = children.get(i).write(null, null, null); Object c = children.get(i).write(null, null, project, subjectRowIndex, subjectCellIndex, null);
if (c != null) { if (c != null) {
if (first) { if (first) {
first = false; first = false;
@ -177,7 +241,7 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
} }
sb.append(" }"); sb.append(" }");
writeLine(subject, predicate, sb, subjectCell, null); writeLine(subject, predicate, sb, project, subjectRowIndex, subjectCellIndex, subjectCell, -1, -1, null);
return null; return null;
} }
@ -185,21 +249,29 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
protected class CellTopicTransposedNode extends TransposedNodeWithChildren { protected class CellTopicTransposedNode extends TransposedNodeWithChildren {
protected CellTopicNode node; protected CellTopicNode node;
protected int rowIndex;
protected int cellIndex;
protected Cell cell; protected Cell cell;
public CellTopicTransposedNode(CellTopicNode node, Cell cell) { public CellTopicTransposedNode(CellTopicNode node, int rowIndex, int cellIndex, Cell cell) {
this.node = node; this.node = node;
this.rowIndex = rowIndex;
this.cellIndex = cellIndex;
this.cell = cell; this.cell = cell;
} }
public Object write(String subject, String predicate, Cell subjectCell) { public Object write(String subject, String predicate, Project project, int subjectRowIndex, int subjectCellIndex, Cell subjectCell) {
String id = null; String id = null;
int objectRowIndex = -1;
int objectCellIndex = -1;
Cell objectCell = null; Cell objectCell = null;
if (cell.recon != null && if (cell.recon != null &&
cell.recon.judgment == Recon.Judgment.Matched && cell.recon.judgment == Recon.Judgment.Matched &&
cell.recon.match != null) { cell.recon.match != null) {
objectRowIndex = rowIndex;
objectCellIndex = cellIndex;
objectCell = cell; objectCell = cell;
id = cell.recon.match.id; id = cell.recon.match.id;
} else if (node.createForNoReconMatch || } else if (node.createForNoReconMatch ||
@ -215,8 +287,8 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
id = "$" + node.columnName.replaceAll("\\W+", "_") + "_" + var; id = "$" + node.columnName.replaceAll("\\W+", "_") + "_" + var;
writeLine(id, "type", node.type.id, (Cell) null, (Cell) null); writeLine(id, "type", node.type.id, project, -1, -1, (Cell) null, -1, -1, (Cell) null);
writeLine(id, "name", cell.value, (Cell) null, (Cell) null); writeLine(id, "name", cell.value, project, -1, -1, (Cell) null, -1, -1, (Cell) null);
if (cell.recon != null) { if (cell.recon != null) {
newTopicVars.put(cell.recon.id, id); newTopicVars.put(cell.recon.id, id);
@ -227,10 +299,12 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
} }
if (subject != null) { if (subject != null) {
writeLine(subject, predicate, id, subjectCell, objectCell); writeLine(subject, predicate, id, project,
subjectRowIndex, subjectCellIndex, subjectCell,
objectRowIndex, objectCellIndex, objectCell);
} }
writeChildren(id, objectCell); writeChildren(id, project, objectRowIndex, objectCellIndex, objectCell);
return id; return id;
} }
@ -239,19 +313,26 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
protected class CellValueTransposedNode implements WritingTransposedNode { protected class CellValueTransposedNode implements WritingTransposedNode {
protected JSONObject obj; protected JSONObject obj;
protected CellValueNode node; protected CellValueNode node;
protected int rowIndex;
protected int cellIndex;
protected Cell cell; protected Cell cell;
public CellValueTransposedNode(CellValueNode node, Cell cell) { public CellValueTransposedNode(CellValueNode node, int rowIndex, int cellIndex, Cell cell) {
this.node = node; this.node = node;
this.rowIndex = rowIndex;
this.cellIndex = cellIndex;
this.cell = cell; this.cell = cell;
} }
public Object write(String subject, String predicate, Cell subjectCell) { public Object write(String subject, String predicate, Project project, int subjectRowIndex, int subjectCellIndex, Cell subjectCell) {
if (subject != null) { if (subject != null) {
if ("/type/text".equals(node.lang)) { if ("/type/text".equals(node.lang)) {
writeLine(subject, predicate, cell.value, node.lang, subjectCell); writeLine(subject, predicate, cell.value, node.lang, project,
subjectRowIndex, subjectCellIndex, subjectCell);
} else { } else {
writeLine(subject, predicate, cell.value, subjectCell, null); writeLine(subject, predicate, cell.value, project,
subjectRowIndex, subjectCellIndex, subjectCell,
-1, -1, null);
} }
} }
@ -261,15 +342,21 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
protected class CellKeyTransposedNode implements WritingTransposedNode { protected class CellKeyTransposedNode implements WritingTransposedNode {
protected CellKeyNode node; protected CellKeyNode node;
protected int rowIndex;
protected int cellIndex;
protected Cell cell; protected Cell cell;
public CellKeyTransposedNode(CellKeyNode node, Cell cell) { public CellKeyTransposedNode(CellKeyNode node, int rowIndex, int cellIndex, Cell cell) {
this.node = node; this.node = node;
this.rowIndex = rowIndex;
this.cellIndex = cellIndex;
this.cell = cell; this.cell = cell;
} }
public Object write(String subject, String predicate, Cell subjectCell) { public Object write(String subject, String predicate, Project project, int subjectRowIndex, int subjectCellIndex, Cell subjectCell) {
writeLine(subject, "key", node.namespace.id + "/" + cell.value, subjectCell, null); writeLine(subject, "key", node.namespace.id + "/" + cell.value, project,
subjectRowIndex, subjectCellIndex, subjectCell,
-1, -1, null);
return null; return null;
} }
@ -282,9 +369,12 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
this.node = node; this.node = node;
} }
public Object write(String subject, String predicate, Cell subjectCell) { public Object write(String subject, String predicate, Project project, int subjectRowIndex, int subjectCellIndex, Cell subjectCell) {
writeLine(subject, predicate, node.topic.id, subjectCell, null); writeLine(subject, predicate, node.topic.id, project,
writeChildren(node.topic.id, null); subjectRowIndex, subjectCellIndex, subjectCell,
-1, -1, null);
writeChildren(node.topic.id, project, -1, -1, null);
return node.topic.id; return node.topic.id;
} }
@ -297,11 +387,14 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
this.node = node; this.node = node;
} }
public Object write(String subject, String predicate, Cell subjectCell) { public Object write(String subject, String predicate, Project project, int subjectRowIndex, int subjectCellIndex, Cell subjectCell) {
if ("/type/text".equals(node.lang)) { if ("/type/text".equals(node.lang)) {
writeLine(subject, predicate, node.value, node.lang, subjectCell); writeLine(subject, predicate, node.value, node.lang, project,
subjectRowIndex, subjectCellIndex, subjectCell);
} else { } else {
writeLine(subject, predicate, node.value, subjectCell, null); writeLine(subject, predicate, node.value, project,
subjectRowIndex, subjectCellIndex, subjectCell,
-1, -1, null);
} }
return node.value; return node.value;
@ -311,7 +404,7 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
public TransposedNode transposeAnonymousNode( public TransposedNode transposeAnonymousNode(
TransposedNode parentNode, TransposedNode parentNode,
FreebaseProperty property, FreebaseProperty property,
AnonymousNode node) { AnonymousNode node, int rowIndex) {
WritingTransposedNode tnode = new AnonymousTransposedNode(); WritingTransposedNode tnode = new AnonymousTransposedNode();
@ -324,15 +417,19 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
TransposedNode parentNode, TransposedNode parentNode,
FreebaseProperty property, FreebaseProperty property,
CellNode node, CellNode node,
int rowIndex,
Cell cell) { Cell cell) {
Column column = project.columnModel.getColumnByName(node.columnName);
int cellIndex = column != null ? column.getCellIndex() : -1;
WritingTransposedNode tnode = null; WritingTransposedNode tnode = null;
if (node instanceof CellTopicNode) { if (node instanceof CellTopicNode) {
tnode = new CellTopicTransposedNode((CellTopicNode) node, cell); tnode = new CellTopicTransposedNode((CellTopicNode) node, rowIndex, cellIndex, cell);
} else if (node instanceof CellValueNode) { } else if (node instanceof CellValueNode) {
tnode = new CellValueTransposedNode((CellValueNode) node, cell); tnode = new CellValueTransposedNode((CellValueNode) node, rowIndex, cellIndex, cell);
} else if (node instanceof CellKeyNode) { } else if (node instanceof CellKeyNode) {
tnode = new CellKeyTransposedNode((CellKeyNode) node, cell); tnode = new CellKeyTransposedNode((CellKeyNode) node, rowIndex, cellIndex, cell);
} }
if (tnode != null) { if (tnode != null) {
@ -344,7 +441,7 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
public TransposedNode transposeTopicNode( public TransposedNode transposeTopicNode(
TransposedNode parentNode, TransposedNode parentNode,
FreebaseProperty property, FreebaseProperty property,
FreebaseTopicNode node) { FreebaseTopicNode node, int rowIndex) {
WritingTransposedNode tnode = new TopicTransposedNode(node); WritingTransposedNode tnode = new TopicTransposedNode(node);
@ -356,7 +453,7 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
public TransposedNode transposeValueNode( public TransposedNode transposeValueNode(
TransposedNode parentNode, TransposedNode parentNode,
FreebaseProperty property, FreebaseProperty property,
ValueNode node) { ValueNode node, int rowIndex) {
WritingTransposedNode tnode = new ValueTransposedNode(node); WritingTransposedNode tnode = new ValueTransposedNode(node);
@ -383,7 +480,7 @@ public class TripleLoaderTransposedNodeFactory implements TransposedNodeFactory
protected void addRootNode(WritingTransposedNode tnode) { protected void addRootNode(WritingTransposedNode tnode) {
if (lastRootNode != null) { if (lastRootNode != null) {
lastRootNode.write(null, null, null); lastRootNode.write(null, null, project, -1, -1, null);
} }
lastRootNode = tnode; lastRootNode = tnode;
} }