package edu.isi.karma.er.helper;
import java.util.*;
import org.json.JSONArray;
import org.json.JSONObject;
import edu.isi.karma.controller.command.selection.SuperSelection;
import edu.isi.karma.rep.HNode;
import edu.isi.karma.rep.HNode.HNodeType;
import edu.isi.karma.rep.HTable;
import edu.isi.karma.rep.Node;
import edu.isi.karma.rep.RepFactory;
import edu.isi.karma.rep.Row;
import edu.isi.karma.rep.Table;
import edu.isi.karma.rep.Worksheet;
public class CloneTableUtils {
private CloneTableUtils() {
}
public static Map<String, String> cloneHTable(HTable newHTable, Worksheet newWorksheet, RepFactory factory, List<HNode> hNodes, boolean isFirst) {
Collections.sort(hNodes);
Map<String, String> tmp = new HashMap<>();
for (HNode hnode : hNodes) {
HNode newHNode;
if (!isFirst) {
newHNode = newHTable.addHNode(hnode.getColumnName(), HNodeType.Transformation, newWorksheet, factory);
}
else {
newHNode = newHTable.addHNode(hnode.getHNodePath(factory).toColumnNamePath().replace("/", "_"), HNodeType.Transformation, newWorksheet, factory);
}
tmp.put(hnode.getId(), newHNode.getId());
if (hnode.hasNestedTable()) {
HTable oldNested = hnode.getNestedTable();
HTable newNested = newHNode.addNestedTable(hnode.getNestedTable().getTableName(), newWorksheet, factory);
tmp.putAll(cloneHTable(newNested, newWorksheet, factory, new ArrayList<>(oldNested.getHNodes()), false));
}
}
return tmp;
}
public static Row cloneDataTable(Row oldRow, Table newDataTable, HTable newHTable, List<HNode> hNodes, RepFactory factory, SuperSelection sel) {
Row newRow = newDataTable.addRow(factory);
for (HNode hnode : hNodes) {
HNode newHNode = newHTable.getHNodeFromColumnName(hnode.getColumnName());
if (newHNode == null)
continue;
Node oldNode = oldRow.getNode(hnode.getId());
Node newNode = newRow.getNode(newHNode.getId());
if (oldNode == null)
continue;
if (!oldNode.hasNestedTable()) {
newNode.setValue(oldNode.getValue(), oldNode.getStatus(), factory);
}
else {
cloneDataTable(oldNode.getNestedTable(), newNode.getNestedTable(), newHNode.getNestedTable(), hnode.getNestedTable().getSortedHNodes(), factory, sel);
}
}
return newRow;
}
public static void cloneDataTableExistingRow(Row oldRow, Row newRow, List<HNode> hNodes, RepFactory factory, Map<String, String> mapping, SuperSelection sel) {
for (HNode hnode : hNodes) {
HNode newHNode = factory.getHNode(mapping.get(hnode.getId()));
Node oldNode = oldRow.getNode(hnode.getId());
Node newNode = newRow.getNode(newHNode.getId());
if (oldNode == null)
continue;
if (!oldNode.hasNestedTable()) {
newNode.setValue(oldNode.getValue(), oldNode.getStatus(), factory);
}
else {
cloneDataTable(oldNode.getNestedTable(), newNode.getNestedTable(), newHNode.getNestedTable(), hnode.getNestedTable().getSortedHNodes(), factory, sel);
}
}
}
public static void cloneDataTable(Table oldDataTable, Table newDataTable, HTable newHTable, List<HNode> hNodes, RepFactory factory, SuperSelection sel) {
ArrayList<Row> rows = oldDataTable.getRows(0, oldDataTable.getNumRows(), sel);
for (Row row : rows) {
Row newrow = newDataTable.addRow(factory);
for (HNode hnode : hNodes) {
HNode newHNode = newHTable.getHNodeFromColumnName(hnode.getColumnName());
Node oldNode = row.getNode(hnode.getId());
Node newNode = newrow.getNode(newHNode.getId());
if (!oldNode.hasNestedTable()) {
newNode.setValue(oldNode.getValue(), oldNode.getStatus(), factory);
}
else {
cloneDataTable(oldNode.getNestedTable(), newNode.getNestedTable(), newHNode.getNestedTable(), hnode.getNestedTable().getSortedHNodes(), factory, sel);
}
}
}
}
public static void getDatatable(Table dataTable, HTable headerTable, List<Table> parentTables, SuperSelection sel) {
if (dataTable == null)
return;
if (dataTable.getHTableId().compareTo(headerTable.getId()) == 0)
parentTables.add(dataTable);
else {
for (Row row : dataTable.getRows(0, dataTable.getNumRows(), sel)) {
for (Node n : row.getNodes()) {
getDatatable(n.getNestedTable(), headerTable, parentTables, sel);
}
}
}
}
public static Object cloneNodeToJSON(HNode hNode, Node node, SuperSelection sel) {
if (node.hasNestedTable()) {
HTable nestHT = hNode.getNestedTable();
Table dataTable = node.getNestedTable();
JSONArray array = new JSONArray();
for (Row row : dataTable.getRows(0, dataTable.getNumRows(), sel)) {
JSONObject obj = new JSONObject();
for (HNode hnode : nestHT.getHNodes()) {
Node n = row.getNode(hnode.getId());
obj.put(hnode.getColumnName(),cloneNodeToJSON(hnode, n, sel));
}
array.put(obj);
}
return array;
}
else
return node.getValue().asString();
}
}