package edu.isi.karma.controller.command.alignment;
import java.io.PrintWriter;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import edu.isi.karma.controller.command.CommandException;
import edu.isi.karma.controller.command.CommandType;
import edu.isi.karma.controller.command.WorksheetSelectionCommand;
import edu.isi.karma.controller.command.selection.SuperSelection;
import edu.isi.karma.controller.update.AbstractUpdate;
import edu.isi.karma.controller.update.UpdateContainer;
import edu.isi.karma.modeling.alignment.Alignment;
import edu.isi.karma.modeling.alignment.AlignmentManager;
import edu.isi.karma.modeling.ontology.OntologyManager;
import edu.isi.karma.modeling.semantictypes.SemanticTypeColumnModel;
import edu.isi.karma.modeling.semantictypes.SemanticTypeUtil;
import edu.isi.karma.rep.HNodePath;
import edu.isi.karma.rep.Worksheet;
import edu.isi.karma.rep.Workspace;
import edu.isi.karma.rep.alignment.ColumnNode;
import edu.isi.karma.view.VWorkspace;
public class GetSemanticSuggestionsCommand extends WorksheetSelectionCommand {
private final String hNodeId;
private final String classUri;
private static Logger logger = LoggerFactory.getLogger(GetSemanticSuggestionsCommand.class.getSimpleName());
protected GetSemanticSuggestionsCommand(String id, String model, String worksheetId,
String hNodeId, String classUri, String selectionId) {
super(id, model, worksheetId, selectionId);
this.hNodeId = hNodeId;
this.classUri = classUri;
}
@Override
public String getCommandName() {
return this.getClass().getSimpleName();
}
@Override
public String getTitle() {
return null;
}
@Override
public String getDescription() {
return null;
}
@Override
public CommandType getCommandType() {
return CommandType.notInHistory;
}
@Override
public UpdateContainer doIt(final Workspace workspace) throws CommandException {
logger.info("Get Semantic Suggestions: " + worksheetId + "," + hNodeId);
UpdateContainer uc = new UpdateContainer();
final SuperSelection selection = getSuperSelection(workspace);
uc.add(new AbstractUpdate() {
@Override
public void generateJson(String prefix, PrintWriter pw,
VWorkspace vWorkspace) {
HNodePath currentColumnPath = null;
Worksheet worksheet = workspace.getWorksheet(worksheetId);
List<HNodePath> paths = worksheet.getHeaders().getAllPaths();
for (HNodePath path : paths) {
if (path.getLeaf().getId().equals(hNodeId)) {
currentColumnPath = path;
break;
}
}
SemanticTypeColumnModel model = new SemanticTypeUtil().predictColumnSemanticType(workspace, worksheet, currentColumnPath, 4, selection);
OntologyManager ontMgr = workspace.getOntologyManager();
Alignment alignment = AlignmentManager.Instance().getAlignment(workspace.getId(), worksheetId);
ColumnNode columnNode = alignment.getColumnNodeByHNodeId(hNodeId);
if (columnNode.getLearnedSemanticTypes() == null) {
// do this only one time: if user assigns a semantic type to the column,
// and later clicks on Set Semantic Type button, we should not change the initially learned types
logger.debug("adding learned semantic types to the column " + hNodeId);
columnNode.setLearnedSemanticTypes(new SemanticTypeUtil().getSuggestedTypes(ontMgr, columnNode, model));
if (columnNode.getLearnedSemanticTypes().isEmpty()) {
logger.info("no semantic type learned for the column " + hNodeId);
}
}
JSONObject result;
if(model != null) {
if(classUri == null)
result = model.getAsJSONObject(ontMgr, alignment);
else {
model = new SemanticTypeUtil().predictColumnSemanticType(workspace, worksheet, currentColumnPath, 4, selection);
result = model.getAsJSONObject(classUri, ontMgr, 4);
}
} else {
result = new JSONObject();
result.put("Labels", new JSONArray());
}
pw.println(result.toString());
}
});
return uc;
}
@Override
public UpdateContainer undoIt(Workspace workspace) {
return null;
}
}